/ Hex Artifact Content
Login

Artifact 432c3e22ff76e8ee1caf57ff88ba9f8af1fcfc30:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a  xffff)+1)../*.**
05c0: 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20 61   Values passed a
05d0: 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d 65  s the 5th argume
05e0: 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42 74  nt to allocateBt
05f0: 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64 65  reePage().*/.#de
0600: 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  fine BTALLOC_ANY
0610: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 2f     0           /
0620: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20 70  * Allocate any p
0630: 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 42  age */.#define B
0640: 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20 20  TALLOC_EXACT 1  
0650: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
0660: 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65 20  cate exact page 
0670: 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 23  if possible */.#
0680: 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 4c  define BTALLOC_L
0690: 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20  E    2          
06a0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79   /* Allocate any
06b0: 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61 72   page <= the par
06c0: 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ameter */../*.**
06d0: 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69 74   Macro IfNotOmit
06e0: 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28 78  AV(x) returns (x
06f0: 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ) if SQLITE_OMIT
0700: 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 6e  _AUTOVACUUM is n
0710: 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c 20  ot .** defined, 
0720: 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20 46  or 0 if it is. F
0730: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
0740: 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d 20  *   bIncrVacuum 
0750: 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  = IfNotOmitAV(pB
0760: 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61 63  tShared->incrVac
0770: 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65 66  uum);.*/.#ifndef
0780: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
0790: 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65 20  OVACUUM.#define 
07a0: 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70 72  IfNotOmitAV(expr
07b0: 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a 23  ) (expr).#else.#
07c0: 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69 74  define IfNotOmit
07d0: 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64 69  AV(expr) 0.#endi
07e0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
07f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0800: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74  CHE./*.** A list
0810: 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62 6a   of BtShared obj
0820: 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6c  ects that are el
0830: 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74 69  igible for parti
0840: 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 73  cipation.** in s
0850: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
0860: 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73 20  is variable has 
0870: 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69 6e  file scope durin
0880: 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2c  g normal builds,
0890: 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73 74  .** but the test
08a0: 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20 74   harness needs t
08b0: 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20 77  o access it so w
08c0: 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61 6c  e make it global
08d0: 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62 75   for .** test bu
08e0: 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63 65  ilds..**.** Acce
08f0: 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69 61  ss to this varia
0900: 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65 64  ble is protected
0910: 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45 58   by SQLITE_MUTEX
0920: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e 0a  _STATIC_MASTER..
0930: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
0940: 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20 2a  _TEST.BtShared *
0950: 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74  SQLITE_WSD sqlit
0960: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
0970: 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61  t = 0;.#else.sta
0980: 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53 51  tic BtShared *SQ
0990: 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65 33  LITE_WSD sqlite3
09a0: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20  SharedCacheList 
09b0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64  = 0;.#endif.#end
09c0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
09d0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
09e0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
09f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0a00: 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  CHE./*.** Enable
0a10: 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
0a20: 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e 64  shared pager and
0a30: 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65 73   schema features
0a40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
0a50: 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66 65  tine has no effe
0a60: 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20 64  ct on existing d
0a70: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
0a80: 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72  ons..** The shar
0a90: 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e 67  ed cache setting
0aa0: 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66 75   effects only fu
0ab0: 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  ture calls to.**
0ac0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2c   sqlite3_open(),
0ad0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
0ae0: 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70  ), or sqlite3_op
0af0: 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20  en_v2()..*/.int 
0b00: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
0b10: 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74 20  hared_cache(int 
0b20: 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69 74  enable){.  sqlit
0b30: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
0b40: 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
0b50: 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65  d = enable;.  re
0b60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0b70: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66 64  }.#endif....#ifd
0b80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
0b90: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
0ba0: 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  .  ** The functi
0bb0: 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64 43  ons querySharedC
0bc0: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 2c  acheTableLock(),
0bd0: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
0be0: 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a 2a  ableLock(),.  **
0bf0: 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68 61   and clearAllSha
0c00: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c10: 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75  ks().  ** manipu
0c20: 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  late entries in 
0c30: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
0c40: 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75  ck linked list u
0c50: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a  sed to store.  *
0c60: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
0c70: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73  able level locks
0c80: 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79  . If the library
0c90: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
0ca0: 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65  h the.  ** share
0cb0: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
0cc0: 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
0cd0: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
0ce0: 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20  r one user.  ** 
0cf0: 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64  of each BtShared
0d00: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73   structure and s
0d10: 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69  o this locking i
0d20: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
0d30: 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65   .  ** So define
0d40: 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65   the lock relate
0d50: 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e  d functions as n
0d60: 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64  o-ops..  */.  #d
0d70: 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72 65  efine queryShare
0d80: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0d90: 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b  a,b,c) SQLITE_OK
0da0: 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53 68  .  #define setSh
0db0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0dc0: 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45  ck(a,b,c) SQLITE
0dd0: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63 6c  _OK.  #define cl
0de0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0df0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e00: 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72 61   #define downgra
0e10: 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
0e20: 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20 20  TableLocks(a).  
0e30: 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72 65  #define hasShare
0e40: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0e50: 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64 65  a,b,c,d) 1.  #de
0e60: 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e 66  fine hasReadConf
0e70: 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23 65  licts(a, b) 0.#e
0e80: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0e90: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0ea0: 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20 53  _CACHE..#ifdef S
0eb0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
0ec0: 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  *** This functio
0ed0: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
0ee0: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73  s part of an ass
0ef0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2e  ert() statement.
0f00: 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b   ***.**.** Check
0f10: 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72 65   to see if pBtre
0f20: 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71 75  e holds the requ
0f30: 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72 65  ired locks to re
0f40: 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74  ad or write to t
0f50: 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69 74  he .** table wit
0f60: 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f  h root page iRoo
0f70: 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69 66  t.   Return 1 if
0f80: 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20 69   it does and 0 i
0f90: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  f not..**.** For
0fa0: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 77   example, when w
0fb0: 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c  riting to a tabl
0fc0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
0fd0: 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20 42   iRoot via .** B
0fe0: 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  tree connection 
0ff0: 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  pBtree:.**.**   
1000: 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
1010: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1020: 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c 20  (pBtree, iRoot, 
1030: 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 29  0, WRITE_LOCK) )
1040: 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72 69  ;.**.** When wri
1050: 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78  ting to an index
1060: 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69 6e   that resides in
1070: 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74 61   a sharable data
1080: 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63 61  base, the .** ca
1090: 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65  ller should have
10a0: 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64 20   first obtained 
10b0: 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69 6e  a lock specifyin
10c0: 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  g the root page 
10d0: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73  of.** the corres
10e0: 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20 54  ponding table. T
10f0: 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67 73  his makes things
1100: 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d 70   a bit more comp
1110: 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20 74  licated,.** as t
1120: 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61 74  his module treat
1130: 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73 20  s each table as 
1140: 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75 63  a separate struc
1150: 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d 69  ture. To determi
1160: 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  ne.** the table 
1170: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
1180: 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
1190: 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a 2a   written, this.*
11a0: 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74  * function has t
11b0: 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67 68  o search through
11c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
11d0: 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  hema..**.** Inst
11e0: 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f 6e  ead of a lock on
11f0: 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
1200: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1210: 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c 65  iRoot, the calle
1220: 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61 20  r may.** hold a 
1230: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
1240: 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20 28  e schema table (
1250: 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54 68  root page 1). Th
1260: 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61 63  is is also.** ac
1270: 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ceptable..*/.sta
1280: 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72 65  tic int hasShare
1290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
12a0: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
12b0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e  ,         /* Han
12c0: 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68 6f  dle that must ho
12d0: 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67 6e  ld lock */.  Pgn
12e0: 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20  o iRoot,        
12f0: 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
1300: 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20   of b-tree */.  
1310: 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20 20  int isIndex,    
1320: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1330: 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20 72  f iRoot is the r
1340: 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  oot of an index 
1350: 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  b-tree */.  int 
1360: 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20 20  eLockType       
1370: 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6c     /* Required l
1380: 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f 4c  ock type (READ_L
1390: 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43  OCK or WRITE_LOC
13a0: 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65 6d  K) */.){.  Schem
13b0: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53 63  a *pSchema = (Sc
13c0: 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e 70  hema *)pBtree->p
13d0: 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 50  Bt->pSchema;.  P
13e0: 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20 20  gno iTab = 0;.  
13f0: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a  BtLock *pLock;..
1400: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
1410: 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68 61  abase is not sha
1420: 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74 68  reable, or if th
1430: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1440: 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61 73  ing.  ** and has
1450: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
1460: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20  itted flag set, 
1470: 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73 20  then no lock is 
1480: 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a 20  required. .  ** 
1490: 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d 65  Return true imme
14a0: 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  diately..  */.  
14b0: 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68 61  if( (pBtree->sha
14c0: 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c 20  rable==0).   || 
14d0: 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41 44  (eLockType==READ
14e0: 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65 65  _LOCK && (pBtree
14f0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1500: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1510: 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20 20  tted)).  ){.    
1520: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
1530: 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65 6e   /* If the clien
1540: 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f 72  t is reading  or
1550: 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64 65   writing an inde
1560: 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61  x and the schema
1570: 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f 61   is.  ** not loa
1580: 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ded, then it is 
1590: 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74 6f  too difficult to
15a0: 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b 20   actually check 
15b0: 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20 74  to see if.  ** t
15c0: 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 73  he correct locks
15d0: 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20 64   are held.  So d
15e0: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20 6a  o not bother - j
15f0: 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e  ust return true.
1600: 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65 20  .  ** This case 
1610: 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75 70  does not come up
1620: 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79 68   very often anyh
1630: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ow..  */.  if( i
1640: 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63 68  sIndex && (!pSch
1650: 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61 2d  ema || (pSchema-
1660: 3e 66 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61  >flags&DB_Schema
1670: 4c 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20  Loaded)==0) ){. 
1680: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1690: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
16a0: 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  t the root-page 
16b0: 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68  that the lock sh
16c0: 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e  ould be held on.
16d0: 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20   For table.  ** 
16e0: 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73  b-trees, this is
16f0: 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70   just the root p
1700: 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
1710: 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a  e being read or.
1720: 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f    ** written. Fo
1730: 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c  r index b-trees,
1740: 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
1750: 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f  page of the asso
1760: 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c  ciated.  ** tabl
1770: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49  e.  */.  if( isI
1780: 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68  ndex ){.    Hash
1790: 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72  Elem *p;.    for
17a0: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
17b0: 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78  st(&pSchema->idx
17c0: 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69  Hash); p; p=sqli
17d0: 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a  teHashNext(p)){.
17e0: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
17f0: 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c  x = (Index *)sql
1800: 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a  iteHashData(p);.
1810: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
1820: 74 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74  tnum==(int)iRoot
1830: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 61 62   ){.        iTab
1840: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
1850: 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  >tnum;.      }. 
1860: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1870: 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a    iTab = iRoot;.
1880: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68    }..  /* Search
1890: 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65   for the require
18a0: 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61  d lock. Either a
18b0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72   write-lock on r
18c0: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61  oot-page iTab, a
18d0: 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63   .  ** write-loc
18e0: 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20  k on the schema 
18f0: 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68  table, or (if th
1900: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1910: 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64  ing) a.  ** read
1920: 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69  -lock on iTab wi
1930: 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75  ll suffice. Retu
1940: 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74  rn 1 if any of t
1950: 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20  hese are found. 
1960: 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d   */.  for(pLock=
1970: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f  pBtree->pBt->pLo
1980: 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  ck; pLock; pLock
1990: 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a  =pLock->pNext){.
19a0: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70      if( pLock->p
19b0: 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20  Btree==pBtree . 
19c0: 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69      && (pLock->i
19d0: 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28  Table==iTab || (
19e0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pLock->eLock==WR
19f0: 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63  ITE_LOCK && pLoc
1a00: 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20  k->iTable==1)). 
1a10: 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c      && pLock->eL
1a20: 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a  ock>=eLockType .
1a30: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1a40: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1a50: 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f  ..  /* Failed to
1a60: 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72   find the requir
1a70: 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65  ed lock. */.  re
1a80: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1a90: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
1aa0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
1ab0: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a  TE_DEBUG./*.****
1ac0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
1ad0: 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61  ay be used as pa
1ae0: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  rt of assert() s
1af0: 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20  tatements only. 
1b00: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ****.**.** Retur
1b10: 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75  n true if it wou
1b20: 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f  ld be illegal fo
1b30: 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74  r pBtree to writ
1b40: 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61  e into the.** ta
1b50: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f  ble or index roo
1b60: 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63  ted at iRoot bec
1b70: 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65  ause other share
1b80: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  d connections ar
1b90: 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75  e.** simultaneou
1ba0: 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74  sly reading that
1bb0: 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69   same table or i
1bc0: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ndex..**.** It i
1bd0: 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42  s illegal for pB
1be0: 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66  tree to write if
1bf0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65   some other Btre
1c00: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  e object that.**
1c10: 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65   shares the same
1c20: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
1c30: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65   is currently re
1c40: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1c50: 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61  .** the iRoot ta
1c60: 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66  ble.  Except, if
1c70: 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65   the other Btree
1c80: 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a   object has the.
1c90: 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  ** read-uncommit
1ca0: 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68  ted flag set, th
1cb0: 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20  en it is OK for 
1cc0: 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74  the other object
1cd0: 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65   to.** have a re
1ce0: 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  ad cursor..**.**
1cf0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65   For example, be
1d00: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
1d10: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1d20: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a  table or index.*
1d30: 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  * rooted at page
1d40: 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75   iRoot, one shou
1d50: 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20  ld call:.**.**  
1d60: 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65    assert( !hasRe
1d70: 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72  adConflicts(pBtr
1d80: 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f  ee, iRoot) );.*/
1d90: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52  .static int hasR
1da0: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72  eadConflicts(Btr
1db0: 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f  ee *pBtree, Pgno
1dc0: 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72   iRoot){.  BtCur
1dd0: 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  sor *p;.  for(p=
1de0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
1df0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
1e00: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  ext){.    if( p-
1e10: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
1e20: 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74   .     && p->pBt
1e30: 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20  ree!=pBtree.    
1e40: 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65   && 0==(p->pBtre
1e50: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1e60: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1e70: 69 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20  itted).    ){.  
1e80: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1e90: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1ea0: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20   0;.}.#endif    
1eb0: 2f 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  /* #ifdef SQLITE
1ec0: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
1ed0: 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66   Query to see if
1ee0: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20   Btree handle p 
1ef0: 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63  may obtain a loc
1f00: 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20  k of type eLock 
1f10: 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f  .** (READ_LOCK o
1f20: 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e  r WRITE_LOCK) on
1f30: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
1f40: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20  root-page iTab. 
1f50: 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  Return.** SQLITE
1f60: 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  _OK if the lock 
1f70: 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20  may be obtained 
1f80: 28 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  (by calling.** s
1f90: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
1fa0: 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51  leLock()), or SQ
1fb0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e  LITE_LOCKED if n
1fc0: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
1fd0: 74 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  t querySharedCac
1fe0: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65  heTableLock(Btre
1ff0: 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c  e *p, Pgno iTab,
2000: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2010: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2020: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2030: 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  pIter;..  assert
2040: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2050: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2060: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2070: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  READ_LOCK || eLo
2080: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  ck==WRITE_LOCK )
2090: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
20a0: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
20b0: 28 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  ( !(p->db->flags
20c0: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
20d0: 6d 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d  mmitted)||eLock=
20e0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61  =WRITE_LOCK||iTa
20f0: 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  b==1 );.  .  /* 
2100: 49 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  If requesting a 
2110: 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e  write-lock, then
2120: 20 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20   the Btree must 
2130: 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
2140: 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  te.  ** transact
2150: 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ion on this file
2160: 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79  . And, obviously
2170: 2c 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65  , for this to be
2180: 20 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20   so there .  ** 
2190: 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20  must be an open 
21a0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
21b0: 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74  n on the file it
21c0: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  self..  */.  ass
21d0: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
21e0: 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74  _LOCK || (p==pBt
21f0: 2d 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e  ->pWriter && p->
2200: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
2210: 52 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72  RITE) );.  asser
2220: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2230: 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  OCK || pBt->inTr
2240: 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
2250: 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f  _WRITE );.  .  /
2260: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2270: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
2280: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73   shared-cache is
2290: 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   not enabled */.
22a0: 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
22b0: 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  le ){.    return
22c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
22d0: 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74  .  /* If some ot
22e0: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  her connection i
22f0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63  s holding an exc
2300: 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65  lusive lock, the
2310: 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20  .  ** requested 
2320: 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20  lock may not be 
2330: 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20  obtained..  */. 
2340: 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65   if( pBt->pWrite
2350: 72 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74  r!=p && (pBt->bt
2360: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43  sFlags & BTS_EXC
2370: 4c 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20  LUSIVE)!=0 ){.  
2380: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2390: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
23a0: 2c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  , pBt->pWriter->
23b0: 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  db);.    return 
23c0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
23d0: 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a  AREDCACHE;.  }..
23e0: 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
23f0: 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
2400: 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
2410: 74 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  t){.    /* The c
2420: 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d  ondition (pIter-
2430: 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69  >eLock!=eLock) i
2440: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
2450: 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20  if(...) .    ** 
2460: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73  statement is a s
2470: 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66  implification of
2480: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
2490: 20 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f    (eLock==WRITE_
24a0: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
24b0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
24c0: 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
24d0: 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68  since we know th
24e0: 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49  at if eLock==WRI
24f0: 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f  TE_LOCK, then no
2500: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
2510: 6e 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c  n.    ** may hol
2520: 64 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f  d a WRITE_LOCK o
2530: 6e 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74  n any table in t
2540: 68 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20  his file (since 
2550: 74 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a  there can.    **
2560: 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c   only be a singl
2570: 65 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a  e writer)..    *
2580: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  /.    assert( pI
2590: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44  ter->eLock==READ
25a0: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  _LOCK || pIter->
25b0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
25c0: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
25d0: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
25e0: 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72  K || pIter->pBtr
25f0: 65 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e  ee==p || pIter->
2600: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2610: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
2620: 2d 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70  ->pBtree!=p && p
2630: 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Iter->iTable==iT
2640: 61 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f  ab && pIter->eLo
2650: 63 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck!=eLock ){.   
2660: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
2670: 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
2680: 62 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  b, pIter->pBtree
2690: 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ->db);.      if(
26a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
26b0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  CK ){.        as
26c0: 73 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57  sert( p==pBt->pW
26d0: 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20  riter );.       
26e0: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
26f0: 3d 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20  = BTS_PENDING;. 
2700: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2710: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
2720: 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
2730: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2740: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
2750: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
2760: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2770: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
2780: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
2790: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64  D_CACHE./*.** Ad
27a0: 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  d a lock on the 
27b0: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
27c0: 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74  page iTable to t
27d0: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  he shared-btree 
27e0: 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65  used.** by Btree
27f0: 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d   handle p. Param
2800: 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20  eter eLock must 
2810: 62 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c  be either READ_L
2820: 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45  OCK or .** WRITE
2830: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  _LOCK..**.** Thi
2840: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
2850: 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
2860: 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68  :.**.**   (a) Th
2870: 65 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65  e specified Btre
2880: 65 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f  e object p is co
2890: 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61  nnected to a sha
28a0: 72 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64  rable.**       d
28b0: 61 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74  atabase (one wit
28c0: 68 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73  h the BtShared.s
28d0: 68 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74  harable flag set
28e0: 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28  ), and.**.**   (
28f0: 62 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65  b) No other Btre
2900: 65 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61  e objects hold a
2910: 20 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c   lock that confl
2920: 69 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69  icts.**       wi
2930: 74 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64  th the requested
2940: 20 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72   lock (i.e. quer
2950: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
2960: 65 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20  eLock() has.**  
2970: 20 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65       already bee
2980: 6e 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74  n called and ret
2990: 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29  urned SQLITE_OK)
29a0: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
29b0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
29c0: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64   the lock is add
29d0: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
29e0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a   SQLITE_NOMEM .*
29f0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
2a00: 20 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70   a malloc attemp
2a10: 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  t fails..*/.stat
2a20: 69 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64  ic int setShared
2a30: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42  CacheTableLock(B
2a40: 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54  tree *p, Pgno iT
2a50: 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b  able, u8 eLock){
2a60: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2a70: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
2a80: 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a  ock *pLock = 0;.
2a90: 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
2aa0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2ab0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
2ac0: 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
2ad0: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2ae0: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  OCK || eLock==WR
2af0: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ITE_LOCK );.  as
2b00: 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29  sert( p->db!=0 )
2b10: 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63  ;..  /* A connec
2b20: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65  tion with the re
2b30: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
2b40: 6c 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76  lag set will nev
2b50: 65 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f  er try to.  ** o
2b60: 62 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63  btain a read-loc
2b70: 6b 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e  k using this fun
2b80: 63 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20  ction. The only 
2b90: 72 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e  read-lock obtain
2ba0: 65 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e  ed.  ** by a con
2bb0: 6e 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d  nection in read-
2bc0: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65  uncommitted mode
2bd0: 20 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74   is on the sqlit
2be0: 65 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74  e_master .  ** t
2bf0: 61 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c  able, and that l
2c00: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
2c10: 69 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61  in BtreeBeginTra
2c20: 6e 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ns().  */.  asse
2c30: 72 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66  rt( 0==(p->db->f
2c40: 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64  lags&SQLITE_Read
2c50: 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20  Uncommitted) || 
2c60: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
2c70: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  K );..  /* This 
2c80: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
2c90: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f  only be called o
2ca0: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74  n a sharable b-t
2cb0: 72 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20  ree after it .  
2cc0: 2a 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65  ** has been dete
2cd0: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f  rmined that no o
2ce0: 74 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64  ther b-tree hold
2cf0: 73 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20  s a conflicting 
2d00: 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65  lock.  */.  asse
2d10: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
2d20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
2d30: 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61  ITE_OK==querySha
2d40: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2d50: 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f  k(p, iTable, eLo
2d60: 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72  ck) );..  /* Fir
2d70: 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69  st search the li
2d80: 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  st for an existi
2d90: 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20  ng lock on this 
2da0: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28  table. */.  for(
2db0: 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
2dc0: 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
2dd0: 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
2de0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61    if( pIter->iTa
2df0: 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
2e00: 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Iter->pBtree==p 
2e10: 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d  ){.      pLock =
2e20: 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72   pIter;.      br
2e30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
2e40: 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76    /* If the abov
2e50: 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74  e search did not
2e60: 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73   find a BtLock s
2e70: 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e  truct associatin
2e80: 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77  g Btree p.  ** w
2e90: 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65  ith table iTable
2ea0: 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61  , allocate one a
2eb0: 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20  nd link it into 
2ec0: 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  the list..  */. 
2ed0: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
2ee0: 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f     pLock = (BtLo
2ef0: 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  ck *)sqlite3Mall
2f00: 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
2f10: 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20  Lock));.    if( 
2f20: 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  !pLock ){.      
2f30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2f40: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
2f50: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Lock->iTable = i
2f60: 54 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b  Table;.    pLock
2f70: 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
2f80: 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d    pLock->pNext =
2f90: 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
2fa0: 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c   pBt->pLock = pL
2fb0: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ock;.  }..  /* S
2fc0: 65 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c  et the BtLock.eL
2fd0: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
2fe0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74  the maximum of t
2ff0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a  he current lock.
3000: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71    ** and the req
3010: 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69  uested lock. Thi
3020: 73 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69  s means if a wri
3030: 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65  te-lock was alre
3040: 61 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e  ady held.  ** an
3050: 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65  d a read-lock re
3060: 71 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27  quested, we don'
3070: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f  t incorrectly do
3080: 77 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b  wngrade the lock
3090: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
30a0: 20 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44   WRITE_LOCK>READ
30b0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65  _LOCK );.  if( e
30c0: 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  Lock>pLock->eLoc
30d0: 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  k ){.    pLock->
30e0: 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20  eLock = eLock;. 
30f0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
3100: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
3110: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
3120: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
3130: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3140: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3150: 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  HE./*.** Release
3160: 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c   all the table l
3170: 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61  ocks (locks obta
3180: 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74  ined via calls t
3190: 6f 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72  o.** the setShar
31a0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
31b0: 28 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65  () procedure) he
31c0: 6c 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65  ld by Btree obje
31d0: 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ct p..**.** This
31e0: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
31f0: 73 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68  s that Btree p h
3200: 61 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20  as an open read 
3210: 6f 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61  or write .** tra
3220: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20  nsaction. If it 
3230: 64 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74  does not, then t
3240: 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66  he BTS_PENDING f
3250: 6c 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e  lag.** may be in
3260: 63 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65  correctly cleare
3270: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
3280: 64 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64  d clearAllShared
3290: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
32a0: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
32b0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
32c0: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a  pBt;.  BtLock **
32d0: 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70  ppIter = &pBt->p
32e0: 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lock;..  assert(
32f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
3300: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
3310: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
3320: 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ble || 0==*ppIte
3330: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
3340: 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a  ->inTrans>0 );..
3350: 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72    while( *ppIter
3360: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
3370: 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b  pLock = *ppIter;
3380: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
3390: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
33a0: 53 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20  S_EXCLUSIVE)==0 
33b0: 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d  || pBt->pWriter=
33c0: 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29  =pLock->pBtree )
33d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
33e0: 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54  ock->pBtree->inT
33f0: 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f  rans>=pLock->eLo
3400: 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ck );.    if( pL
3410: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ock->pBtree==p )
3420: 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20  {.      *ppIter 
3430: 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLock->pNext;.
3440: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
3450: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c  ock->iTable!=1 |
3460: 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63  | pLock==&p->loc
3470: 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  k );.      if( p
3480: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20  Lock->iTable!=1 
3490: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
34a0: 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  e3_free(pLock);.
34b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
34c0: 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20  e{.      ppIter 
34d0: 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b  = &pLock->pNext;
34e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
34f0: 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46  sert( (pBt->btsF
3500: 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49  lags & BTS_PENDI
3510: 4e 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  NG)==0 || pBt->p
3520: 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20  Writer );.  if( 
3530: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20  pBt->pWriter==p 
3540: 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69  ){.    pBt->pWri
3550: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ter = 0;.    pBt
3560: 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28  ->btsFlags &= ~(
3570: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54  BTS_EXCLUSIVE|BT
3580: 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65  S_PENDING);.  }e
3590: 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72  lse if( pBt->nTr
35a0: 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a  ansaction==2 ){.
35b0: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
35c0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
35d0: 68 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63  hen Btree p is c
35e0: 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20  oncluding its . 
35f0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
3600: 6e 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72  n. If there curr
3610: 65 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77  ently exists a w
3620: 72 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20  riter, and p is 
3630: 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  not.    ** that 
3640: 77 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65  writer, then the
3650: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   number of locks
3660: 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
3670: 69 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a  ions other.    *
3680: 2a 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65  * than the write
3690: 72 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20  r must be about 
36a0: 74 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e  to drop to zero.
36b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20   In this case.  
36c0: 20 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53    ** set the BTS
36d0: 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f  _PENDING flag to
36e0: 20 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   0..    **.    *
36f0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
3700: 74 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72  t currently a wr
3710: 69 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50  iter, then BTS_P
3720: 45 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20  ENDING must.    
3730: 2a 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61  ** be zero alrea
3740: 64 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74  dy. So this next
3750: 20 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73   line is harmles
3760: 73 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a  s in that case..
3770: 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e      */.    pBt->
3780: 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
3790: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a  _PENDING;.  }.}.
37a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
37b0: 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c  tion changes all
37c0: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c   write-locks hel
37d0: 64 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74  d by Btree p int
37e0: 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f  o read-locks..*/
37f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77  .static void dow
3800: 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
3810: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3820: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
3830: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
3840: 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  Bt;.  if( pBt->p
3850: 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20  Writer==p ){.   
3860: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
3870: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3880: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3890: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
38a0: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
38b0: 45 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72  ENDING);.    for
38c0: 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63  (pLock=pBt->pLoc
38d0: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
38e0: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
38f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3900: 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  ck->eLock==READ_
3910: 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70  LOCK || pLock->p
3920: 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20  Btree==p );.    
3930: 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d    pLock->eLock =
3940: 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20   READ_LOCK;.    
3950: 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20  }.  }.}..#endif 
3960: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
3970: 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a  HARED_CACHE */..
3980: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
3990: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
39a0: 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72  *pPage);  /* For
39b0: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
39c0: 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73  /../*.***** This
39d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
39e0: 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72   inside of asser
39f0: 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a  t() only ****.**
3a00: 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  .** Verify that 
3a10: 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73  the cursor holds
3a20: 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74   the mutex on it
3a30: 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69  s BtShared.*/.#i
3a40: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
3a50: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72  G.static int cur
3a60: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74  sorHoldsMutex(Bt
3a70: 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65  Cursor *p){.  re
3a80: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
3a90: 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
3aa0: 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66  mutex);.}.#endif
3ab0: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
3ac0: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
3ad0: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
3ae0: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
3af0: 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f  ge-list cache fo
3b00: 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20 69  r cursor pCur, i
3b10: 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  f any..*/.static
3b20: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3b30: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74  OverflowCache(Bt
3b40: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
3b50: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
3b60: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
3b70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3b80: 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
3b90: 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76 65  w);.  pCur->aOve
3ba0: 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  rflow = 0;.}../*
3bb0: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
3bc0: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
3bd0: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
3be0: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
3bf0: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
3c00: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
3c10: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
3c20: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
3c30: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
3c40: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
3c50: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
3c60: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
3c70: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3c80: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
3c90: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
3ca0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
3cb0: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
3cc0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3cd0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
3ce0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
3cf0: 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
3d00: 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f  modifying the co
3d10: 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62 6c  ntents of a tabl
3d20: 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61  e.** to invalida
3d30: 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20  te any incrblob 
3d40: 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  cursors that are
3d50: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20   open on the.** 
3d60: 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  row or one of th
3d70: 65 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64  e rows being mod
3d80: 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ified..**.** If 
3d90: 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72  argument isClear
3da0: 54 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20 74  Table is true, t
3db0: 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20 63  hen the entire c
3dc0: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
3dd0: 2a 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75 74  * table is about
3de0: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20   to be deleted. 
3df0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3e00: 61 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63 72  alidate all incr
3e10: 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20  blob.** cursors 
3e20: 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20  open on any row 
3e30: 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65  within the table
3e40: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
3e50: 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20  pgnoRoot..**.** 
3e60: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 72  Otherwise, if ar
3e70: 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61  gument isClearTa
3e80: 62 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74 68  ble is false, th
3e90: 65 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 0a  en the row with.
3ea0: 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69 73  ** rowid iRow is
3eb0: 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20   being replaced 
3ec0: 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74  or deleted. In t
3ed0: 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64  his case invalid
3ee0: 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73  ate.** only thos
3ef0: 65 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f  e incrblob curso
3f00: 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20  rs open on that 
3f10: 73 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f  specific row..*/
3f20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76  .static void inv
3f30: 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
3f40: 75 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65 20  ursors(.  Btree 
3f50: 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20  *pBtree,        
3f60: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
3f70: 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20  e file to check 
3f80: 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20  */.  i64 iRow,  
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3fa0: 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d  The rowid that m
3fb0: 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67  ight be changing
3fc0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61   */.  int isClea
3fd0: 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a  rTable        /*
3fe0: 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77   True if all row
3ff0: 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65  s are being dele
4000: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75  ted */.){.  BtCu
4010: 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61  rsor *p;.  BtSha
4020: 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65  red *pBt = pBtre
4030: 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  e->pBt;.  assert
4040: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
4050: 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29  ldsMutex(pBtree)
4060: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
4070: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
4080: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
4090: 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  ( p->isIncrblobH
40a0: 61 6e 64 6c 65 20 26 26 20 28 69 73 43 6c 65 61  andle && (isClea
40b0: 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66  rTable || p->inf
40c0: 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29 7b  o.nKey==iRow) ){
40d0: 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65  .      p->eState
40e0: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
40f0: 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  D;.    }.  }.}..
4100: 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62 20  #else.  /* Stub 
4110: 66 75 6e 63 74 69 6f 6e 73 20 77 68 65 6e 20 49  functions when I
4120: 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74 74  NCRBLOB is omitt
4130: 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  ed */.  #define 
4140: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
4150: 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64 65  owCache(x).  #de
4160: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 41  fine invalidateA
4170: 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
4180: 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76  x).  #define inv
4190: 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
41a0: 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23 65  ursors(x,y,z).#e
41b0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
41c0: 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a  MIT_INCRBLOB */.
41d0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70  ./*.** Set bit p
41e0: 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61  gno of the BtSha
41f0: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4200: 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20  bitvec. This is 
4210: 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20  called .** when 
4220: 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76  a page that prev
4230: 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64  iously contained
4240: 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20   data becomes a 
4250: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a  free-list leaf .
4260: 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ** page..**.** T
4270: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
4280: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65  Content bitvec e
4290: 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72  xists to work ar
42a0: 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a  ound an obscure.
42b0: 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79  ** bug caused by
42c0: 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e   the interaction
42d0: 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49   of two useful I
42e0: 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  O optimizations 
42f0: 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66  surrounding.** f
4300: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
4310: 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  ges:.**.**   1) 
4320: 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73  When all data is
4330: 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20   deleted from a 
4340: 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67  page and the pag
4350: 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20  e becomes.**    
4360: 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65    a free-list le
4370: 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67  af page, the pag
4380: 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e  e is not written
4390: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
43a0: 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65  .**      (as fre
43b0: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
43c0: 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61  s contain no mea
43d0: 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53  ningful data). S
43e0: 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20  ometimes.**     
43f0: 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20   such a page is 
4400: 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c  not even journal
4410: 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20  led (as it will 
4420: 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c  not be modified,
4430: 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74  .**      why bot
4440: 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20  her journalling 
4450: 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  it?)..**.**   2)
4460: 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   When a free-lis
4470: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4480: 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65  eused, its conte
4490: 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a  nt is not read.*
44a0: 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20  *      from the 
44b0: 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74  database or writ
44c0: 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
44d0: 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f  al file (why sho
44e0: 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62  uld it.**      b
44f0: 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e, if it is not 
4500: 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75  at all meaningfu
4510: 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68  l?)..**.** By th
4520: 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20  emselves, these 
4530: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f  optimizations wo
4540: 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76  rk fine and prov
4550: 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70  ide a handy.** p
4560: 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74  erformance boost
4570: 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20   to bulk delete 
4580: 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74  or insert operat
4590: 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69  ions. However, i
45a0: 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d  f.** a page is m
45b0: 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
45c0: 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72  -list and then r
45d0: 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65  eused within the
45e0: 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63   same.** transac
45f0: 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20  tion, a problem 
4600: 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65  comes up. If the
4610: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75   page is not jou
4620: 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20  rnalled when.** 
4630: 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74  it is moved to t
4640: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4650: 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20   it is also not 
4660: 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20  journalled when 
4670: 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74  it.** is extract
4680: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
4690: 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64  -list and reused
46a0: 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69  , then the origi
46b0: 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20  nal data.** may 
46c0: 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20  be lost. In the 
46d0: 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62  event of a rollb
46e0: 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20  ack, it may not 
46f0: 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74  be possible.** t
4700: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
4710: 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
4720: 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61  iginal configura
4730: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
4740: 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20  solution is the 
4750: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4760: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65  tent bitvec. Whe
4770: 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20  never a page is 
4780: 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63  .** moved to bec
4790: 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20  ome a free-list 
47a0: 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63  leaf page, the c
47b0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
47c0: 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68   is.** set in th
47d0: 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76  e bitvec. Whenev
47e0: 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69  er a leaf page i
47f0: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
4800: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a   the free-list,.
4810: 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ** optimization 
4820: 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74  2 above is omitt
4830: 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73  ed if the corres
4840: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61  ponding bit is a
4850: 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e  lready.** set in
4860: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4870: 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65  ntent. The conte
4880: 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65  nts of the bitve
4890: 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a  c are cleared.**
48a0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
48b0: 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  very transaction
48c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
48d0: 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
48e0: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
48f0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
4900: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4910: 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  OK;.  if( !pBt->
4920: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
4930: 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c     assert( pgno<
4940: 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20  =pBt->nPage );. 
4950: 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74     pBt->pHasCont
4960: 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74  ent = sqlite3Bit
4970: 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e  vecCreate(pBt->n
4980: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Page);.    if( !
4990: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
49a0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
49b0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
49c0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
49d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67  =SQLITE_OK && pg
49e0: 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76 65  no<=sqlite3Bitve
49f0: 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73 43  cSize(pBt->pHasC
4a00: 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20 72  ontent) ){.    r
4a10: 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
4a20: 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43 6f  cSet(pBt->pHasCo
4a30: 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  ntent, pgno);.  
4a40: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4a50: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68  ../*.** Query th
4a60: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4a70: 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a  ontent vector..*
4a80: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
4a90: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
4aa0: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
4ab0: 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f 76  af page is remov
4ac0: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66  ed from the.** f
4ad0: 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65 75  ree-list for reu
4ae0: 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 66  se. It returns f
4af0: 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 61  alse if it is sa
4b00: 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  fe to retrieve t
4b10: 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20  he.** page from 
4b20: 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
4b30: 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e  with the 'no-con
4b40: 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20  tent' flag set. 
4b50: 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  True otherwise..
4b60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
4b70: 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
4b80: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
4b90: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69  Pgno pgno){.  Bi
4ba0: 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70  tvec *p = pBt->p
4bb0: 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65  HasContent;.  re
4bc0: 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e 6f  turn (p && (pgno
4bd0: 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69  >sqlite3BitvecSi
4be0: 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65 33  ze(p) || sqlite3
4bf0: 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70 67  BitvecTest(p, pg
4c00: 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  no)));.}../*.** 
4c10: 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29 20  Clear (destroy) 
4c20: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4c30: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4c40: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 0a   This should be.
4c50: 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  ** invoked at th
4c60: 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
4c70: 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e 73  each write-trans
4c80: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
4c90: 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65 61  c void btreeClea
4ca0: 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  rHasContent(BtSh
4cb0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
4cc0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
4cd0: 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  oy(pBt->pHasCont
4ce0: 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61  ent);.  pBt->pHa
4cf0: 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a  sContent = 0;.}.
4d00: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
4d10: 6c 6c 20 6f 66 20 74 68 65 20 61 70 50 61 67 65  ll of the apPage
4d20: 5b 5d 20 70 61 67 65 73 20 66 6f 72 20 61 20 63  [] pages for a c
4d30: 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ursor..*/.static
4d40: 20 76 6f 69 64 20 62 74 72 65 65 52 65 6c 65 61   void btreeRelea
4d50: 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73  seAllCursorPages
4d60: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
4d70: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
4d80: 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=0; i<=pCur->i
4d90: 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
4da0: 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
4db0: 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
4dc0: 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69    pCur->apPage[i
4dd0: 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 43 75  ] = 0;.  }.  pCu
4de0: 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 7d  r->iPage = -1;.}
4df0: 0a 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68  .../*.** Save th
4e00: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
4e10: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65   position in the
4e20: 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72   variables BtCur
4e30: 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64  sor.nKey .** and
4e40: 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20   BtCursor.pKey. 
4e50: 54 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61  The cursor's sta
4e60: 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  te is set to CUR
4e70: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e  SOR_REQUIRESEEK.
4e80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
4e90: 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
4ea0: 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
4eb0: 20 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61   valid (has eSta
4ec0: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
4ed0: 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61  ).** prior to ca
4ee0: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
4ef0: 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ne.  .*/.static 
4f00: 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f  int saveCursorPo
4f10: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
4f20: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
4f30: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  ;..  assert( CUR
4f40: 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
4f50: 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73  >eState );.  ass
4f60: 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b  ert( 0==pCur->pK
4f70: 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ey );.  assert( 
4f80: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
4f90: 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20  (pCur) );..  rc 
4fa0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
4fb0: 79 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75  ySize(pCur, &pCu
4fc0: 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20 61 73 73 65  r->nKey);.  asse
4fd0: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
4fe0: 4b 20 29 3b 20 20 2f 2a 20 4b 65 79 53 69 7a 65  K );  /* KeySize
4ff0: 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a  () cannot fail *
5000: 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  /..  /* If this 
5010: 69 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62  is an intKey tab
5020: 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f  le, then the abo
5030: 76 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65  ve call to Btree
5040: 4b 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73  KeySize().  ** s
5050: 74 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67 65  tores the intege
5060: 72 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e  r key in pCur->n
5070: 4b 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73  Key. In this cas
5080: 65 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a  e this value is.
5090: 20 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73    ** all that is
50a0: 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72   required. Other
50b0: 77 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73  wise, if pCur is
50c0: 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20   not open on an 
50d0: 69 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c  intKey.  ** tabl
50e0: 65 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73  e, then malloc s
50f0: 70 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f  pace for and sto
5100: 72 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65  re the pCur->nKe
5110: 79 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a  y bytes of key .
5120: 20 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a    ** data..  */.
5130: 20 20 69 66 28 20 30 3d 3d 70 43 75 72 2d 3e 61    if( 0==pCur->a
5140: 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
5150: 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b   ){.    void *pK
5160: 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ey = sqlite3Mall
5170: 6f 63 28 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e  oc( (int)pCur->n
5180: 4b 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Key );.    if( p
5190: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Key ){.      rc 
51a0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
51b0: 79 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29  y(pCur, 0, (int)
51c0: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79  pCur->nKey, pKey
51d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
51e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
51f0: 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79        pCur->pKey
5200: 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d   = pKey;.      }
5210: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
5220: 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29  lite3_free(pKey)
5230: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
5240: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
5250: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
5260: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
5270: 28 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ( !pCur->apPage[
5280: 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70  0]->intKey || !p
5290: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20  Cur->pKey );..  
52a0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
52b0: 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65  K ){.    btreeRe
52c0: 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61  leaseAllCursorPa
52d0: 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70  ges(pCur);.    p
52e0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
52f0: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5300: 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64  ;.  }..  invalid
5310: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
5320: 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
5330: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61   rc;.}../*.** Sa
5340: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
5350: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
5360: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
5370: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
5380: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 20  n.** the table  
5390: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69  with root-page i
53a0: 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20 74  Root. Usually, t
53b0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6a 75  his is called ju
53c0: 73 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72  st before cursor
53d0: 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73 20 75  .** pExcept is u
53e0: 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  sed to modify th
53f0: 65 20 74 61 62 6c 65 20 28 42 74 72 65 65 44 65  e table (BtreeDe
5400: 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65 49  lete() or BtreeI
5410: 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74 61  nsert())..*/.sta
5420: 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43  tic int saveAllC
5430: 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20  ursors(BtShared 
5440: 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74  *pBt, Pgno iRoot
5450: 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63  , BtCursor *pExc
5460: 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  ept){.  BtCursor
5470: 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73   *p;.  assert( s
5480: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
5490: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
54a0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 63 65  .  assert( pExce
54b0: 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70 74  pt==0 || pExcept
54c0: 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20  ->pBt==pBt );.  
54d0: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
54e0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
54f0: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70  t){.    if( p!=p
5500: 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52  Except && (0==iR
5510: 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f  oot || p->pgnoRo
5520: 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a 20 20  ot==iRoot) ){.  
5530: 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74      if( p->eStat
5540: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
5550: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
5560: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
5570: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
5580: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
5590: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
55a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
55b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
55c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
55d0: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 30  case( p->iPage>0
55e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65   );.        btre
55f0: 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
5600: 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20 20  rPages(p);.     
5610: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
5620: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5630: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
5640: 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
5650: 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a  or position..*/.
5660: 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
5670: 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43  eClearCursor(BtC
5680: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5690: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
56a0: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
56b0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
56c0: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
56d0: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
56e0: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
56f0: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
5700: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69  .}../*.** In thi
5710: 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72  s version of Btr
5720: 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69  eeMoveto, pKey i
5730: 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78  s a packed index
5740: 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20   record.** such 
5750: 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  as is generated 
5760: 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  by the OP_MakeRe
5770: 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e  cord opcode.  Un
5780: 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f  pack the.** reco
5790: 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c  rd and then call
57a0: 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61   BtreeMovetoUnpa
57b0: 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65  cked() to do the
57c0: 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   work..*/.static
57d0: 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f   int btreeMoveto
57e0: 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
57f0: 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  ur,     /* Curso
5800: 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74  r open on the bt
5810: 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63 68  ree to be search
5820: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ed */.  const vo
5830: 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50  id *pKey,   /* P
5840: 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65  acked key if the
5850: 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64   btree is an ind
5860: 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79  ex */.  i64 nKey
5870: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
5880: 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74  nteger key for t
5890: 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20  ables.  Size of 
58a0: 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73  pKey for indices
58b0: 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20   */.  int bias, 
58c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61            /* Bia
58d0: 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  s search to the 
58e0: 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
58f0: 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
5900: 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63    /* Write searc
5910: 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  h results here *
5920: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
5930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5940: 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65    /* Status code
5950: 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
5960: 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20  cord *pIdxKey;  
5970: 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
5980: 65 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72  ex key */.  char
5990: 20 61 53 70 61 63 65 5b 32 30 30 5d 3b 20 20 20   aSpace[200];   
59a0: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
59b0: 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65 79  pace for pIdxKey
59c0: 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 61   - to avoid a ma
59d0: 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lloc */.  char *
59e0: 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66  pFree = 0;..  if
59f0: 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73  ( pKey ){.    as
5a00: 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34  sert( nKey==(i64
5a10: 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20  )(int)nKey );.  
5a20: 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69    pIdxKey = sqli
5a30: 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61  te3VdbeAllocUnpa
5a40: 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 20 20  ckedRecord(.    
5a50: 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e      pCur->pKeyIn
5a60: 66 6f 2c 20 61 53 70 61 63 65 2c 20 73 69 7a 65  fo, aSpace, size
5a70: 6f 66 28 61 53 70 61 63 65 29 2c 20 26 70 46 72  of(aSpace), &pFr
5a80: 65 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  ee.    );.    if
5a90: 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72  ( pIdxKey==0 ) r
5aa0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
5ab0: 45 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  EM;.    sqlite3V
5ac0: 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
5ad0: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  pCur->pKeyInfo, 
5ae0: 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c  (int)nKey, pKey,
5af0: 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69   pIdxKey);.    i
5b00: 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65  f( pIdxKey->nFie
5b10: 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ld==0 ){.      s
5b20: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43 75  qlite3DbFree(pCu
5b30: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  r->pKeyInfo->db,
5b40: 20 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20 72   pFree);.      r
5b50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
5b60: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
5b70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
5b80: 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  dxKey = 0;.  }. 
5b90: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
5ba0: 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
5bb0: 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20  (pCur, pIdxKey, 
5bc0: 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73  nKey, bias, pRes
5bd0: 29 3b 0a 20 20 69 66 28 20 70 46 72 65 65 20 29  );.  if( pFree )
5be0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
5bf0: 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ree(pCur->pKeyIn
5c00: 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a  fo->db, pFree);.
5c10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
5c20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72  .}../*.** Restor
5c30: 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
5c40: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20  the position it 
5c50: 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c  was in (or as cl
5c60: 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62  ose to as possib
5c70: 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65  le).** when save
5c80: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
5c90: 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74   was called. Not
5ca0: 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c  e that this call
5cb0: 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a   deletes the .**
5cc0: 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20   saved position 
5cd0: 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73  info stored by s
5ce0: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
5cf0: 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61  n(), so there ca
5d00: 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20  n be.** at most 
5d10: 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65  one effective re
5d20: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
5d30: 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72  ion() call after
5d40: 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75   each .** saveCu
5d50: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a  rsorPosition()..
5d60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
5d70: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
5d80: 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f  Position(BtCurso
5d90: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
5da0: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75  rc;.  assert( cu
5db0: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
5dc0: 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
5dd0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
5de0: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5df0: 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
5e00: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
5e10: 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65  _FAULT ){.    re
5e20: 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e  turn pCur->skipN
5e30: 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  ext;.  }.  pCur-
5e40: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
5e50: 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d  _INVALID;.  rc =
5e60: 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75   btreeMoveto(pCu
5e70: 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70  r, pCur->pKey, p
5e80: 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 70  Cur->nKey, 0, &p
5e90: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 29 3b 0a  Cur->skipNext);.
5ea0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5eb0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
5ec0: 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b  e3_free(pCur->pK
5ed0: 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70  ey);.    pCur->p
5ee0: 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  Key = 0;.    ass
5ef0: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
5f00: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
5f10: 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
5f20: 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
5f30: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
5f40: 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43 75  >skipNext && pCu
5f50: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
5f60: 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  R_VALID ){.     
5f70: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5f80: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b  CURSOR_SKIPNEXT;
5f90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5fa0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69  urn rc;.}..#defi
5fb0: 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ne restoreCursor
5fc0: 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20  Position(p) \.  
5fd0: 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  (p->eState>=CURS
5fe0: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f  OR_REQUIRESEEK ?
5ff0: 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72 65   \.         btre
6000: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
6010: 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20  sition(p) : \.  
6020: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b         SQLITE_OK
6030: 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  )../*.** Determi
6040: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
6050: 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20 6d  t a cursor has m
6060: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 6f  oved from the po
6070: 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77 61 73  sition it.** was
6080: 20 6c 61 73 74 20 70 6c 61 63 65 64 20 61 74 2e   last placed at.
6090: 20 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f    Cursors can mo
60a0: 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20  ve when the row 
60b0: 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e  they are pointin
60c0: 67 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c 65 74  g.** at is delet
60d0: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
60e0: 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  r them..**.** Th
60f0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
6100: 6e 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ns an error code
6110: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
6120: 65 73 20 77 72 6f 6e 67 2e 20 20 54 68 65 0a 2a  es wrong.  The.*
6130: 2a 20 69 6e 74 65 67 65 72 20 2a 70 48 61 73 4d  * integer *pHasM
6140: 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20 6f  oved is set to o
6150: 6e 65 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  ne if the cursor
6160: 20 68 61 73 20 6d 6f 76 65 64 20 61 6e 64 20 30   has moved and 0
6170: 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74 20   if not..*/.int 
6180: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
6190: 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72  orHasMoved(BtCur
61a0: 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
61b0: 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20 69 6e  pHasMoved){.  in
61c0: 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  t rc;..  rc = re
61d0: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
61e0: 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
61f0: 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 48 61 73   rc ){.    *pHas
6200: 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 72  Moved = 1;.    r
6210: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
6220: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
6230: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  !=CURSOR_VALID |
6240: 7c 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 73 6b  | NEVER(pCur->sk
6250: 69 70 4e 65 78 74 21 3d 30 29 20 29 7b 0a 20 20  ipNext!=0) ){.  
6260: 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 31    *pHasMoved = 1
6270: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
6280: 70 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20  pHasMoved = 0;. 
6290: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
62a0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
62b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
62c0: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47  TOVACUUM./*.** G
62d0: 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62  iven a page numb
62e0: 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20  er of a regular 
62f0: 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72  database page, r
6300: 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a  eturn the page.*
6310: 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
6320: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
6330: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
6340: 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
6350: 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20  e.** input page 
6360: 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65  number..**.** Re
6370: 74 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76 61  turn 0 (not a va
6380: 6c 69 64 20 70 61 67 65 29 20 66 6f 72 20 70 67  lid page) for pg
6390: 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65 72  no==1 since ther
63a0: 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74  e is.** no point
63b0: 65 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74 65  er map associate
63c0: 64 20 77 69 74 68 20 70 61 67 65 20 31 2e 20 20  d with page 1.  
63d0: 54 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68  The integrity_ch
63e0: 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71  eck logic.** req
63f0: 75 69 72 65 73 20 74 68 61 74 20 70 74 72 6d 61  uires that ptrma
6400: 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e  pPageno(*,1)!=1.
6410: 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
6420: 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53  ptrmapPageno(BtS
6430: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
6440: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50   pgno){.  int nP
6450: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
6460: 20 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20    Pgno iPtrMap, 
6470: 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ret;.  assert( s
6480: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
6490: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
64a0: 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29 20  .  if( pgno<2 ) 
64b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67  return 0;.  nPag
64c0: 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28  esPerMapPage = (
64d0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
64e0: 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20  5)+1;.  iPtrMap 
64f0: 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65  = (pgno-2)/nPage
6500: 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72  sPerMapPage;.  r
6510: 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50  et = (iPtrMap*nP
6520: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20  agesPerMapPage) 
6530: 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d  + 2; .  if( ret=
6540: 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
6550: 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72  GE(pBt) ){.    r
6560: 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  et++;.  }.  retu
6570: 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn ret;.}../*.**
6580: 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   Write an entry 
6590: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
65a0: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
65b0: 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73   routine updates
65c0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
65d0: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
65e0: 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20  number 'key'.** 
65f0: 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20  so that it maps 
6600: 74 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20  to type 'eType' 
6610: 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20  and parent page 
6620: 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a  number 'pgno'..*
6630: 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20  *.** If *pRC is 
6640: 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65  initially non-ze
6650: 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f  ro (non-SQLITE_O
6660: 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  K) then this rou
6670: 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d  tine is.** a no-
6680: 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72  op.  If an error
6690: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70 70   occurs, the app
66a0: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
66b0: 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ode is written.*
66c0: 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a  * into *pRC..*/.
66d0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d  static void ptrm
66e0: 61 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a  apPut(BtShared *
66f0: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
6700: 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61  8 eType, Pgno pa
6710: 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b  rent, int *pRC){
6720: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
6730: 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  ge;  /* The poin
6740: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
6750: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
6760: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
6770: 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20  er map data */. 
6780: 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20   Pgno iPtrmap;  
6790: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
67a0: 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65  r map page numbe
67b0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  r */.  int offse
67c0: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  t;       /* Offs
67d0: 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61  et in pointer ma
67e0: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
67f0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rc;           /*
6800: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
6810: 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a  m subfunctions *
6820: 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  /..  if( *pRC ) 
6830: 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
6840: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
6850: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
6860: 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61  ) );.  /* The ma
6870: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67  ster-journal pag
6880: 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65  e number must ne
6890: 76 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61  ver be used as a
68a0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
68b0: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  e */.  assert( 0
68c0: 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ==PTRMAP_ISPAGE(
68d0: 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  pBt, PENDING_BYT
68e0: 45 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a  E_PAGE(pBt)) );.
68f0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
6900: 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
6910: 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20  if( key==0 ){.  
6920: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
6930: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
6940: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
6950: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
6960: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
6970: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
6980: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
6990: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
69a0: 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  &pDbPage);.  if(
69b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
69c0: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b  {.    *pRC = rc;
69d0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
69e0: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
69f0: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
6a00: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
6a10: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
6a20: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
6a30: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
6a40: 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78    goto ptrmap_ex
6a50: 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  it;.  }.  assert
6a60: 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74  ( offset <= (int
6a70: 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
6a80: 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20  -5 );.  pPtrmap 
6a90: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
6aa0: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
6ab0: 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79  age);..  if( eTy
6ac0: 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73  pe!=pPtrmap[offs
6ad0: 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28  et] || get4byte(
6ae0: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
6af0: 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20  1])!=parent ){. 
6b00: 20 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41     TRACE(("PTRMA
6b10: 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25  P_UPDATE: %d->(%
6b20: 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65  d,%d)\n", key, e
6b30: 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a  Type, parent));.
6b40: 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73      *pRC= rc = s
6b50: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
6b60: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
6b70: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6b80: 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61   ){.      pPtrma
6b90: 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70  p[offset] = eTyp
6ba0: 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  e;.      put4byt
6bb0: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
6bc0: 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20  t+1], parent);. 
6bd0: 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70     }.  }..ptrmap
6be0: 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33  _exit:.  sqlite3
6bf0: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
6c00: 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ge);.}../*.** Re
6c10: 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d  ad an entry from
6c20: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
6c30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
6c40: 74 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74  tine retrieves t
6c50: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
6c60: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b  ntry for page 'k
6c70: 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20  ey', writing.** 
6c80: 74 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72  the type and par
6c90: 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
6ca0: 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a  to *pEType and *
6cb0: 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65  pPgno respective
6cc0: 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20  ly..** An error 
6cd0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
6ce0: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
6cf0: 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77  es wrong, otherw
6d00: 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
6d10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
6d20: 6d 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20  mapGet(BtShared 
6d30: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
6d40: 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f  u8 *pEType, Pgno
6d50: 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61   *pPgno){.  DbPa
6d60: 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f  ge *pDbPage;   /
6d70: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
6d80: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
6d90: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  iPtrmap;       /
6da0: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
6db0: 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38  ge index */.  u8
6dc0: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
6dd0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
6de0: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69  page data */.  i
6df0: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
6e00: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65    /* Offset of e
6e10: 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20  ntry in pointer 
6e20: 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  map */.  int rc;
6e30: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
6e40: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
6e50: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
6e60: 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41   iPtrmap = PTRMA
6e70: 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65  P_PAGENO(pBt, ke
6e80: 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  y);.  rc = sqlit
6e90: 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
6ea0: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
6eb0: 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66   &pDbPage);.  if
6ec0: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72  ( rc!=0 ){.    r
6ed0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
6ee0: 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29  pPtrmap = (u8 *)
6ef0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
6f00: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20  ata(pDbPage);.. 
6f10: 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50   offset = PTRMAP
6f20: 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d  _PTROFFSET(iPtrm
6f30: 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20  ap, key);.  if( 
6f40: 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20  offset<0 ){.    
6f50: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
6f60: 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  f(pDbPage);.    
6f70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
6f80: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
6f90: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
6fa0: 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73   <= (int)pBt->us
6fb0: 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20  ableSize-5 );.  
6fc0: 61 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d  assert( pEType!=
6fd0: 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d  0 );.  *pEType =
6fe0: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
6ff0: 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20  ;.  if( pPgno ) 
7000: 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  *pPgno = get4byt
7010: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
7020: 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65  t+1]);..  sqlite
7030: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
7040: 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54  age);.  if( *pET
7050: 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65  ype<1 || *pEType
7060: 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >5 ) return SQLI
7070: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
7080: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7090: 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a  _OK;.}..#else /*
70a0: 20 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49   if defined SQLI
70b0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
70c0: 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  UM */.  #define 
70d0: 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c  ptrmapPut(w,x,y,
70e0: 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20  z,rc).  #define 
70f0: 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c  ptrmapGet(w,x,y,
7100: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  z) SQLITE_OK.  #
7110: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74  define ptrmapPut
7120: 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63  OvflPtr(x, y, rc
7130: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
7140: 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61  Given a btree pa
7150: 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e  ge and a cell in
7160: 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65  dex (0 means the
7170: 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a   first cell on.*
7180: 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65  * the page, 1 me
7190: 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63  ans the second c
71a0: 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  ell, and so fort
71b0: 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  h) return a poin
71c0: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65  ter.** to the ce
71d0: 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  ll content..**.*
71e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
71f0: 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61  orks only for pa
7200: 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  ges that do not 
7210: 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77  contain overflow
7220: 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69   cells..*/.#defi
7230: 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29  ne findCell(P,I)
7240: 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61   \.  ((P)->aData
7250: 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67   + ((P)->maskPag
7260: 65 20 26 20 67 65 74 32 62 79 74 65 28 26 28 50  e & get2byte(&(P
7270: 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49  )->aCellIdx[2*(I
7280: 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69  )]))).#define fi
7290: 6e 64 43 65 6c 6c 76 32 28 44 2c 4d 2c 4f 2c 49  ndCellv2(D,M,O,I
72a0: 29 20 28 44 2b 28 4d 26 67 65 74 32 62 79 74 65  ) (D+(M&get2byte
72b0: 28 44 2b 28 4f 2b 32 2a 28 49 29 29 29 29 29 0a  (D+(O+2*(I))))).
72c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d  ../*.** This a m
72d0: 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73  ore complex vers
72e0: 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28  ion of findCell(
72f0: 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72  ) that works for
7300: 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 64  .** pages that d
7310: 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  o contain overfl
7320: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  ow cells..*/.sta
7330: 74 69 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72  tic u8 *findOver
7340: 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65  flowCell(MemPage
7350: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
7360: 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ll){.  int i;.  
7370: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
7380: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
7390: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
73a0: 0a 20 20 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e  .  for(i=pPage->
73b0: 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d  nOverflow-1; i>=
73c0: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; i--){.    int
73d0: 20 6b 3b 0a 20 20 20 20 6b 20 3d 20 70 50 61 67   k;.    k = pPag
73e0: 65 2d 3e 61 69 4f 76 66 6c 5b 69 5d 3b 0a 20 20  e->aiOvfl[i];.  
73f0: 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29    if( k<=iCell )
7400: 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69  {.      if( k==i
7410: 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Cell ){.        
7420: 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 61 70  return pPage->ap
7430: 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 7d  Ovfl[i];.      }
7440: 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a  .      iCell--;.
7450: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
7460: 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  rn findCell(pPag
7470: 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a  e, iCell);.}../*
7480: 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c  .** Parse a cell
7490: 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61   content block a
74a0: 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43  nd fill in the C
74b0: 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ellInfo structur
74c0: 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65  e.  There.** are
74d0: 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66   two versions of
74e0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
74f0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
7500: 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65  ) takes a .** ce
7510: 6c 6c 20 69 6e 64 65 78 20 61 73 20 74 68 65 20  ll index as the 
7520: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
7530: 61 6e 64 20 62 74 72 65 65 50 61 72 73 65 43 65  and btreeParseCe
7540: 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61 6b 65  llPtr() .** take
7550: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
7560: 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 63  he body of the c
7570: 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f 6e  ell as its secon
7580: 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  d argument..**.*
7590: 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 66 69  * Within this fi
75a0: 6c 65 2c 20 74 68 65 20 70 61 72 73 65 43 65 6c  le, the parseCel
75b0: 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e 20 62 65  l() macro can be
75c0: 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 20   called instead 
75d0: 6f 66 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  of.** btreeParse
75e0: 43 65 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e 67  CellPtr(). Using
75f0: 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73 2c   some compilers,
7600: 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 66 61   this will be fa
7610: 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ster..*/.static 
7620: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
7630: 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67  ellPtr(.  MemPag
7640: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
7650: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
7660: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
7670: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
7680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
7690: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
76a0: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
76b0: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
76c0: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
76d0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
76e0: 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 3b 20 20 20  /.){.  u16 n;   
76f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7700: 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20 69  * Number bytes i
7710: 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  n cell content h
7720: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
7730: 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20  Payload;        
7740: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7750: 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61  bytes of cell pa
7760: 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65  yload */..  asse
7770: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
7780: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
7790: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
77a0: 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70  pInfo->pCell = p
77b0: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
77c0: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c  pPage->leaf==0 |
77d0: 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31  | pPage->leaf==1
77e0: 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d   );.  n = pPage-
77f0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
7800: 20 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a   assert( n==4-4*
7810: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20  pPage->leaf );. 
7820: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
7830: 65 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  ey ){.    if( pP
7840: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
7850: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d        assert( n=
7860: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20  =0 );.      n = 
7870: 67 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c  getVarint32(pCel
7880: 6c 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  l, nPayload);.  
7890: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
78a0: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20  Payload = 0;.   
78b0: 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56   }.    n += getV
78c0: 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c  arint(&pCell[n],
78d0: 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e   (u64*)&pInfo->n
78e0: 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  Key);.    pInfo-
78f0: 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61  >nData = nPayloa
7900: 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
7910: 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 30  pInfo->nData = 0
7920: 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61  ;.    n += getVa
7930: 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d  rint32(&pCell[n]
7940: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  , nPayload);.   
7950: 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e   pInfo->nKey = n
7960: 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70  Payload;.  }.  p
7970: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d  Info->nPayload =
7980: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
7990: 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b  fo->nHeader = n;
79a0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
79b0: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
79c0: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
79d0: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
79e0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
79f0: 31 20 29 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c  1 );.  if( likel
7a00: 79 28 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  y(nPayload<=pPag
7a10: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a  e->maxLocal) ){.
7a20: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
7a30: 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e  he (easy) common
7a40: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
7a50: 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66  entire payload f
7a60: 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  its.    ** on th
7a70: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e  e local page.  N
7a80: 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65  o overflow is re
7a90: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
7aa0: 20 20 20 69 66 28 20 28 70 49 6e 66 6f 2d 3e 6e     if( (pInfo->n
7ab0: 53 69 7a 65 20 3d 20 28 75 31 36 29 28 6e 2b 6e  Size = (u16)(n+n
7ac0: 50 61 79 6c 6f 61 64 29 29 3c 34 20 29 20 70 49  Payload))<4 ) pI
7ad0: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a  nfo->nSize = 4;.
7ae0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
7af0: 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61  l = (u16)nPayloa
7b00: 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f  d;.    pInfo->iO
7b10: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d  verflow = 0;.  }
7b20: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
7b30: 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c  the payload will
7b40: 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74   not fit complet
7b50: 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ely on the local
7b60: 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20   page, we have. 
7b70: 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20     ** to decide 
7b80: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72  how much to stor
7b90: 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f  e locally and ho
7ba0: 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20  w much to spill 
7bb0: 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72  onto.    ** over
7bc0: 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65  flow pages.  The
7bd0: 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20   strategy is to 
7be0: 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f  minimize the amo
7bf0: 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20  unt of unused.  
7c00: 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76    ** space on ov
7c10: 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69  erflow pages whi
7c20: 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61  le keeping the a
7c30: 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73  mount of local s
7c40: 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e  torage.    ** in
7c50: 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61   between minLoca
7c60: 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a  l and maxLocal..
7c70: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61      **.    ** Wa
7c80: 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67  rning:  changing
7c90: 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f   the way overflo
7ca0: 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73  w payload is dis
7cb0: 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a  tributed in any.
7cc0: 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20      ** way will 
7cd0: 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63  result in an inc
7ce0: 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66  ompatible file f
7cf0: 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ormat..    */.  
7d00: 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20    int minLocal; 
7d10: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75   /* Minimum amou
7d20: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
7d30: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
7d40: 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20    int maxLocal; 
7d50: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75   /* Maximum amou
7d60: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
7d70: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
7d80: 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20    int surplus;  
7d90: 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79   /* Overflow pay
7da0: 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66  load available f
7db0: 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  or local storage
7dc0: 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61   */..    minLoca
7dd0: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
7de0: 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61  cal;.    maxLoca
7df0: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  l = pPage->maxLo
7e00: 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73  cal;.    surplus
7e10: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e   = minLocal + (n
7e20: 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63  Payload - minLoc
7e30: 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d  al)%(pPage->pBt-
7e40: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
7e50: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
7e60: 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61  surplus==maxLoca
7e70: 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
7e80: 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c  e( surplus==maxL
7e90: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66  ocal+1 );.    if
7ea0: 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78  ( surplus <= max
7eb0: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70  Local ){.      p
7ec0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
7ed0: 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 20  u16)surplus;.   
7ee0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
7ef0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
7f00: 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  16)minLocal;.   
7f10: 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f   }.    pInfo->iO
7f20: 76 65 72 66 6c 6f 77 20 3d 20 28 75 31 36 29 28  verflow = (u16)(
7f30: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20  pInfo->nLocal + 
7f40: 6e 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  n);.    pInfo->n
7f50: 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f  Size = pInfo->iO
7f60: 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d  verflow + 4;.  }
7f70: 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65  .}.#define parse
7f80: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
7f90: 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20 62 74  l, pInfo) \.  bt
7fa0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
7fb0: 28 70 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c  (pPage), findCel
7fc0: 6c 28 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c  l((pPage), (iCel
7fd0: 6c 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a 73 74  l)), (pInfo)).st
7fe0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
7ff0: 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  arseCell(.  MemP
8000: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
8010: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
8020: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
8030: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20  */.  int iCell, 
8040: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8050: 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20  The cell index. 
8060: 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30   First cell is 0
8070: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
8080: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
8090: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
80a0: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
80b0: 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  parseCell(pPage,
80c0: 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a   iCell, pInfo);.
80d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
80e0: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
80f0: 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20  r of bytes that 
8100: 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20  a Cell needs in 
8110: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
8120: 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72   area of the btr
8130: 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65  ee-page.  The re
8140: 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c  turn number incl
8150: 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  udes the cell.**
8160: 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64   data header and
8170: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f   the local paylo
8180: 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20  ad, but not any 
8190: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72  overflow page or
81a0: 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73  .** the space us
81b0: 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70  ed by the cell p
81c0: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
81d0: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
81e0: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
81f0: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
8200: 75 38 20 2a 70 49 74 65 72 20 3d 20 26 70 43 65  u8 *pIter = &pCe
8210: 6c 6c 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  ll[pPage->childP
8220: 74 72 53 69 7a 65 5d 3b 0a 20 20 75 33 32 20 6e  trSize];.  u32 n
8230: 53 69 7a 65 3b 0a 0a 23 69 66 64 65 66 20 53 51  Size;..#ifdef SQ
8240: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
8250: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
8260: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
8270: 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  ion should alway
8280: 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  s be the same as
8290: 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49  .  ** the (CellI
82a0: 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65  nfo.nSize) value
82b0: 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20   found by doing 
82c0: 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20  a full parse of 
82d0: 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49  the.  ** cell. I
82e0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69  f SQLITE_DEBUG i
82f0: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  s defined, an as
8300: 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62 6f  sert() at the bo
8310: 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69  ttom of.  ** thi
8320: 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66  s function verif
8330: 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69 6e  ies that this in
8340: 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76  variant is not v
8350: 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65  iolated. */.  Ce
8360: 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f  llInfo debuginfo
8370: 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
8380: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
8390: 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b  ll, &debuginfo);
83a0: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
83b0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
83c0: 20 20 20 20 75 38 20 2a 70 45 6e 64 3b 0a 20 20      u8 *pEnd;.  
83d0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
83e0: 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 70 49  Data ){.      pI
83f0: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
8400: 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29  32(pIter, nSize)
8410: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8420: 20 20 20 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20     nSize = 0;.  
8430: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 70 49 74 65    }..    /* pIte
8440: 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20  r now points at 
8450: 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67  the 64-bit integ
8460: 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20  er key value, a 
8470: 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
8480: 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e  .    ** integer.
8490: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
84a0: 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72  lock moves pIter
84b0: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
84c0: 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 20 20   first byte.    
84d0: 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ** past the end 
84e0: 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  of the key value
84f0: 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20  . */.    pEnd = 
8500: 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77  &pIter[9];.    w
8510: 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29  hile( (*pIter++)
8520: 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  &0x80 && pIter<p
8530: 45 6e 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  End );.  }else{.
8540: 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74      pIter += get
8550: 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20  Varint32(pIter, 
8560: 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 74  nSize);.  }..  t
8570: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
8580: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
8590: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
85a0: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
85b0: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
85c0: 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61   nSize>pPage->ma
85d0: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e  xLocal ){.    in
85e0: 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61  t minLocal = pPa
85f0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
8600: 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63    nSize = minLoc
8610: 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69  al + (nSize - mi
8620: 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65  nLocal) % (pPage
8630: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
8640: 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74  e - 4);.    test
8650: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
8660: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
8670: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53      testcase( nS
8680: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
8690: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66  ocal+1 );.    if
86a0: 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d  ( nSize>pPage->m
86b0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  axLocal ){.     
86c0: 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61   nSize = minLoca
86d0: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69  l;.    }.    nSi
86e0: 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 6e  ze += 4;.  }.  n
86f0: 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49  Size += (u32)(pI
8700: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 0a 20  ter - pCell);.. 
8710: 20 2f 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20   /* The minimum 
8720: 73 69 7a 65 20 6f 66 20 61 6e 79 20 63 65 6c 6c  size of any cell
8730: 20 69 73 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a   is 4 bytes. */.
8740: 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b    if( nSize<4 ){
8750: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 0a  .    nSize = 4;.
8760: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e    }..  assert( n
8770: 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e  Size==debuginfo.
8780: 6e 53 69 7a 65 20 29 3b 0a 20 20 72 65 74 75 72  nSize );.  retur
8790: 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a  n (u16)nSize;.}.
87a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
87b0: 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72  EBUG./* This var
87c0: 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69  iation on cellSi
87d0: 7a 65 50 74 72 28 29 20 69 73 20 75 73 65 64 20  zePtr() is used 
87e0: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
87f0: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  () statements.**
8800: 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63   only. */.static
8810: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65   u16 cellSize(Me
8820: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
8830: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75  t iCell){.  retu
8840: 72 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  rn cellSizePtr(p
8850: 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70  Page, findCell(p
8860: 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d  Page, iCell));.}
8870: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
8880: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
8890: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66  OVACUUM./*.** If
88a0: 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c   the cell pCell,
88b0: 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50   part of page pP
88c0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  age contains a p
88d0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
88e0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69  overflow page, i
88f0: 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69  nsert an entry i
8900: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  nto the pointer-
8910: 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f  map.** for the o
8920: 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f  verflow page..*/
8930: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72  .static void ptr
8940: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65  mapPutOvflPtr(Me
8950: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
8960: 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52   *pCell, int *pR
8970: 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  C){.  CellInfo i
8980: 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20  nfo;.  if( *pRC 
8990: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
89a0: 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a  rt( pCell!=0 );.
89b0: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
89c0: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
89d0: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65  , &info);.  asse
89e0: 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  rt( (info.nData+
89f0: 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
8a00: 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e  :info.nKey))==in
8a10: 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20  fo.nPayload );. 
8a20: 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
8a30: 6c 6f 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  low ){.    Pgno 
8a40: 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  ovfl = get4byte(
8a50: 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
8a60: 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 70 74 72  rflow]);.    ptr
8a70: 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42  mapPut(pPage->pB
8a80: 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  t, ovfl, PTRMAP_
8a90: 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65  OVERFLOW1, pPage
8aa0: 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20  ->pgno, pRC);.  
8ab0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
8ac0: 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68  ** Defragment th
8ad0: 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41  e page given.  A
8ae0: 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76  ll Cells are mov
8af0: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64  ed to the.** end
8b00: 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e 64   of the page and
8b10: 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20   all free space 
8b20: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74  is collected int
8b30: 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65  o one.** big Fre
8b40: 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73  eBlk that occurs
8b50: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
8b60: 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a  header and cell.
8b70: 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ** pointer array
8b80: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
8b90: 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73  ntent area..*/.s
8ba0: 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67  tatic int defrag
8bb0: 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65  mentPage(MemPage
8bc0: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
8bd0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
8be0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
8bf0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
8c00: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pc;             
8c10: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
8c20: 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c  s of a i-th cell
8c30: 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c50: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
8c60: 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  e page header */
8c70: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
8c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8c90: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
8ca0: 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
8cb0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
8cc0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61  /* Number of usa
8cd0: 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70  ble bytes on a p
8ce0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  age */.  int cel
8cf0: 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  lOffset;        
8d00: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
8d10: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
8d20: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  r array */.  int
8d30: 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20   cbrk;          
8d40: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
8d50: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
8d60: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
8d70: 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
8d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8d90: 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
8da0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
8db0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
8dc0: 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ta;       /* The
8dd0: 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20   page data */.  
8de0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
8df0: 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65  emp;       /* Te
8e00: 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c  mp area for cell
8e10: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e   content */.  in
8e20: 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
8e30: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
8e40: 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c  t allowable cell
8e50: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
8e60: 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20  iCellLast;      
8e70: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70         /* Last p
8e80: 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64  ossible cell ind
8e90: 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74  ex */...  assert
8ea0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
8eb0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
8ec0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
8ed0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
8ee0: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
8ef0: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ( pPage->pBt->us
8f00: 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49  ableSize <= SQLI
8f10: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
8f20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
8f30: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
8f40: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
8f50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8f60: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
8f70: 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d  tex) );.  temp =
8f80: 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
8f90: 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42  pSpace(pPage->pB
8fa0: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 64 61  t->pPager);.  da
8fb0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
8fc0: 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
8fd0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63  ->hdrOffset;.  c
8fe0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
8ff0: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
9000: 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
9010: 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
9020: 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65   nCell==get2byte
9030: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29  (&data[hdr+3]) )
9040: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
9050: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
9060: 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20  bleSize;.  cbrk 
9070: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
9080: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63  [hdr+5]);.  memc
9090: 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d 2c 20  py(&temp[cbrk], 
90a0: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61  &data[cbrk], usa
90b0: 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b 29 3b  bleSize - cbrk);
90c0: 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65  .  cbrk = usable
90d0: 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72  Size;.  iCellFir
90e0: 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  st = cellOffset 
90f0: 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65  + 2*nCell;.  iCe
9100: 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53  llLast = usableS
9110: 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69  ize - 4;.  for(i
9120: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
9130: 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72  ){.    u8 *pAddr
9140: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74  ;     /* The i-t
9150: 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  h cell pointer *
9160: 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64  /.    pAddr = &d
9170: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
9180: 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20   i*2];.    pc = 
9190: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
91a0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
91b0: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
91c0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
91d0: 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c==iCellLast );.
91e0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
91f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
9200: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
9210: 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e      /* These con
9220: 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72  ditions have alr
9230: 65 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69  eady been verifi
9240: 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50  ed in btreeInitP
9250: 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20  age().    ** if 
9260: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56  SQLITE_ENABLE_OV
9270: 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43  ERSIZE_CELL_CHEC
9280: 4b 20 69 73 20 64 65 66 69 6e 65 64 20 0a 20 20  K is defined .  
9290: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c    */.    if( pc<
92a0: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
92b0: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
92c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
92d0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
92e0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
92f0: 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65   assert( pc>=iCe
9300: 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69  llFirst && pc<=i
9310: 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20  CellLast );.    
9320: 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  size = cellSizeP
9330: 74 72 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b  tr(pPage, &temp[
9340: 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d  pc]);.    cbrk -
9350: 3d 20 73 69 7a 65 3b 0a 23 69 66 20 64 65 66 69  = size;.#if defi
9360: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
9370: 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f  E_OVERSIZE_CELL_
9380: 43 48 45 43 4b 29 0a 20 20 20 20 69 66 28 20 63  CHECK).    if( c
9390: 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 29  brk<iCellFirst )
93a0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
93b0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
93c0: 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  PT;.    }.#else.
93d0: 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65      if( cbrk<iCe
93e0: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69  llFirst || pc+si
93f0: 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ze>usableSize ){
9400: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
9410: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
9420: 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  T;.    }.#endif.
9430: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
9440: 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a  +size<=usableSiz
9450: 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c  e && cbrk>=iCell
9460: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
9470: 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65  tcase( cbrk+size
9480: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
9490: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
94a0: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
94b0: 65 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  e );.    memcpy(
94c0: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74 65  &data[cbrk], &te
94d0: 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20  mp[pc], size);. 
94e0: 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64     put2byte(pAdd
94f0: 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a 20 20  r, cbrk);.  }.  
9500: 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43  assert( cbrk>=iC
9510: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75  ellFirst );.  pu
9520: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
9530: 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61  +5], cbrk);.  da
9540: 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20  ta[hdr+1] = 0;. 
9550: 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30   data[hdr+2] = 0
9560: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
9570: 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  = 0;.  memset(&d
9580: 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c  ata[iCellFirst],
9590: 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69   0, cbrk-iCellFi
95a0: 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rst);.  assert( 
95b0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
95c0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
95d0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28  DbPage) );.  if(
95e0: 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74   cbrk-iCellFirst
95f0: 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  !=pPage->nFree )
9600: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
9610: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
9620: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
9630: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
9640: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
9650: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
9660: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
9670: 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73   B-Tree page pas
9680: 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
9690: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72  rst argument. Wr
96a0: 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74  ite into *pIdx t
96b0: 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50  he index into pP
96c0: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20  age->aData[].** 
96d0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  of the first byt
96e0: 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73  e of allocated s
96f0: 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74  pace. Return eit
9700: 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  her SQLITE_OK or
9710: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  .** an error cod
9720: 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54  e (usually SQLIT
9730: 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a  E_CORRUPT)..**.*
9740: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61  * The caller gua
9750: 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65  rantees that the
9760: 72 65 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  re is sufficient
9770: 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74   space to make t
9780: 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  he.** allocation
9790: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
97a0: 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65  might need to de
97b0: 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65  fragment in orde
97c0: 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c  r to bring.** al
97d0: 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f 67 65  l the space toge
97e0: 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20  ther, however.  
97f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
9800: 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a  l avoid using.**
9810: 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 62   the first two b
9820: 79 74 65 73 20 70 61 73 74 20 74 68 65 20 63 65  ytes past the ce
9830: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20  ll pointer area 
9840: 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79  since presumably
9850: 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74   this.** allocat
9860: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64  ion is being mad
9870: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  e in order to in
9880: 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c  sert a new cell,
9890: 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61   so we will.** a
98a0: 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69  lso end up needi
98b0: 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f  ng a new cell po
98c0: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
98d0: 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61   int allocateSpa
98e0: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
98f0: 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e  e, int nByte, in
9900: 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73  t *pIdx){.  cons
9910: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67  t int hdr = pPag
9920: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20  e->hdrOffset;   
9930: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
9940: 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  of pPage->hdrOff
9950: 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  set */.  u8 * co
9960: 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65  nst data = pPage
9970: 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a  ->aData;      /*
9980: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
9990: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
99a0: 20 20 69 6e 74 20 6e 46 72 61 67 3b 20 20 20 20    int nFrag;    
99b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99c0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
99d0: 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64 20 62   of fragmented b
99e0: 79 74 65 73 20 6f 6e 20 70 50 61 67 65 20 2a 2f  ytes on pPage */
99f0: 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20  .  int top;     
9a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a10: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
9a20: 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f   byte of cell co
9a30: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
9a40: 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20 20  int gap;        
9a50: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
9a60: 20 67 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c   gap between cel
9a70: 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63  l pointers and c
9a80: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ell content */. 
9a90: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
9aa0: 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75   /* Integer retu
9ab0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
9ac0: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20   usableSize; /* 
9ad0: 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 74  Usable size of t
9ae0: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 0a 20 20  he page */.  .  
9af0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
9b00: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
9b10: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
9b20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9b30: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73  ge->pBt );.  ass
9b40: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
9b50: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
9b60: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
9b70: 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30  assert( nByte>=0
9b80: 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20   );  /* Minimum 
9b90: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
9ba0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
9bb0: 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20  e->nFree>=nByte 
9bc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9bd0: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
9be0: 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
9bf0: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
9c00: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 61 73 73  sableSize;.  ass
9c10: 65 72 74 28 20 6e 42 79 74 65 20 3c 20 75 73 61  ert( nByte < usa
9c20: 62 6c 65 53 69 7a 65 2d 38 20 29 3b 0a 0a 20 20  bleSize-8 );..  
9c30: 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72  nFrag = data[hdr
9c40: 2b 37 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  +7];.  assert( p
9c50: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
9c60: 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34   == hdr + 12 - 4
9c70: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
9c80: 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63    gap = pPage->c
9c90: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
9ca0: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 74 6f  age->nCell;.  to
9cb0: 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  p = get2byteNotZ
9cc0: 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
9cd0: 29 3b 0a 20 20 69 66 28 20 67 61 70 3e 74 6f 70  );.  if( gap>top
9ce0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
9cf0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9d00: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
9d10: 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63  ==top );.  testc
9d20: 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20  ase( gap+1==top 
9d30: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
9d40: 61 70 3d 3d 74 6f 70 20 29 3b 0a 0a 20 20 69 66  ap==top );..  if
9d50: 28 20 6e 46 72 61 67 3e 3d 36 30 20 29 7b 0a 20  ( nFrag>=60 ){. 
9d60: 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 64 65 66     /* Always def
9d70: 72 61 67 6d 65 6e 74 20 68 69 67 68 6c 79 20 66  ragment highly f
9d80: 72 61 67 6d 65 6e 74 65 64 20 70 61 67 65 73 20  ragmented pages 
9d90: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72  */.    rc = defr
9da0: 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
9db0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
9dc0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74  return rc;.    t
9dd0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74  op = get2byteNot
9de0: 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35  Zero(&data[hdr+5
9df0: 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ]);.  }else if( 
9e00: 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20  gap+2<=top ){.  
9e10: 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20    /* Search the 
9e20: 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67  freelist looking
9e30: 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74   for a free slot
9e40: 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73   big enough to s
9e50: 61 74 69 73 66 79 20 0a 20 20 20 20 2a 2a 20 74  atisfy .    ** t
9e60: 68 65 20 72 65 71 75 65 73 74 2e 20 54 68 65 20  he request. The 
9e70: 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 6d 61  allocation is ma
9e80: 64 65 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73  de from the firs
9e90: 74 20 66 72 65 65 20 73 6c 6f 74 20 69 6e 20 0a  t free slot in .
9ea0: 20 20 20 20 2a 2a 20 74 68 65 20 6c 69 73 74 20      ** the list 
9eb0: 74 68 61 74 20 69 73 20 6c 61 72 67 65 20 65 6e  that is large en
9ec0: 6f 75 67 68 20 74 6f 20 61 63 63 6f 6d 6d 6f 64  ough to accommod
9ed0: 61 74 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20  ate it..    */. 
9ee0: 20 20 20 69 6e 74 20 70 63 2c 20 61 64 64 72 3b     int pc, addr;
9ef0: 0a 20 20 20 20 66 6f 72 28 61 64 64 72 3d 68 64  .    for(addr=hd
9f00: 72 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32 62  r+1; (pc = get2b
9f10: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29  yte(&data[addr])
9f20: 29 3e 30 3b 20 61 64 64 72 3d 70 63 29 7b 0a 20  )>0; addr=pc){. 
9f30: 20 20 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20       int size;  
9f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
9f50: 65 20 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c  e of the free sl
9f60: 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ot */.      if( 
9f70: 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  pc>usableSize-4 
9f80: 7c 7c 20 70 63 3c 61 64 64 72 2b 34 20 29 7b 0a  || pc<addr+4 ){.
9f90: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
9fa0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
9fb0: 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
9fc0: 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74    size = get2byt
9fd0: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a  e(&data[pc+2]);.
9fe0: 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e 3d        if( size>=
9ff0: 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20  nByte ){.       
a000: 20 69 6e 74 20 78 20 3d 20 73 69 7a 65 20 2d 20   int x = size - 
a010: 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 74  nByte;.        t
a020: 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b  estcase( x==4 );
a030: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
a040: 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20  e( x==3 );.     
a050: 20 20 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20     if( x<4 ){.  
a060: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76          /* Remov
a070: 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20  e the slot from 
a080: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55  the free-list. U
a090: 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  pdate the number
a0a0: 20 6f 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   of.          **
a0b0: 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65   fragmented byte
a0c0: 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67  s within the pag
a0d0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
a0e0: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 61 64 64  memcpy(&data[add
a0f0: 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20 32  r], &data[pc], 2
a100: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 61 74  );.          dat
a110: 61 5b 68 64 72 2b 37 5d 20 3d 20 28 75 38 29 28  a[hdr+7] = (u8)(
a120: 6e 46 72 61 67 20 2b 20 78 29 3b 0a 20 20 20 20  nFrag + x);.    
a130: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 69      }else if( si
a140: 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65 53 69  ze+pc > usableSi
a150: 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
a160: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
a170: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
a180: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a190: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74       /* The slot
a1a0: 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20   remains on the 
a1b0: 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63  free-list. Reduc
a1c0: 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63  e its size to ac
a1d0: 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20 20  count.          
a1e0: 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69  ** for the porti
a1f0: 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20 6e  on used by the n
a200: 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a  ew allocation. *
a210: 2f 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 32  /.          put2
a220: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
a230: 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , x);.        }.
a240: 20 20 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20          *pIdx = 
a250: 70 63 20 2b 20 78 3b 0a 20 20 20 20 20 20 20 20  pc + x;.        
a260: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
a270: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a280: 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
a290: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
a2a0: 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61  re is enough spa
a2b0: 63 65 20 69 6e 20 74 68 65 20 67 61 70 20 74 6f  ce in the gap to
a2c0: 20 73 61 74 69 73 66 79 0a 20 20 2a 2a 20 74 68   satisfy.  ** th
a2d0: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 49  e allocation.  I
a2e0: 66 20 6e 6f 74 2c 20 64 65 66 72 61 67 6d 65 6e  f not, defragmen
a2f0: 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61  t..  */.  testca
a300: 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d  se( gap+2+nByte=
a310: 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61  =top );.  if( ga
a320: 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b  p+2+nByte>top ){
a330: 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67  .    rc = defrag
a340: 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b  mentPage(pPage);
a350: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
a360: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70  turn rc;.    top
a370: 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65   = get2byteNotZe
a380: 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  ro(&data[hdr+5])
a390: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 61  ;.    assert( ga
a3a0: 70 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a  p+nByte<=top );.
a3b0: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63    }...  /* Alloc
a3c0: 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20  ate memory from 
a3d0: 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65  the gap in betwe
a3e0: 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  en the cell poin
a3f0: 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61  ter array.  ** a
a400: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
a410: 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20 62  ent area.  The b
a420: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 63  treeInitPage() c
a430: 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a  all has already.
a440: 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74    ** validated t
a450: 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69  he freelist.  Gi
a460: 76 65 6e 20 74 68 61 74 20 74 68 65 20 66 72 65  ven that the fre
a470: 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20  elist is valid, 
a480: 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f  there.  ** is no
a490: 20 77 61 79 20 74 68 61 74 20 74 68 65 20 61 6c   way that the al
a4a0: 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74  location can ext
a4b0: 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20  end off the end 
a4c0: 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a  of the page..  *
a4d0: 2a 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62  * The assert() b
a4e0: 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68  elow verifies th
a4f0: 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65  e previous sente
a500: 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20  nce..  */.  top 
a510: 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32  -= nByte;.  put2
a520: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
a530: 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72  ], top);.  asser
a540: 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20  t( top+nByte <= 
a550: 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
a560: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
a570: 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20   *pIdx = top;.  
a580: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
a590: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
a5a0: 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74  n a section of t
a5b0: 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  he pPage->aData 
a5c0: 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
a5d0: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79  .** The first by
a5e0: 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72  te of the new fr
a5f0: 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67  ee block is pPag
a600: 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a  e->aDisk[start].
a610: 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ** and the size 
a620: 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20  of the block is 
a630: 22 73 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a  "size" bytes..**
a640: 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65 20  .** Most of the 
a650: 65 66 66 6f 72 74 20 68 65 72 65 20 69 73 20 69  effort here is i
a660: 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65  nvolved in coale
a670: 73 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a  sing adjacent.**
a680: 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74   free blocks int
a690: 6f 20 61 20 73 69 6e 67 6c 65 20 62 69 67 20 66  o a single big f
a6a0: 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74  ree block..*/.st
a6b0: 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 70 61  atic int freeSpa
a6c0: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
a6d0: 65 2c 20 69 6e 74 20 73 74 61 72 74 2c 20 69 6e  e, int start, in
a6e0: 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 61  t size){.  int a
a6f0: 64 64 72 2c 20 70 62 65 67 69 6e 2c 20 68 64 72  ddr, pbegin, hdr
a700: 3b 0a 20 20 69 6e 74 20 69 4c 61 73 74 3b 20 20  ;.  int iLast;  
a710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a720: 20 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74        /* Largest
a730: 20 70 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c   possible freebl
a740: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  ock offset */.  
a750: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
a760: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
a770: 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ta;..  assert( p
a780: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
a790: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
a7a0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
a7b0: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
a7c0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
a7d0: 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72  tart>=pPage->hdr
a7e0: 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e  Offset+6+pPage->
a7f0: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a  childPtrSize );.
a800: 20 20 61 73 73 65 72 74 28 20 28 73 74 61 72 74    assert( (start
a810: 20 2b 20 73 69 7a 65 29 20 3c 3d 20 28 69 6e 74   + size) <= (int
a820: 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  )pPage->pBt->usa
a830: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  bleSize );.  ass
a840: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
a850: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
a860: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
a870: 61 73 73 65 72 74 28 20 73 69 7a 65 3e 3d 30 20  assert( size>=0 
a880: 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  );   /* Minimum 
a890: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
a8a0: 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  /..  if( pPage->
a8b0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
a8c0: 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
a8d0: 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72  E ){.    /* Over
a8e0: 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
a8f0: 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
a900: 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65  eros when the se
a910: 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 20 20  cure_delete.    
a920: 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  ** option is ena
a930: 62 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  bled */.    mems
a940: 65 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c  et(&data[start],
a950: 20 30 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 0a   0, size);.  }..
a960: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61    /* Add the spa
a970: 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ce back into the
a980: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
a990: 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74  freeblocks.  Not
a9a0: 65 20 74 68 61 74 0a 20 20 2a 2a 20 65 76 65 6e  e that.  ** even
a9b0: 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65   though the free
a9c0: 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63  block list was c
a9d0: 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 49  hecked by btreeI
a9e0: 6e 69 74 50 61 67 65 28 29 2c 0a 20 20 2a 2a 20  nitPage(),.  ** 
a9f0: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
aa00: 64 69 64 20 6e 6f 74 20 64 65 74 65 63 74 20 6f  did not detect o
aa10: 76 65 72 6c 61 70 70 69 6e 67 20 63 65 6c 6c 73  verlapping cells
aa20: 20 6f 72 0a 20 20 2a 2a 20 66 72 65 65 62 6c 6f   or.  ** freeblo
aa30: 63 6b 73 20 74 68 61 74 20 6f 76 65 72 6c 61 70  cks that overlap
aa40: 70 65 64 20 63 65 6c 6c 73 2e 20 20 20 4e 6f 72  ped cells.   Nor
aa50: 20 64 6f 65 73 20 69 74 20 64 65 74 65 63 74 20   does it detect 
aa60: 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 63 65  when the.  ** ce
aa70: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
aa80: 65 78 63 65 65 64 73 20 74 68 65 20 76 61 6c 75  exceeds the valu
aa90: 65 20 69 6e 20 74 68 65 20 70 61 67 65 20 68 65  e in the page he
aaa0: 61 64 65 72 2e 20 20 49 66 20 74 68 65 73 65 0a  ader.  If these.
aab0: 20 20 2a 2a 20 73 69 74 75 61 74 69 6f 6e 73 20    ** situations 
aac0: 61 72 69 73 65 2c 20 74 68 65 6e 20 73 75 62 73  arise, then subs
aad0: 65 71 75 65 6e 74 20 69 6e 73 65 72 74 20 6f 70  equent insert op
aae0: 65 72 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 63  erations might c
aaf0: 6f 72 72 75 70 74 0a 20 20 2a 2a 20 74 68 65 20  orrupt.  ** the 
ab00: 66 72 65 65 6c 69 73 74 2e 20 20 53 6f 20 77 65  freelist.  So we
ab10: 20 64 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63   do need to chec
ab20: 6b 20 66 6f 72 20 63 6f 72 72 75 70 74 69 6f 6e  k for corruption
ab30: 20 77 68 69 6c 65 20 73 63 61 6e 6e 69 6e 67 0a   while scanning.
ab40: 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73    ** the freelis
ab50: 74 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20  t..  */.  hdr = 
ab60: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
ab70: 3b 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b  ;.  addr = hdr +
ab80: 20 31 3b 0a 20 20 69 4c 61 73 74 20 3d 20 70 50   1;.  iLast = pP
ab90: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
aba0: 53 69 7a 65 20 2d 20 34 3b 0a 20 20 61 73 73 65  Size - 4;.  asse
abb0: 72 74 28 20 73 74 61 72 74 3c 3d 69 4c 61 73 74  rt( start<=iLast
abc0: 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62   );.  while( (pb
abd0: 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28  egin = get2byte(
abe0: 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74  &data[addr]))<st
abf0: 61 72 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20  art && pbegin>0 
ac00: 29 7b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69  ){.    if( pbegi
ac10: 6e 3c 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20  n<addr+4 ){.    
ac20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ac30: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
ac40: 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 70    }.    addr = p
ac50: 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  begin;.  }.  if(
ac60: 20 70 62 65 67 69 6e 3e 69 4c 61 73 74 20 29 7b   pbegin>iLast ){
ac70: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
ac80: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
ac90: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
aca0: 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62  begin>addr || pb
acb0: 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74  egin==0 );.  put
acc0: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
acd0: 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74  ], start);.  put
ace0: 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72  2byte(&data[star
acf0: 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70  t], pbegin);.  p
ad00: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74  ut2byte(&data[st
ad10: 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20  art+2], size);. 
ad20: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
ad30: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 20 28  pPage->nFree + (
ad40: 75 31 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20  u16)size;..  /* 
ad50: 43 6f 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e  Coalesce adjacen
ad60: 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f  t free blocks */
ad70: 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20  .  addr = hdr + 
ad80: 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65  1;.  while( (pbe
ad90: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
ada0: 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29  data[addr]))>0 )
adb0: 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c  {.    int pnext,
adc0: 20 70 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61   psize, x;.    a
add0: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64  ssert( pbegin>ad
ade0: 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  dr );.    assert
adf0: 28 20 70 62 65 67 69 6e 20 3c 3d 20 28 69 6e 74  ( pbegin <= (int
ae00: 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  )pPage->pBt->usa
ae10: 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20  bleSize-4 );.   
ae20: 20 70 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74   pnext = get2byt
ae30: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 29  e(&data[pbegin])
ae40: 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d 20 67 65  ;.    psize = ge
ae50: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
ae60: 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28  gin+2]);.    if(
ae70: 20 70 62 65 67 69 6e 20 2b 20 70 73 69 7a 65 20   pbegin + psize 
ae80: 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20 26 26 20  + 3 >= pnext && 
ae90: 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20  pnext>0 ){.     
aea0: 20 69 6e 74 20 66 72 61 67 20 3d 20 70 6e 65 78   int frag = pnex
aeb0: 74 20 2d 20 28 70 62 65 67 69 6e 2b 70 73 69 7a  t - (pbegin+psiz
aec0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 66  e);.      if( (f
aed0: 72 61 67 3c 30 29 20 7c 7c 20 28 66 72 61 67 3e  rag<0) || (frag>
aee0: 28 69 6e 74 29 64 61 74 61 5b 68 64 72 2b 37 5d  (int)data[hdr+7]
aef0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
af00: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
af10: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
af20: 0a 20 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b  .      data[hdr+
af30: 37 5d 20 2d 3d 20 28 75 38 29 66 72 61 67 3b 0a  7] -= (u8)frag;.
af40: 20 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79        x = get2by
af50: 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 5d 29  te(&data[pnext])
af60: 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65  ;.      put2byte
af70: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20  (&data[pbegin], 
af80: 78 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 70 6e  x);.      x = pn
af90: 65 78 74 20 2b 20 67 65 74 32 62 79 74 65 28 26  ext + get2byte(&
afa0: 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29 20 2d  data[pnext+2]) -
afb0: 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 20 20 70   pbegin;.      p
afc0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  ut2byte(&data[pb
afd0: 65 67 69 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20 20  egin+2], x);.   
afe0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64   }else{.      ad
aff0: 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20  dr = pbegin;.   
b000: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
b010: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
b020: 20 61 72 65 61 20 62 65 67 69 6e 73 20 77 69 74   area begins wit
b030: 68 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72  h a freeblock, r
b040: 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69  emove it. */.  i
b050: 66 28 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d  f( data[hdr+1]==
b060: 64 61 74 61 5b 68 64 72 2b 35 5d 20 26 26 20 64  data[hdr+5] && d
b070: 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61  ata[hdr+2]==data
b080: 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69  [hdr+6] ){.    i
b090: 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70 62 65 67  nt top;.    pbeg
b0a0: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
b0b0: 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20  ata[hdr+1]);.   
b0c0: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 68 64   memcpy(&data[hd
b0d0: 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62 65 67  r+1], &data[pbeg
b0e0: 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70  in], 2);.    top
b0f0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
b100: 61 5b 68 64 72 2b 35 5d 29 20 2b 20 67 65 74 32  a[hdr+5]) + get2
b110: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
b120: 6e 2b 32 5d 29 3b 0a 20 20 20 20 70 75 74 32 62  n+2]);.    put2b
b130: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
b140: 2c 20 74 6f 70 29 3b 0a 20 20 7d 0a 20 20 61 73  , top);.  }.  as
b150: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
b160: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
b170: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
b180: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
b190: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
b1a0: 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62  code the flags b
b1b0: 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62  yte (the first b
b1c0: 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  yte of the heade
b1d0: 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a  r) for a page.**
b1e0: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
b1f0: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65  fields of the Me
b200: 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20  mPage structure 
b210: 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a  accordingly..**.
b220: 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c  ** Only the foll
b230: 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f  owing combinatio
b240: 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65 64  ns are supported
b250: 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66  .  Anything diff
b260: 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74  erent.** indicat
b270: 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  es a corrupt dat
b280: 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a  abase files:.**.
b290: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a  **         PTF_Z
b2a0: 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20  ERODATA.**      
b2b0: 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20     PTF_ZERODATA 
b2c0: 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20  | PTF_LEAF.**   
b2d0: 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41        PTF_LEAFDA
b2e0: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a  TA | PTF_INTKEY.
b2f0: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c  **         PTF_L
b300: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
b310: 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a  TKEY | PTF_LEAF.
b320: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
b330: 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67  codeFlags(MemPag
b340: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c  e *pPage, int fl
b350: 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61  agByte){.  BtSha
b360: 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a  red *pBt;     /*
b370: 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65   A copy of pPage
b380: 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ->pBt */..  asse
b390: 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt( pPage->hdrOf
b3a0: 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67  fset==(pPage->pg
b3b0: 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29  no==1 ? 100 : 0)
b3c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
b3d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
b3e0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
b3f0: 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  ex) );.  pPage->
b400: 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67  leaf = (u8)(flag
b410: 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72  Byte>>3);  asser
b420: 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31  t( PTF_LEAF == 1
b430: 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74  <<3 );.  flagByt
b440: 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a  e &= ~PTF_LEAF;.
b450: 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74    pPage->childPt
b460: 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67  rSize = 4-4*pPag
b470: 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d  e->leaf;.  pBt =
b480: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69   pPage->pBt;.  i
b490: 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54  f( flagByte==(PT
b4a0: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
b4b0: 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20  _INTKEY) ){.    
b4c0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
b4d0: 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61  1;.    pPage->ha
b4e0: 73 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c  sData = pPage->l
b4f0: 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  eaf;.    pPage->
b500: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
b510: 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61  maxLeaf;.    pPa
b520: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ge->minLocal = p
b530: 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d  Bt->minLeaf;.  }
b540: 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74  else if( flagByt
b550: 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20  e==PTF_ZERODATA 
b560: 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  ){.    pPage->in
b570: 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  tKey = 0;.    pP
b580: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 30  age->hasData = 0
b590: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
b5a0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
b5b0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65  Local;.    pPage
b5c0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
b5d0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65  ->minLocal;.  }e
b5e0: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
b5f0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
b600: 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  KPT;.  }.  pPage
b610: 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
b620: 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79 74  d = pBt->max1byt
b630: 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75  ePayload;.  retu
b640: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
b650: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
b660: 65 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  e the auxiliary 
b670: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
b680: 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a  a disk block..**
b690: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
b6a0: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
b6b0: 20 20 49 66 20 77 65 20 73 65 65 20 74 68 61 74    If we see that
b6c0: 20 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a   the page does.*
b6d0: 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  * not contain a 
b6e0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
b6f0: 62 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20  base page, then 
b700: 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
b710: 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65  E_CORRUPT.  Note
b720: 20 74 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f   that a return o
b730: 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73  f SQLITE_OK does
b740: 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65   not.** guarante
b750: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
b760: 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20  is well-formed. 
b770: 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74   It only shows t
b780: 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64  hat.** we failed
b790: 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63   to detect any c
b7a0: 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  orruption..*/.st
b7b0: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e  atic int btreeIn
b7c0: 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  itPage(MemPage *
b7d0: 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73 65 72  pPage){..  asser
b7e0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
b7f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
b800: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
b810: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
b820: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
b830: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71   pPage->pgno==sq
b840: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
b850: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
b860: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
b870: 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74  ( pPage == sqlit
b880: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
b890: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
b8a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
b8b0: 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c  ge->aData == sql
b8c0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
b8d0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
b8e0: 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67   );..  if( !pPag
b8f0: 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
b900: 20 75 31 36 20 70 63 3b 20 20 20 20 20 20 20 20   u16 pc;        
b910: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
b920: 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69  f a freeblock wi
b930: 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74  thin pPage->aDat
b940: 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68 64  a[] */.    u8 hd
b950: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
b960: 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e   Offset to begin
b970: 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61  ning of page hea
b980: 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64  der */.    u8 *d
b990: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ata;          /*
b9a0: 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d   Equal to pPage-
b9b0: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42 74  >aData */.    Bt
b9c0: 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
b9d0: 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
b9e0: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
b9f0: 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c  */.    int usabl
ba00: 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f  eSize;    /* Amo
ba10: 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70  unt of usable sp
ba20: 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65  ace on each page
ba30: 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65 6c 6c   */.    u16 cell
ba40: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66  Offset;    /* Of
ba50: 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20  fset from start 
ba60: 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72 73 74  of page to first
ba70: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
ba80: 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  .    int nFree; 
ba90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
baa0: 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65  r of unused byte
bab0: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
bac0: 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  .    int top;   
bad0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
bae0: 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c   byte of the cel
baf0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
bb00: 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 46  /.    int iCellF
bb10: 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73  irst;    /* Firs
bb20: 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c  t allowable cell
bb30: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66   or freeblock of
bb40: 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  fset */.    int 
bb50: 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f  iCellLast;     /
bb60: 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20  * Last possible 
bb70: 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63  cell or freebloc
bb80: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20 20  k offset */..   
bb90: 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
bba0: 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20 70 50  t;..    hdr = pP
bbb0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
bbc0: 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
bbd0: 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 66 28  ->aData;.    if(
bbe0: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
bbf0: 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29  ge, data[hdr]) )
bc00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
bc10: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
bc20: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61   assert( pBt->pa
bc30: 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
bc40: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35  Bt->pageSize<=65
bc50: 35 33 36 20 29 3b 0a 20 20 20 20 70 50 61 67 65  536 );.    pPage
bc60: 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31  ->maskPage = (u1
bc70: 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  6)(pBt->pageSize
bc80: 20 2d 20 31 29 3b 0a 20 20 20 20 70 50 61 67 65   - 1);.    pPage
bc90: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
bca0: 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20  .    usableSize 
bcb0: 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
bcc0: 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63 65  e;.    pPage->ce
bcd0: 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f  llOffset = cellO
bce0: 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32  ffset = hdr + 12
bcf0: 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
bd00: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61  ;.    pPage->aDa
bd10: 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 75 73  taEnd = &data[us
bd20: 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20 20 70  ableSize];.    p
bd30: 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d  Page->aCellIdx =
bd40: 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65   &data[cellOffse
bd50: 74 5d 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65  t];.    top = ge
bd60: 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
bd70: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
bd80: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
bd90: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
bda0: 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20  dr+3]);.    if( 
bdb0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f  pPage->nCell>MX_
bdc0: 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20  CELL(pBt) ){.   
bdd0: 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65     /* To many ce
bde0: 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  lls for a single
bdf0: 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
be00: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
be10: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
be20: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
be30: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
be40: 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d  testcase( pPage-
be50: 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28  >nCell==MX_CELL(
be60: 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  pBt) );..    /* 
be70: 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61  A malformed data
be80: 62 61 73 65 20 70 61 67 65 20 6d 69 67 68 74 20  base page might 
be90: 63 61 75 73 65 20 75 73 20 74 6f 20 72 65 61 64  cause us to read
bea0: 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20   past the end.  
beb0: 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65    ** of page whe
bec0: 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c  n parsing a cell
bed0: 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  .  .    **.    *
bee0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
bef0: 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68  block of code ch
bf00: 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65  ecks early to se
bf10: 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65  e if a cell exte
bf20: 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73 74 20  nds.    ** past 
bf30: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61 67  the end of a pag
bf40: 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20 63  e boundary and c
bf50: 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f 52  auses SQLITE_COR
bf60: 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20 20 20  RUPT to be .    
bf70: 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66 20 69  ** returned if i
bf80: 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20  t does..    */. 
bf90: 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20     iCellFirst = 
bfa0: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
bfb0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
bfc0: 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61   iCellLast = usa
bfd0: 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 23 69 66  bleSize - 4;.#if
bfe0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
bff0: 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f  ENABLE_OVERSIZE_
c000: 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20  CELL_CHECK).    
c010: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  {.      int i;  
c020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
c030: 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c  ex into the cell
c040: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
c050: 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 20  /.      int sz; 
c060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
c070: 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a  e of a cell */..
c080: 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
c090: 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61  ->leaf ) iCellLa
c0a0: 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28  st--;.      for(
c0b0: 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  i=0; i<pPage->nC
c0c0: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
c0d0: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
c0e0: 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65  (&data[cellOffse
c0f0: 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20  t+i*2]);.       
c100: 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69   testcase( pc==i
c110: 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20  CellFirst );.   
c120: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
c130: 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c==iCellLast );.
c140: 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c 69          if( pc<i
c150: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
c160: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
c170: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
c180: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c190: 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  T;.        }.   
c1a0: 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69       sz = cellSi
c1b0: 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 64 61  zePtr(pPage, &da
c1c0: 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 20  ta[pc]);.       
c1d0: 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a   testcase( pc+sz
c1e0: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
c1f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 63 2b 73          if( pc+s
c200: 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  z>usableSize ){.
c210: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
c220: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
c230: 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BKPT;.        }.
c240: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
c250: 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
c260: 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20   iCellLast++;.  
c270: 20 20 7d 20 20 0a 23 65 6e 64 69 66 0a 0a 20 20    }  .#endif..  
c280: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
c290: 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63   total free spac
c2a0: 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  e on the page */
c2b0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
c2c0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
c2d0: 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61  ;.    nFree = da
c2e0: 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b  ta[hdr+7] + top;
c2f0: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 63 3e 30  .    while( pc>0
c300: 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20 6e 65   ){.      u16 ne
c310: 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20  xt, size;.      
c320: 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
c330: 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73  t || pc>iCellLas
c340: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
c350: 53 74 61 72 74 20 6f 66 20 66 72 65 65 20 62 6c  Start of free bl
c360: 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20 70  ock is off the p
c370: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  age */.        r
c380: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c390: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
c3a0: 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d    }.      next =
c3b0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c3c0: 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65  pc]);.      size
c3d0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
c3e0: 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20  a[pc+2]);.      
c3f0: 69 66 28 20 28 6e 65 78 74 3e 30 20 26 26 20 6e  if( (next>0 && n
c400: 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 29 20  ext<=pc+size+3) 
c410: 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c  || pc+size>usabl
c420: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
c430: 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20   /* Free blocks 
c440: 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e  must be in ascen
c450: 64 69 6e 67 20 6f 72 64 65 72 2e 20 41 6e 64 20  ding order. And 
c460: 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66  the last byte of
c470: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
c480: 66 72 65 65 2d 62 6c 6f 63 6b 20 6d 75 73 74 20  free-block must 
c490: 6c 69 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62  lie on the datab
c4a0: 61 73 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ase page.  */.  
c4b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
c4c0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
c4d0: 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ; .      }.     
c4e0: 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b   nFree = nFree +
c4f0: 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63 20   size;.      pc 
c500: 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20  = next;.    }.. 
c510: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
c520: 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61  int, nFree conta
c530: 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74  ins the sum of t
c540: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
c550: 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66   start.    ** of
c560: 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
c570: 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65 20  t area plus the 
c580: 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62  number of free b
c590: 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 20 20  ytes within.    
c5a0: 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  ** the cell-cont
c5b0: 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68 69  ent area. If thi
c5c0: 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  s is greater tha
c5d0: 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a  n the usable-siz
c5e0: 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  e.    ** of the 
c5f0: 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70  page, then the p
c600: 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  age must be corr
c610: 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65 63  upted. This chec
c620: 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65  k also.    ** se
c630: 72 76 65 73 20 74 6f 20 76 65 72 69 66 79 20 74  rves to verify t
c640: 68 61 74 20 74 68 65 20 6f 66 66 73 65 74 20 74  hat the offset t
c650: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
c660: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a  he cell-content.
c670: 20 20 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63      ** area, acc
c680: 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61  ording to the pa
c690: 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20  ge header, lies 
c6a0: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
c6b0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
c6c0: 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65  nFree>usableSize
c6d0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
c6e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
c6f0: 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20  BKPT; .    }.   
c700: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
c710: 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43  (u16)(nFree - iC
c720: 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 20 20 70  ellFirst);.    p
c730: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31  Page->isInit = 1
c740: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
c750: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
c760: 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20  ** Set up a raw 
c770: 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20  page so that it 
c780: 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74  looks like a dat
c790: 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69  abase page holdi
c7a0: 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73  ng.** no entries
c7b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c7c0: 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67   zeroPage(MemPag
c7d0: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c  e *pPage, int fl
c7e0: 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ags){.  unsigned
c7f0: 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50   char *data = pP
c800: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74  age->aData;.  Bt
c810: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
c820: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68  age->pBt;.  u8 h
c830: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
c840: 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72  ffset;.  u16 fir
c850: 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  st;..  assert( s
c860: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
c870: 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
c880: 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67  Page)==pPage->pg
c890: 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  no );.  assert( 
c8a0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
c8b0: 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
c8c0: 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70  age) == (void*)p
c8d0: 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
c8e0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
c8f0: 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
c900: 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b  Page) == data );
c910: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c920: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
c930: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
c940: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
c950: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
c960: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
c970: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  ;.  if( pBt->bts
c980: 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
c990: 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  RE_DELETE ){.   
c9a0: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
c9b0: 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62  r], 0, pBt->usab
c9c0: 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20  leSize - hdr);. 
c9d0: 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d   }.  data[hdr] =
c9e0: 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20   (char)flags;.  
c9f0: 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38 20  first = hdr + 8 
ca00: 2b 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46 5f  + 4*((flags&PTF_
ca10: 4c 45 41 46 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a  LEAF)==0 ?1:0);.
ca20: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
ca30: 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20  dr+1], 0, 4);.  
ca40: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
ca50: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
ca60: 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75  a[hdr+5], pBt->u
ca70: 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50  sableSize);.  pP
ca80: 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31  age->nFree = (u1
ca90: 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  6)(pBt->usableSi
caa0: 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20 20 64  ze - first);.  d
cab0: 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
cac0: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67  , flags);.  pPag
cad0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 68  e->hdrOffset = h
cae0: 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c  dr;.  pPage->cel
caf0: 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b  lOffset = first;
cb00: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45  .  pPage->aDataE
cb10: 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e  nd = &data[pBt->
cb20: 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70  usableSize];.  p
cb30: 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d  Page->aCellIdx =
cb40: 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20   &data[first];. 
cb50: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
cb60: 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  w = 0;.  assert(
cb70: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d   pBt->pageSize>=
cb80: 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65  512 && pBt->page
cb90: 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20  Size<=65536 );. 
cba0: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
cbb0: 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61   = (u16)(pBt->pa
cbc0: 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70  geSize - 1);.  p
cbd0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b  Page->nCell = 0;
cbe0: 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
cbf0: 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 1;.}.../*.** 
cc00: 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65  Convert a DbPage
cc10: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74   obtained from t
cc20: 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20  he pager into a 
cc30: 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a  MemPage used by.
cc40: 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  ** the btree lay
cc50: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65  er..*/.static Me
cc60: 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65  mPage *btreePage
cc70: 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67  FromDbPage(DbPag
cc80: 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f  e *pDbPage, Pgno
cc90: 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20   pgno, BtShared 
cca0: 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65  *pBt){.  MemPage
ccb0: 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61   *pPage = (MemPa
ccc0: 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  ge*)sqlite3Pager
ccd0: 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
cce0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  );.  pPage->aDat
ccf0: 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  a = sqlite3Pager
cd00: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
cd10: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61  ;.  pPage->pDbPa
cd20: 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  ge = pDbPage;.  
cd30: 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74  pPage->pBt = pBt
cd40: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20  ;.  pPage->pgno 
cd50: 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d  = pgno;.  pPage-
cd60: 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  >hdrOffset = pPa
cd70: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
cd80: 30 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  0 : 0;.  return 
cd90: 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage; .}../*.**
cda0: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
cdb0: 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69   the pager.  Ini
cdc0: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
cdd0: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
cde0: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
cdf0: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
ce00: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f  .**.** If the no
ce10: 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20  Content flag is 
ce20: 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
ce30: 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
ce40: 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63  e about.** the c
ce50: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
ce60: 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ge at this time.
ce70: 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74    So do not go t
ce80: 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f  o the disk.** to
ce90: 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65   fetch the conte
cea0: 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  nt.  Just fill i
ceb0: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69  n the content wi
cec0: 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77  th zeros for now
ced0: 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66  ..** If in the f
cee0: 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71  uture we call sq
cef0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
cf00: 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20  ) on this page, 
cf10: 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65  that.** means we
cf20: 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f   have started to
cf30: 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62   be concerned ab
cf40: 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  out content and 
cf50: 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  the disk.** read
cf60: 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74   should occur at
cf70: 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   that point..*/.
cf80: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
cf90: 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  GetPage(.  BtSha
cfa0: 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
cfb0: 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
cfc0: 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
cfd0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
cfe0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
cff0: 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61  fetch */.  MemPa
d000: 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
d010: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  /* Return the pa
d020: 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d  ge in this param
d030: 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  eter */.  int fl
d040: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
d050: 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  * PAGER_GET_NOCO
d060: 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47  NTENT or PAGER_G
d070: 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29  ET_READONLY */.)
d080: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62  {.  int rc;.  Db
d090: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a  Page *pDbPage;..
d0a0: 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
d0b0: 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47  =0 || flags==PAG
d0c0: 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
d0d0: 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52   || flags==PAGER
d0e0: 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b  _GET_READONLY );
d0f0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d100: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
d110: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
d120: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
d130: 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61  Acquire(pBt->pPa
d140: 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61  ger, pgno, (DbPa
d150: 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66  ge**)&pDbPage, f
d160: 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20  lags);.  if( rc 
d170: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
d180: 70 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61  ppPage = btreePa
d190: 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
d1a0: 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
d1b0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
d1c0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
d1d0: 65 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66  etrieve a page f
d1e0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61  rom the pager ca
d1f0: 63 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75  che. If the requ
d200: 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
d210: 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20  t.** already in 
d220: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
d230: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69  return NULL. Ini
d240: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
d250: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
d260: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
d270: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
d280: 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61  .*/.static MemPa
d290: 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f  ge *btreePageLoo
d2a0: 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  kup(BtShared *pB
d2b0: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
d2c0: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
d2d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
d2e0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
d2f0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
d300: 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65  pDbPage = sqlite
d310: 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74  3PagerLookup(pBt
d320: 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  ->pPager, pgno);
d330: 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29  .  if( pDbPage )
d340: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  {.    return btr
d350: 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
d360: 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
d370: 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pBt);.  }.  retu
d380: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
d390: 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
d3a0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
d3b0: 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66  ile in pages. If
d3c0: 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69   there is any ki
d3d0: 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20  nd of.** error, 
d3e0: 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65  return ((unsigne
d3f0: 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74  d int)-1)..*/.st
d400: 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50  atic Pgno btreeP
d410: 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65  agecount(BtShare
d420: 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72  d *pBt){.  retur
d430: 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a  n pBt->nPage;.}.
d440: 75 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65  u32 sqlite3Btree
d450: 4c 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a  LastPage(Btree *
d460: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  p){.  assert( sq
d470: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
d480: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
d490: 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e  ert( ((p->pBt->n
d4a0: 50 61 67 65 29 26 30 78 38 30 30 30 30 30 30 29  Page)&0x8000000)
d4b0: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
d4c0: 28 69 6e 74 29 62 74 72 65 65 50 61 67 65 63 6f  (int)btreePageco
d4d0: 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a  unt(p->pBt);.}..
d4e0: 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
d4f0: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
d500: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  and initialize i
d510: 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
d520: 20 69 73 20 6a 75 73 74 20 61 0a 2a 2a 20 63 6f   is just a.** co
d530: 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65  nvenience wrappe
d540: 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61 74  r around separat
d550: 65 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65  e calls to btree
d560: 47 65 74 50 61 67 65 28 29 20 61 6e 64 20 0a 2a  GetPage() and .*
d570: 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  * btreeInitPage(
d580: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  )..**.** If an e
d590: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
d5a0: 6e 20 74 68 65 20 76 61 6c 75 65 20 2a 70 70 50  n the value *ppP
d5b0: 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 69 73  age is set to is
d5c0: 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a   undefined. It.*
d5d0: 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e 63  * may remain unc
d5e0: 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d 61  hanged, or it ma
d5f0: 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20 69  y be set to an i
d600: 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f  nvalid value..*/
d610: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 41  .static int getA
d620: 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74  ndInitPage(.  Bt
d630: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
d640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d650: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
d660: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
d670: 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
d680: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
d690: 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
d6a0: 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67   get */.  MemPag
d6b0: 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
d6c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
d6d0: 74 65 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e  te the page poin
d6e0: 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ter here */.  in
d6f0: 74 20 62 52 65 61 64 6f 6e 6c 79 20 20 20 20 20  t bReadonly     
d700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d710: 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
d720: 4e 4c 59 20 6f 72 20 30 20 2a 2f 0a 29 7b 0a 20  NLY or 0 */.){. 
d730: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
d740: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
d750: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
d760: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 62  ) );.  assert( b
d770: 52 65 61 64 6f 6e 6c 79 3d 3d 50 41 47 45 52 5f  Readonly==PAGER_
d780: 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 7c 7c 20  GET_READONLY || 
d790: 62 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 29 3b 0a  bReadonly==0 );.
d7a0: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65  .  if( pgno>btre
d7b0: 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
d7c0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
d7d0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d7e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
d7f0: 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
d800: 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67  pBt, pgno, ppPag
d810: 65 2c 20 62 52 65 61 64 6f 6e 6c 79 29 3b 0a 20  e, bReadonly);. 
d820: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
d830: 45 5f 4f 4b 20 26 26 20 28 2a 70 70 50 61 67 65  E_OK && (*ppPage
d840: 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b 0a  )->isInit==0 ){.
d850: 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
d860: 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65  InitPage(*ppPage
d870: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
d880: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d890: 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
d8a0: 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
d8b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
d8c0: 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d   testcase( pgno=
d8d0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d8e0: 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53  pgno!=0 || rc==S
d8f0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b  QLITE_CORRUPT );
d900: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d910: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
d920: 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20   MemPage.  This 
d930: 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
d940: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70   once for each p
d950: 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  rior.** call to 
d960: 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f  btreeGetPage..*/
d970: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
d980: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
d990: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20   *pPage){.  if( 
d9a0: 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73  pPage ){.    ass
d9b0: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
d9c0: 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
d9d0: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
d9e0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
d9f0: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
da00: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
da10: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
da20: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
da30: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
da40: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
da50: 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  e)==pPage->aData
da60: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
da70: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
da80: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
da90: 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c  utex) );.    sql
daa0: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
dab0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
dac0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72    }.}../*.** Dur
dad0: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
dae0: 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72  when the pager r
daf0: 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69  eloads informati
db00: 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  on into the cach
db10: 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65  e.** so that the
db20: 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72   cache is restor
db30: 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
db40: 61 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20  al state at the 
db50: 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20  start of.** the 
db60: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72  transaction, for
db70: 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f   each page resto
db80: 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  red this routine
db90: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
dba0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e  * This routine n
dbb0: 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68  eeds to reset th
dbc0: 65 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63  e extra data sec
dbd0: 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20  tion at the end 
dbe0: 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  of the.** page t
dbf0: 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65  o agree with the
dc00: 20 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a   restored data..
dc10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
dc20: 61 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65  ageReinit(DbPage
dc30: 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50   *pData){.  MemP
dc40: 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50  age *pPage;.  pP
dc50: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a  age = (MemPage *
dc60: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
dc70: 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20  Extra(pData);.  
dc80: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
dc90: 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
dca0: 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69  (pData)>0 );.  i
dcb0: 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  f( pPage->isInit
dcc0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
dcd0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
dce0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
dcf0: 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61  utex) );.    pPa
dd00: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
dd10: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
dd20: 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
dd30: 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20  (pData)>1 ){.   
dd40: 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68     /* pPage migh
dd50: 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65  t not be a btree
dd60: 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74   page;  it might
dd70: 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
dd80: 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72  page.      ** or
dd90: 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20   ptrmap page or 
dda0: 61 20 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e  a free page.  In
ddb0: 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68   those cases, th
ddc0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20  e following.    
ddd0: 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72    ** call to btr
dde0: 65 65 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c  eeInitPage() wil
ddf0: 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20  l likely return 
de00: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a  SQLITE_CORRUPT..
de10: 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20        ** But no 
de20: 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20  harm is done by 
de30: 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73  this.  And it is
de40: 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20   very important 
de50: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74  that.      ** bt
de60: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 62 65  reeInitPage() be
de70: 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79   called on every
de80: 20 62 74 72 65 65 20 70 61 67 65 20 73 6f 20 77   btree page so w
de90: 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20  e make.      ** 
dea0: 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65  the call for eve
deb0: 72 79 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d  ry page that com
dec0: 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69  es in for re-ini
ded0: 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62  ting. */.      b
dee0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
def0: 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ge);.    }.  }.}
df00: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
df10: 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
df20: 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a  for a btree..*/.
df30: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
df40: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
df50: 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  r(void *pArg){. 
df60: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
df70: 20 28 42 74 53 68 61 72 65 64 2a 29 70 41 72 67   (BtShared*)pArg
df80: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
df90: 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >db );.  assert(
dfa0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
dfb0: 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74  eld(pBt->db->mut
dfc0: 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ex) );.  return 
dfd0: 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73  sqlite3InvokeBus
dfe0: 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64  yHandler(&pBt->d
dff0: 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b  b->busyHandler);
e000: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
e010: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
e020: 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65  ** .** zFilename
e030: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
e040: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
e050: 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  e.  If zFilename
e060: 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e   is NULL.** then
e070: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61   an ephemeral da
e080: 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65  tabase is create
e090: 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72 61  d.  The ephemera
e0a0: 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67 68 74  l database might
e0b0: 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65  .** be exclusive
e0c0: 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72  ly in memory, or
e0d0: 20 69 74 20 6d 69 67 68 74 20 75 73 65 20 61 20   it might use a 
e0e0: 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72  disk-based memor
e0f0: 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68  y cache..** Eith
e100: 65 72 20 77 61 79 2c 20 74 68 65 20 65 70 68 65  er way, the ephe
e110: 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 77  meral database w
e120: 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
e130: 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a  ally deleted .**
e140: 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72   when sqlite3Btr
e150: 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c  eeClose() is cal
e160: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  led..**.** If zF
e170: 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
e180: 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e  ory:" then an in
e190: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
e1a0: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74   is created.** t
e1b0: 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63  hat is automatic
e1c0: 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77  ally destroyed w
e1d0: 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
e1e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61  ..**.** The "fla
e1f0: 67 73 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  gs" parameter is
e200: 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20   a bitmask that 
e210: 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69  might contain bi
e220: 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45 45  ts like.** BTREE
e230: 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e  _OMIT_JOURNAL an
e240: 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f 52  d/or BTREE_MEMOR
e250: 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  Y..**.** If the 
e260: 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65  database is alre
e270: 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68  ady opened in th
e280: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
e290: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e  connection.** an
e2a0: 64 20 77 65 20 61 72 65 20 69 6e 20 73 68 61 72  d we are in shar
e2b0: 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed cache mode, t
e2c0: 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c  hen the open wil
e2d0: 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a  l fail with an.*
e2e0: 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  * SQLITE_CONSTRA
e2f0: 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63  INT error.  We c
e300: 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20  annot allow two 
e310: 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64  or more BtShared
e320: 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74  .** objects in t
e330: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
e340: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63   connection sinc
e350: 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20  e doing so will 
e360: 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c  lead.** to probl
e370: 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67  ems with locking
e380: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e390: 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c  BtreeOpen(.  sql
e3a0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
e3b0: 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75       /* VFS to u
e3c0: 73 65 20 66 6f 72 20 74 68 69 73 20 62 2d 74 72  se for this b-tr
e3d0: 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ee */.  const ch
e3e0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
e3f0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
e400: 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ile containing t
e410: 68 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73  he BTree databas
e420: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
e430: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  db,            /
e440: 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74  * Associated dat
e450: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
e460: 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65    Btree **ppBtre
e470: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  e,        /* Poi
e480: 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65  nter to new Btre
e490: 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e  e object written
e4a0: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
e4b0: 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
e4c0: 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f     /* Options */
e4d0: 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  .  int vfsFlags 
e4e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
e4f0: 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
e500: 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66  gh to sqlite3_vf
e510: 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a  s.xOpen() */.){.
e520: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
e530: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
e540: 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20   /* Shared part 
e550: 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75  of btree structu
e560: 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70  re */.  Btree *p
e570: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e580: 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
e590: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
e5a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
e5b0: 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f  utexOpen = 0;  /
e5c0: 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72 61 63  * Prevents a rac
e5d0: 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63  e condition. Tic
e5e0: 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69  ket #3537 */.  i
e5f0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
e600: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  K;            /*
e610: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f   Result code fro
e620: 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  m this function 
e630: 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65  */.  u8 nReserve
e640: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e650: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75      /* Byte of u
e660: 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65  nused space on e
e670: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e  ach page */.  un
e680: 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48  signed char zDbH
e690: 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20  eader[100];  /* 
e6a0: 44 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20  Database header 
e6b0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a  content */..  /*
e6c0: 20 54 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67   True if opening
e6d0: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74   an ephemeral, t
e6e0: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
e6f0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  e */.  const int
e700: 20 69 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c   isTempDb = zFil
e710: 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c  ename==0 || zFil
e720: 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20  ename[0]==0;..  
e730: 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61  /* Set the varia
e740: 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74  ble isMemdb to t
e750: 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  rue for an in-me
e760: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f  mory database, o
e770: 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f  r .  ** false fo
e780: 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64  r a file-based d
e790: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69  atabase..  */.#i
e7a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
e7b0: 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73  _MEMORYDB.  cons
e7c0: 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20  t int isMemdb = 
e7d0: 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74  0;.#else.  const
e7e0: 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 28   int isMemdb = (
e7f0: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 73 74 72  zFilename && str
e800: 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  cmp(zFilename, "
e810: 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20  :memory:")==0). 
e820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e830: 20 20 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70        || (isTemp
e840: 44 62 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d  Db && sqlite3Tem
e850: 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a 20  pInMemory(db)). 
e860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e870: 20 20 20 20 20 20 7c 7c 20 28 76 66 73 46 6c 61        || (vfsFla
e880: 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
e890: 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e  _MEMORY)!=0;.#en
e8a0: 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64  dif..  assert( d
e8b0: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
e8c0: 28 20 70 56 66 73 21 3d 30 20 29 3b 0a 20 20 61  ( pVfs!=0 );.  a
e8d0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
e8e0: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
e8f0: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
e900: 28 20 28 66 6c 61 67 73 26 30 78 66 66 29 3d 3d  ( (flags&0xff)==
e910: 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c  flags );   /* fl
e920: 61 67 73 20 66 69 74 20 69 6e 20 38 20 62 69 74  ags fit in 8 bit
e930: 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20  s */..  /* Only 
e940: 61 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64  a BTREE_SINGLE d
e950: 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 42  atabase can be B
e960: 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a  TREE_UNORDERED *
e970: 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  /.  assert( (fla
e980: 67 73 20 26 20 42 54 52 45 45 5f 55 4e 4f 52 44  gs & BTREE_UNORD
e990: 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61  ERED)==0 || (fla
e9a0: 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c  gs & BTREE_SINGL
e9b0: 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  E)!=0 );..  /* A
e9c0: 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61   BTREE_SINGLE da
e9d0: 74 61 62 61 73 65 20 69 73 20 61 6c 77 61 79 73  tabase is always
e9e0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64   a temporary and
e9f0: 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f  /or ephemeral */
ea00: 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
ea10: 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  s & BTREE_SINGLE
ea20: 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44 62  )==0 || isTempDb
ea30: 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65 6d   );..  if( isMem
ea40: 64 62 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20  db ){.    flags 
ea50: 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b  |= BTREE_MEMORY;
ea60: 0a 20 20 7d 0a 20 20 69 66 28 20 28 76 66 73 46  .  }.  if( (vfsF
ea70: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
ea80: 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26  EN_MAIN_DB)!=0 &
ea90: 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73  & (isMemdb || is
eaa0: 54 65 6d 70 44 62 29 20 29 7b 0a 20 20 20 20 76  TempDb) ){.    v
eab0: 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c  fsFlags = (vfsFl
eac0: 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50  ags & ~SQLITE_OP
ead0: 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51  EN_MAIN_DB) | SQ
eae0: 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
eaf0: 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c  B;.  }.  p = sql
eb00: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
eb10: 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20  izeof(Btree));. 
eb20: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72   if( !p ){.    r
eb30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
eb40: 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54  EM;.  }.  p->inT
eb50: 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
eb60: 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  E;.  p->db = db;
eb70: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
eb80: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
eb90: 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72  E.  p->lock.pBtr
eba0: 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63  ee = p;.  p->loc
ebb0: 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65  k.iTable = 1;.#e
ebc0: 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
ebd0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
ebe0: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
ebf0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
ec00: 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
ec10: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42  *.  ** If this B
ec20: 74 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64  tree is a candid
ec30: 61 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63  ate for shared c
ec40: 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e  ache, try to fin
ec50: 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69  d an.  ** existi
ec60: 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ng BtShared obje
ec70: 63 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73  ct that we can s
ec80: 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20  hare with.  */. 
ec90: 20 69 66 28 20 69 73 54 65 6d 70 44 62 3d 3d 30   if( isTempDb==0
eca0: 20 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20   && (isMemdb==0 
ecb0: 7c 7c 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c  || (vfsFlags&SQL
ecc0: 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30  ITE_OPEN_URI)!=0
ecd0: 29 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73  ) ){.    if( vfs
ece0: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
ecf0: 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20  PEN_SHAREDCACHE 
ed00: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75  ){.      int nFu
ed10: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66  llPathname = pVf
ed20: 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
ed30: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75  .      char *zFu
ed40: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
ed50: 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c  ite3Malloc(nFull
ed60: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
ed70: 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
ed80: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
ed90: 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20  exShared; ).    
eda0: 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
edb0: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46  1;.      if( !zF
edc0: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
edd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
ede0: 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
edf0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
ee00: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
ee10: 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29     if( isMemdb )
ee20: 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
ee30: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
ee40: 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69 74  zFilename, sqlit
ee50: 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
ee60: 6e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 20 20  name)+1);.      
ee70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
ee80: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c  c = sqlite3OsFul
ee90: 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
eea0: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
eeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 46                nF
eed0: 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75  ullPathname, zFu
eee0: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
eef0: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
ef00: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ef10: 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
ef20: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
ef30: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
ef40: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
ef50: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
ef60: 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49        }.#if SQLI
ef70: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20  TE_THREADSAFE.  
ef80: 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20      mutexOpen = 
ef90: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
efa0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
efb0: 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20  TATIC_OPEN);.   
efc0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
efd0: 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e  _enter(mutexOpen
efe0: 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68  );.      mutexSh
eff0: 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
f000: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
f010: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
f020: 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TER);.      sqli
f030: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
f040: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 23 65  mutexShared);.#e
f050: 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28 70  ndif.      for(p
f060: 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  Bt=GLOBAL(BtShar
f070: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
f080: 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74  dCacheList); pBt
f090: 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74  ; pBt=pBt->pNext
f0a0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
f0b0: 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29  t( pBt->nRef>0 )
f0c0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d  ;.        if( 0=
f0d0: 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74  =strcmp(zFullPat
f0e0: 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61  hname, sqlite3Pa
f0f0: 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d  gerFilename(pBt-
f100: 3e 70 50 61 67 65 72 2c 20 30 29 29 0a 20 20 20  >pPager, 0)).   
f110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
f120: 20 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73   sqlite3PagerVfs
f130: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70  (pBt->pPager)==p
f140: 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Vfs ){.         
f150: 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20   int iDb;.      
f160: 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e      for(iDb=db->
f170: 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69  nDb-1; iDb>=0; i
f180: 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20  Db--){.         
f190: 20 20 20 42 74 72 65 65 20 2a 70 45 78 69 73 74     Btree *pExist
f1a0: 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  ing = db->aDb[iD
f1b0: 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20  b].pBt;.        
f1c0: 20 20 20 20 69 66 28 20 70 45 78 69 73 74 69 6e      if( pExistin
f1d0: 67 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e  g && pExisting->
f1e0: 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20  pBt==pBt ){.    
f1f0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f200: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
f210: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
f220: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f230: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
f240: 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  texOpen);.      
f250: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
f260: 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
f270: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
f280: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
f290: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p);.            
f2a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f2b0: 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20  CONSTRAINT;.    
f2c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f2d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
f2e0: 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  p->pBt = pBt;.  
f2f0: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65          pBt->nRe
f300: 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62  f++;.          b
f310: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
f320: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
f330: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
f340: 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
f350: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
f360: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
f370: 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
f380: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
f390: 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20   else{.      /* 
f3a0: 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77  In debug mode, w
f3b0: 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69  e mark all persi
f3c0: 73 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20  stent databases 
f3d0: 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20  as sharable.    
f3e0: 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74    ** even when t
f3f0: 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68  hey are not.  Th
f400: 69 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65  is exercises the
f410: 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e   locking code an
f420: 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73  d.      ** gives
f430: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
f440: 79 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71  y for asserts(sq
f450: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
f460: 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ()).      ** sta
f470: 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20  tements to find 
f480: 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73  locking problems
f490: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
f4a0: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31   p->sharable = 1
f4b0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
f4c0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
f4d0: 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pBt==0 ){.    /*
f4e0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
f4f0: 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61  owing asserts ma
f500: 6b 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72  ke sure that str
f510: 75 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20  uctures used by 
f520: 74 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20  the btree are.  
f530: 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73    ** the right s
f540: 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f  ize.  This is to
f550: 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73   guard against s
f560: 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74  ize changes that
f570: 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77   result.    ** w
f580: 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e  hen compiling on
f590: 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63   a different arc
f5a0: 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a  hitecture..    *
f5b0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  /.    assert( si
f5c0: 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20  zeof(i64)==8 || 
f5d0: 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29  sizeof(i64)==4 )
f5e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
f5f0: 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20  zeof(u64)==8 || 
f600: 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29  sizeof(u64)==4 )
f610: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
f620: 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a  zeof(u32)==4 );.
f630: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
f640: 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20  of(u16)==2 );.  
f650: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
f660: 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a  (Pgno)==4 );.  .
f670: 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65      pBt = sqlite
f680: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
f690: 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20  eof(*pBt) );.   
f6a0: 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
f6b0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
f6c0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
f6d0: 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
f6e0: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
f6f0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
f700: 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70  en(pVfs, &pBt->p
f710: 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65  Pager, zFilename
f720: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f730: 20 20 20 20 20 20 20 20 20 20 20 20 45 58 54 52              EXTR
f740: 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76  A_SIZE, flags, v
f750: 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69  fsFlags, pageRei
f760: 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nit);.    if( rc
f770: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
f780: 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
f790: 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42  rSetMmapLimit(pB
f7a0: 74 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e 73  t->pPager, db->s
f7b0: 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20 72 63  zMmap);.      rc
f7c0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
f7d0: 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42  eadFileheader(pB
f7e0: 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66  t->pPager,sizeof
f7f0: 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48  (zDbHeader),zDbH
f800: 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  eader);.    }.  
f810: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
f820: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
f830: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
f840: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
f850: 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38  >openFlags = (u8
f860: 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d  )flags;.    pBt-
f870: 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71  >db = db;.    sq
f880: 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
f890: 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50  yhandler(pBt->pP
f8a0: 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b  ager, btreeInvok
f8b0: 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42  eBusyHandler, pB
f8c0: 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d  t);.    p->pBt =
f8d0: 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74   pBt;.  .    pBt
f8e0: 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->pCursor = 0;. 
f8f0: 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
f900: 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
f910: 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
f920: 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  ly(pBt->pPager) 
f930: 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
f940: 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
f950: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
f960: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
f970: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
f980: 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  |= BTS_SECURE_DE
f990: 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20  LETE;.#endif.   
f9a0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
f9b0: 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c   (zDbHeader[16]<
f9c0: 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72  <8) | (zDbHeader
f9d0: 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69  [17]<<16);.    i
f9e0: 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  f( pBt->pageSize
f9f0: 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67  <512 || pBt->pag
fa00: 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
fa10: 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20  _PAGE_SIZE.     
fa20: 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61      || ((pBt->pa
fa30: 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70  geSize-1)&pBt->p
fa40: 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20  ageSize)!=0 ){. 
fa50: 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
fa60: 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  ze = 0;.#ifndef 
fa70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
fa80: 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20  VACUUM.      /* 
fa90: 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d  If the magic nam
faa0: 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c  e ":memory:" wil
fab0: 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d  l create an in-m
fac0: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
fad0: 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65  then.      ** le
fae0: 61 76 65 20 74 68 65 20 61 75 74 6f 56 61 63 75  ave the autoVacu
faf0: 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f  um mode at 0 (do
fb00: 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d   not auto-vacuum
fb10: 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20  ), even if.     
fb20: 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55   ** SQLITE_DEFAU
fb30: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73  LT_AUTOVACUUM is
fb40: 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74   true. On the ot
fb50: 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20  her hand, if.   
fb60: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49     ** SQLITE_OMI
fb70: 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62  T_MEMORYDB has b
fb80: 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65  een defined, the
fb90: 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20  n ":memory:" is 
fba0: 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20  just a.      ** 
fbb0: 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d  regular file-nam
fbc0: 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
fbd0: 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
fbe0: 61 70 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e  applies as per n
fbf0: 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a  ormal..      */.
fc00: 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e        if( zFilen
fc10: 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20  ame && !isMemdb 
fc20: 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
fc30: 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51  autoVacuum = (SQ
fc40: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
fc50: 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29  OVACUUM ? 1 : 0)
fc60: 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  ;.        pBt->i
fc70: 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c  ncrVacuum = (SQL
fc80: 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
fc90: 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20  VACUUM==2 ? 1 : 
fca0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  0);.      }.#end
fcb0: 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76  if.      nReserv
fcc0: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 0;.    }else
fcd0: 7b 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65  {.      nReserve
fce0: 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d   = zDbHeader[20]
fcf0: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  ;.      pBt->bts
fd00: 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47  Flags |= BTS_PAG
fd10: 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66  ESIZE_FIXED;.#if
fd20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
fd30: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
fd40: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
fd50: 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
fd60: 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a  DbHeader[36 + 4*
fd70: 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20  4])?1:0);.      
fd80: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
fd90: 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62  = (get4byte(&zDb
fda0: 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d  Header[36 + 7*4]
fdb0: 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20  )?1:0);.#endif. 
fdc0: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
fdd0: 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
fde0: 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
fdf0: 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
fe00: 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  e, nReserve);.  
fe10: 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
fe20: 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
fe30: 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
fe40: 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  ize = pBt->pageS
fe50: 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a  ize - nReserve;.
fe60: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
fe70: 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d  ->pageSize & 7)=
fe80: 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65  =0 );  /* 8-byte
fe90: 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61   alignment of pa
fea0: 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69  geSize */.   .#i
feb0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
fec0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
fed0: 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
fee0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
fef0: 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20  KIO).    /* Add 
ff00: 74 68 65 20 6e 65 77 20 42 74 53 68 61 72 65 64  the new BtShared
ff10: 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c   object to the l
ff20: 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61  inked list shara
ff30: 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20  ble BtShareds.. 
ff40: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
ff50: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
ff60: 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
ff70: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
ff80: 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20  utexShared; ).  
ff90: 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20      pBt->nRef = 
ffa0: 31 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c  1;.      MUTEX_L
ffb0: 4f 47 49 43 28 20 6d 75 74 65 78 53 68 61 72 65  OGIC( mutexShare
ffc0: 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  d = sqlite3Mutex
ffd0: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
ffe0: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
fff0: 29 3b 29 0a 20 20 20 20 20 20 69 66 28 20 53 51  );).      if( SQ
10000 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
10010 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
10020 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
10030 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  x ){.        pBt
10040 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
10050 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
10060 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
10070 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d          if( pBt-
10080 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
10090 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
100a0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
100b0 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
100c0 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  iled = 0;.      
100d0 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
100e0 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  pen_out;.       
100f0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
10100 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
10110 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64  nter(mutexShared
10120 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e  );.      pBt->pN
10130 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ext = GLOBAL(BtS
10140 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
10150 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
10160 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
10170 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
10180 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
10190 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69   pBt;.      sqli
101a0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
101b0 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
101c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
101d0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
101e0 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
101f0 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
10200 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
10210 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74  ISKIO).  /* If t
10220 68 65 20 6e 65 77 20 42 74 72 65 65 20 75 73 65  he new Btree use
10230 73 20 61 20 73 68 61 72 61 62 6c 65 20 70 42 74  s a sharable pBt
10240 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e  Shared, then lin
10250 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42  k the new.  ** B
10260 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69  tree into the li
10270 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62  st of all sharab
10280 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20 74 68  le Btrees for th
10290 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f  e same connectio
102a0 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74  n..  ** The list
102b0 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65   is kept in asce
102c0 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70  nding order by p
102d0 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f  Bt address..  */
102e0 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62  .  if( p->sharab
102f0 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  le ){.    int i;
10300 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53 69 62  .    Btree *pSib
10310 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
10320 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
10330 20 20 20 20 20 20 69 66 28 20 28 70 53 69 62 20        if( (pSib 
10340 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
10350 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68  )!=0 && pSib->sh
10360 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
10370 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70    while( pSib->p
10380 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70  Prev ){ pSib = p
10390 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20  Sib->pPrev; }.  
103a0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74        if( p->pBt
103b0 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20  <pSib->pBt ){.  
103c0 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
103d0 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
103e0 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b     p->pPrev = 0;
103f0 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
10400 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
10410 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10420 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
10430 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d  ->pNext && pSib-
10440 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70  >pNext->pBt<p->p
10450 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
10460 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70    pSib = pSib->p
10470 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
10480 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  }.          p->p
10490 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65  Next = pSib->pNe
104a0 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  xt;.          p-
104b0 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20  >pPrev = pSib;. 
104c0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
104d0 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
104e0 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70       p->pNext->p
104f0 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
10500 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
10510 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  pSib->pNext = p;
10520 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10530 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
10540 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
10550 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20  if.  *ppBtree = 
10560 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  p;..btree_open_o
10570 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ut:.  if( rc!=SQ
10580 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
10590 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  f( pBt && pBt->p
105a0 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73  Pager ){.      s
105b0 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
105c0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
105d0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
105e0 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20  _free(pBt);.    
105f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
10600 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20  .    *ppBtree = 
10610 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
10620 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72 65 65  /* If the B-Tree
10630 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
10640 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68  y opened, set th
10650 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69  e pager-cache si
10660 7a 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  ze to the.    **
10670 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20   default value. 
10680 45 78 63 65 70 74 2c 20 77 68 65 6e 20 6f 70 65  Except, when ope
10690 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73 74  ning on an exist
106a0 69 6e 67 20 73 68 61 72 65 64 20 70 61 67 65 72  ing shared pager
106b0 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64  -cache,.    ** d
106c0 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65  o not change the
106d0 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a   pager-cache siz
106e0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
106f0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63  ( sqlite3BtreeSc
10700 68 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30  hema(p, 0, 0)==0
10710 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10720 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
10730 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  ze(p->pBt->pPage
10740 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  r, SQLITE_DEFAUL
10750 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20  T_CACHE_SIZE);. 
10760 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d     }.  }.  if( m
10770 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20  utexOpen ){.    
10780 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
10790 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78  mutex_held(mutex
107a0 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c  Open) );.    sql
107b0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
107c0 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d  (mutexOpen);.  }
107d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
107e0 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74  ./*.** Decrement
107f0 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
10800 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65  ef counter.  Whe
10810 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a 65 72  n it reaches zer
10820 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65  o,.** remove the
10830 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
10840 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61  ure from the sha
10850 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75  ring list.  Retu
10860 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68  rn.** true if th
10870 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20  e BtShared.nRef 
10880 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73 20  counter reaches 
10890 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a  zero and return.
108a0 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ** false if it i
108b0 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65  s still positive
108c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
108d0 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e  removeFromSharin
108e0 67 4c 69 73 74 28 42 74 53 68 61 72 65 64 20 2a  gList(BtShared *
108f0 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  pBt){.#ifndef SQ
10900 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
10910 5f 43 41 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c  _CACHE.  MUTEX_L
10920 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
10930 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a  tex *pMaster; ).
10940 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73    BtShared *pLis
10950 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64  t;.  int removed
10960 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
10970 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e   sqlite3_mutex_n
10980 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  otheld(pBt->mute
10990 78 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f  x) );.  MUTEX_LO
109a0 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73  GIC( pMaster = s
109b0 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
109c0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
109d0 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a  ATIC_MASTER); ).
109e0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
109f0 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
10a00 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pBt->nRef--;. 
10a10 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d   if( pBt->nRef<=
10a20 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f  0 ){.    if( GLO
10a30 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
10a40 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
10a50 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20  List)==pBt ){.  
10a60 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61      GLOBAL(BtSha
10a70 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
10a80 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70  edCacheList) = p
10a90 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  Bt->pNext;.    }
10aa0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73  else{.      pLis
10ab0 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  t = GLOBAL(BtSha
10ac0 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
10ad0 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20  edCacheList);.  
10ae0 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59      while( ALWAY
10af0 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73  S(pList) && pLis
10b00 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b  t->pNext!=pBt ){
10b10 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70  .        pList=p
10b20 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  List->pNext;.   
10b30 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41     }.      if( A
10b40 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a  LWAYS(pList) ){.
10b50 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70          pList->p
10b60 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78  Next = pBt->pNex
10b70 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
10b80 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
10b90 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20  THREADSAFE ){.  
10ba0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
10bb0 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65  x_free(pBt->mute
10bc0 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  x);.    }.    re
10bd0 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  moved = 1;.  }. 
10be0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
10bf0 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  eave(pMaster);. 
10c00 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b   return removed;
10c10 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
10c20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  1;.#endif.}../*.
10c30 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74  ** Make sure pBt
10c40 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e  ->pTmpSpace poin
10c50 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74  ts to an allocat
10c60 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45  ion of .** MX_CE
10c70 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74  LL_SIZE(pBt) byt
10c80 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
10c90 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53  id allocateTempS
10ca0 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
10cb0 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d  Bt){.  if( !pBt-
10cc0 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20  >pTmpSpace ){.  
10cd0 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
10ce0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61   = sqlite3PageMa
10cf0 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53  lloc( pBt->pageS
10d00 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f  ize );..    /* O
10d10 6e 65 20 6f 66 20 74 68 65 20 75 73 65 73 20 6f  ne of the uses o
10d20 66 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  f pBt->pTmpSpace
10d30 20 69 73 20 74 6f 20 66 6f 72 6d 61 74 20 63 65   is to format ce
10d40 6c 6c 73 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  lls before.    *
10d50 2a 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65 6d  * inserting them
10d60 20 69 6e 74 6f 20 61 20 6c 65 61 66 20 70 61 67   into a leaf pag
10d70 65 20 28 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c  e (function fill
10d80 49 6e 43 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20  InCell()). If.  
10d90 20 20 2a 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c    ** a cell is l
10da0 65 73 73 20 74 68 61 6e 20 34 20 62 79 74 65 73  ess than 4 bytes
10db0 20 69 6e 20 73 69 7a 65 2c 20 69 74 20 69 73 20   in size, it is 
10dc0 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20  rounded up to 4 
10dd0 62 79 74 65 73 0a 20 20 20 20 2a 2a 20 62 79 20  bytes.    ** by 
10de0 74 68 65 20 76 61 72 69 6f 75 73 20 72 6f 75 74  the various rout
10df0 69 6e 65 73 20 74 68 61 74 20 6d 61 6e 69 70 75  ines that manipu
10e00 6c 61 74 65 20 62 69 6e 61 72 79 20 63 65 6c 6c  late binary cell
10e10 73 2e 20 57 68 69 63 68 0a 20 20 20 20 2a 2a 20  s. Which.    ** 
10e20 63 61 6e 20 6d 65 61 6e 20 74 68 61 74 20 66 69  can mean that fi
10e30 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20  llInCell() only 
10e40 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20  initializes the 
10e50 66 69 72 73 74 20 32 20 6f 72 20 33 0a 20 20 20  first 2 or 3.   
10e60 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 54 6d   ** bytes of pTm
10e70 70 53 70 61 63 65 2c 20 62 75 74 20 74 68 61 74  pSpace, but that
10e80 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
10e90 65 73 20 61 72 65 20 63 6f 70 69 65 64 20 66 72  es are copied fr
10ea0 6f 6d 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74  om.    ** it int
10eb0 6f 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  o a database pag
10ec0 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  e. This is not a
10ed0 63 74 75 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65  ctually a proble
10ee0 6d 2c 20 62 75 74 20 69 74 0a 20 20 20 20 2a 2a  m, but it.    **
10ef0 20 64 6f 65 73 20 63 61 75 73 65 20 61 20 76 61   does cause a va
10f00 6c 67 72 69 6e 64 20 65 72 72 6f 72 20 77 68 65  lgrind error whe
10f10 6e 20 74 68 65 20 31 20 6f 72 20 32 20 62 79 74  n the 1 or 2 byt
10f20 65 73 20 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65  es of unitialize
10f30 64 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 69  d .    ** data i
10f40 73 20 70 61 73 73 65 64 20 74 6f 20 73 79 73 74  s passed to syst
10f50 65 6d 20 63 61 6c 6c 20 77 72 69 74 65 28 29 2e  em call write().
10f60 20 53 6f 20 74 6f 20 61 76 6f 69 64 20 74 68 69   So to avoid thi
10f70 73 20 65 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20  s error,.    ** 
10f80 7a 65 72 6f 20 74 68 65 20 66 69 72 73 74 20 34  zero the first 4
10f90 20 62 79 74 65 73 20 6f 66 20 74 65 6d 70 20 73   bytes of temp s
10fa0 70 61 63 65 20 68 65 72 65 2e 20 20 2a 2f 0a 20  pace here.  */. 
10fb0 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70     if( pBt->pTmp
10fc0 53 70 61 63 65 20 29 20 6d 65 6d 73 65 74 28 70  Space ) memset(p
10fd0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 30  Bt->pTmpSpace, 0
10fe0 2c 20 34 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 4);.  }.}../*.
10ff0 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d  ** Free the pBt-
11000 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63  >pTmpSpace alloc
11010 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
11020 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61  void freeTempSpa
11030 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
11040 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ){.  sqlite3Page
11050 46 72 65 65 28 20 70 42 74 2d 3e 70 54 6d 70 53  Free( pBt->pTmpS
11060 70 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70 54  pace);.  pBt->pT
11070 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a  mpSpace = 0;.}..
11080 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f  /*.** Close an o
11090 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64  pen database and
110a0 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
110b0 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20  cursors..*/.int 
110c0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
110d0 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  e(Btree *p){.  B
110e0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
110f0 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f  ->pBt;.  BtCurso
11100 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43  r *pCur;..  /* C
11110 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
11120 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73   opened via this
11130 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61   handle.  */.  a
11140 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
11150 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
11160 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
11170 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
11180 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d  );.  pCur = pBt-
11190 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c  >pCursor;.  whil
111a0 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42  e( pCur ){.    B
111b0 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20  tCursor *pTmp = 
111c0 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d  pCur;.    pCur =
111d0 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
111e0 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72    if( pTmp->pBtr
111f0 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73  ee==p ){.      s
11200 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
11210 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20  Cursor(pTmp);.  
11220 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f    }.  }..  /* Ro
11230 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
11240 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
11250 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c  d free the handl
11260 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a  e structure..  *
11270 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  * The call to sq
11280 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
11290 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74  ck() drops any t
112a0 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20  able-locks held 
112b0 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e  by.  ** this han
112c0 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  dle..  */.  sqli
112d0 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
112e0 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  (p, SQLITE_OK);.
112f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
11300 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ave(p);..  /* If
11310 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c   there are still
11320 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69   other outstandi
11330 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
11340 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
11350 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65  e.  ** structure
11360 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68  , return now. Th
11370 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
11380 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c  his procedure cl
11390 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68  eans .  ** up th
113a0 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a  e shared-btree..
113b0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
113c0 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20  ->wantToLock==0 
113d0 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  && p->locked==0 
113e0 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  );.  if( !p->sha
113f0 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46  rable || removeF
11400 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70  romSharingList(p
11410 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  Bt) ){.    /* Th
11420 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67  e pBt is no long
11430 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e  er on the sharin
11440 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61  g list, so we ca
11450 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20  n access.    ** 
11460 69 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  it without havin
11470 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75  g to hold the mu
11480 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  tex..    **.    
11490 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64  ** Clean out and
114a0 20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53 68   delete the BtSh
114b0 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20  ared object..   
114c0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
114d0 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
114e0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
114f0 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
11500 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  er);.    if( pBt
11510 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26  ->xFreeSchema &&
11520 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b   pBt->pSchema ){
11530 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65  .      pBt->xFre
11540 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63  eSchema(pBt->pSc
11550 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hema);.    }.   
11560 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
11570 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  , pBt->pSchema);
11580 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
11590 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ce(pBt);.    sql
115a0 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
115b0 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
115c0 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
115d0 43 41 43 48 45 0a 20 20 61 73 73 65 72 74 28 20  CACHE.  assert( 
115e0 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
115f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
11600 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20  >locked==0 );.  
11610 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70  if( p->pPrev ) p
11620 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
11630 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28   p->pNext;.  if(
11640 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70   p->pNext ) p->p
11650 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
11660 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a  >pPrev;.#endif..
11670 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
11680 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
11690 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
116a0 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74  Change the limit
116b0 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   on the number o
116c0 66 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20  f pages allowed 
116d0 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a  in the cache..**
116e0 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  .** The maximum 
116f0 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20  number of cache 
11700 70 61 67 65 73 20 69 73 20 73 65 74 20 74 6f 20  pages is set to 
11710 74 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20  the absolute.** 
11720 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e  value of mxPage.
11730 20 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e    If mxPage is n
11740 65 67 61 74 69 76 65 2c 20 74 68 65 20 70 61 67  egative, the pag
11750 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61  er will.** opera
11760 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c  te asynchronousl
11770 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  y - it will not 
11780 73 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63  stop to do fsync
11790 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65  ()s.** to insure
117a0 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
117b0 20 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72   to the disk sur
117c0 66 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63  face before.** c
117d0 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e  ontinuing.  Tran
117e0 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77  sactions still w
117f0 6f 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f  ork if synchrono
11800 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e  us is off,.** an
11810 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  d the database c
11820 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  annot be corrupt
11830 65 64 20 69 66 20 74 68 69 73 20 70 72 6f 67 72  ed if this progr
11840 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20  am.** crashes.  
11850 42 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61  But if the opera
11860 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73  ting system cras
11870 68 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a  hes or there is.
11880 2a 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77  ** an abrupt pow
11890 65 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20  er failure when 
118a0 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  synchronous is o
118b0 66 66 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ff, the database
118c0 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66  .** could be lef
118d0 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73  t in an inconsis
118e0 74 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76  tent and unrecov
118f0 65 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a  erable state..**
11900 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   Synchronous is 
11910 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f  on by default so
11920 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
11930 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e  tion is not.** n
11940 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e  ormally a worry.
11950 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
11960 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
11970 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
11980 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72  xPage){.  BtShar
11990 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
119a0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
119b0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
119c0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
119d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
119e0 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
119f0 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
11a00 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
11a10 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
11a20 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
11a30 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11a40 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
11a50 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f  ange the limit o
11a60 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
11a70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
11a80 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a  e that may be.**
11a90 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a   memory mapped..
11aa0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
11ab0 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  reeSetMmapLimit(
11ac0 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65  Btree *p, sqlite
11ad0 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b  3_int64 szMmap){
11ae0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
11af0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
11b00 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
11b10 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
11b20 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
11b30 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
11b40 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
11b50 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d  etMmapLimit(pBt-
11b60 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29  >pPager, szMmap)
11b70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
11b80 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
11b90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11ba0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
11bb0 65 20 77 61 79 20 64 61 74 61 20 69 73 20 73 79  e way data is sy
11bc0 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20  nced to disk in 
11bd0 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73  order to increas
11be0 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a  e or decrease.**
11bf0 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61   how well the da
11c00 74 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64  tabase resists d
11c10 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
11c20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65  crashes and powe
11c30 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20  r.** failures.  
11c40 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73  Level 1 is the s
11c50 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e  ame as asynchron
11c60 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20  ous (no syncs() 
11c70 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65  occur and.** the
11c80 72 65 20 69 73 20 61 20 68 69 67 68 20 70 72 6f  re is a high pro
11c90 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
11ca0 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20  ge)  Level 2 is 
11cb0 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68  the default.  Th
11cc0 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79  ere.** is a very
11cd0 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72   low but non-zer
11ce0 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  o probability of
11cf0 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20   damage.  Level 
11d00 33 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a  3 reduces the.**
11d10 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
11d20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a  damage to near z
11d30 65 72 6f 20 62 75 74 20 77 69 74 68 20 61 20 77  ero but with a w
11d40 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  rite performance
11d50 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23   reduction..*/.#
11d60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11d70 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
11d80 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
11d90 65 53 65 74 50 61 67 65 72 46 6c 61 67 73 28 0a  eSetPagerFlags(.
11da0 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
11db0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
11dc0 62 74 72 65 65 20 74 6f 20 73 65 74 20 74 68 65  btree to set the
11dd0 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e   safety level on
11de0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70   */.  unsigned p
11df0 67 46 6c 61 67 73 20 20 20 20 20 20 20 2f 2a 20  gFlags       /* 
11e00 56 61 72 69 6f 75 73 20 50 41 47 45 52 5f 2a 20  Various PAGER_* 
11e10 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74  flags */.){.  Bt
11e20 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
11e30 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
11e40 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
11e50 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
11e60 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
11e70 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
11e80 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61  lite3PagerSetFla
11e90 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  gs(pBt->pPager, 
11ea0 70 67 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69  pgFlags);.  sqli
11eb0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
11ec0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
11ed0 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
11ee0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
11ef0 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 62  E if the given b
11f00 74 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 73  tree is set to s
11f10 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20 20  afety level 1.  
11f20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64  In other.** word
11f30 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69  s, return TRUE i
11f40 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63 75  f no sync() occu
11f50 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66  rs on the disk f
11f60 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iles..*/.int sql
11f70 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73  ite3BtreeSyncDis
11f80 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29 7b  abled(Btree *p){
11f90 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
11fa0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
11fb0 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73   rc;.  assert( s
11fc0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
11fd0 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
11fe0 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 42 74  );  .  sqlite3Bt
11ff0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
12000 73 73 65 72 74 28 20 70 42 74 20 26 26 20 70 42  ssert( pBt && pB
12010 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20 20 72  t->pPager );.  r
12020 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
12030 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61 67  Nosync(pBt->pPag
12040 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  er);.  sqlite3Bt
12050 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
12060 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
12070 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64 65  ** Change the de
12080 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65  fault pages size
12090 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
120a0 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65  of reserved byte
120b0 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f  s per page..** O
120c0 72 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73  r, if the page s
120d0 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ize has already 
120e0 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74 75  been fixed, retu
120f0 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
12100 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63  LY .** without c
12110 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e 67  hanging anything
12120 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
12130 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20   size must be a 
12140 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77 65  power of 2 betwe
12150 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36  en 512 and 65536
12160 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a  .  If the page.*
12170 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20  * size supplied 
12180 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68  does not meet th
12190 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68  is constraint th
121a0 65 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  en the page size
121b0 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67   is not.** chang
121c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73  ed..**.** Page s
121d0 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61  izes are constra
121e0 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77  ined to be a pow
121f0 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61  er of two so tha
12200 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20  t the region.** 
12210 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
12220 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f  file used for lo
12230 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67  cking (beginning
12240 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45   at PENDING_BYTE
12250 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62  ,.** the first b
12260 79 74 65 20 70 61 73 74 20 74 68 65 20 31 47 42  yte past the 1GB
12270 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30   boundary, 0x400
12280 30 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20  00000) needs to 
12290 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20  occur.** at the 
122a0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70  beginning of a p
122b0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  age..**.** If pa
122c0 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65  rameter nReserve
122d0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
122e0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d  ro, then the num
122f0 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a  ber of reserved.
12300 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70 61 67  ** bytes per pag
12310 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e  e is left unchan
12320 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ged..**.** If th
12330 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20 74  e iFix!=0 then t
12340 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  he BTS_PAGESIZE_
12350 46 49 58 45 44 20 66 6c 61 67 20 69 73 20 73 65  FIXED flag is se
12360 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61  t so that the pa
12370 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61  ge size.** and a
12380 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63  utovacuum mode c
12390 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20  an no longer be 
123a0 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
123b0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
123c0 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
123d0 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20  , int pageSize, 
123e0 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e  int nReserve, in
123f0 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72  t iFix){.  int r
12400 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12410 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
12420 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
12430 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20  t( nReserve>=-1 
12440 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35  && nReserve<=255
12450 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
12460 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
12470 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ( pBt->btsFlags 
12480 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  & BTS_PAGESIZE_F
12490 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69  IXED ){.    sqli
124a0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
124b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
124c0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
124d0 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65  }.  if( nReserve
124e0 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72  <0 ){.    nReser
124f0 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ve = pBt->pageSi
12500 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
12510 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Size;.  }.  asse
12520 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20  rt( nReserve>=0 
12530 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35  && nReserve<=255
12540 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69   );.  if( pageSi
12550 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
12560 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
12570 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20  PAGE_SIZE &&.   
12580 20 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d       ((pageSize-
12590 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20  1)&pageSize)==0 
125a0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ){.    assert( (
125b0 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
125c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
125d0 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20  !pBt->pPage1 && 
125e0 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
125f0 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
12600 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65 53 69  ze = (u32)pageSi
12610 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70  ze;.    freeTemp
12620 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a  Space(pBt);.  }.
12630 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
12640 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
12650 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
12660 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73  ->pageSize, nRes
12670 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73  erve);.  pBt->us
12680 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
12690 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29  pageSize - (u16)
126a0 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20  nReserve;.  if( 
126b0 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74 73 46  iFix ) pBt->btsF
126c0 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45  lags |= BTS_PAGE
126d0 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73 71  SIZE_FIXED;.  sq
126e0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
126f0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
12700 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
12710 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64   the currently d
12720 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  efined page size
12730 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
12740 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28  treeGetPageSize(
12750 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74  Btree *p){.  ret
12760 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  urn p->pBt->page
12770 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 20 64 65 66  Size;.}..#if def
12780 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f  ined(SQLITE_HAS_
12790 43 4f 44 45 43 29 20 7c 7c 20 64 65 66 69 6e 65  CODEC) || define
127a0 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
127b0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
127c0 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74  ion is similar t
127d0 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  o sqlite3BtreeGe
127e0 74 52 65 73 65 72 76 65 28 29 2c 20 65 78 63 65  tReserve(), exce
127f0 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61  pt that it.** ma
12800 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
12810 20 69 66 20 69 74 20 69 73 20 67 75 61 72 61 6e   if it is guaran
12820 74 65 65 64 20 74 68 61 74 20 74 68 65 20 62 2d  teed that the b-
12830 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 61 6c  tree mutex is al
12840 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a  ready.** held..*
12850 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65  *.** This is use
12860 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63 69  ful in one speci
12870 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20 62  al case in the b
12880 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65 20 77  ackup API code w
12890 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e  here it is.** kn
128a0 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73 68 61  own that the sha
128b0 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78  red b-tree mutex
128c0 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20 74 68   is held, but th
128d0 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 0a  e mutex on the .
128e0 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
128f0 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 20  le that owns *p 
12900 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20  is not. In this 
12910 63 61 73 65 20 69 66 20 73 71 6c 69 74 65 33 42  case if sqlite3B
12920 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77  treeEnter().** w
12930 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  ere to be called
12940 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69  , it might colli
12950 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f 74 68  de with some oth
12960 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20  er operation on 
12970 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
12980 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73  handle that owns
12990 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75 6e 64   *p, causing und
129a0 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f 72 2e  efined behavior.
129b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
129c0 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f  treeGetReserveNo
129d0 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70 29 7b  Mutex(Btree *p){
129e0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
129f0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
12a00 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
12a10 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d    return p->pBt-
12a20 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70  >pageSize - p->p
12a30 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
12a40 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
12a50 54 45 5f 48 41 53 5f 43 4f 44 45 43 20 7c 7c 20  TE_HAS_CODEC || 
12a60 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
12a70 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
12a80 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
12a90 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66  PRAGMAS) || !def
12aa0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
12ab0 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 52  _VACUUM)./*.** R
12ac0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
12ad0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
12ae0 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ce at the end of
12af0 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74   every page that
12b00 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75 61  .** are intentua
12b10 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64 2e  lly left unused.
12b20 20 20 54 68 69 73 20 69 73 20 74 68 65 20 22 72    This is the "r
12b30 65 73 65 72 76 65 64 22 20 73 70 61 63 65 20 74  eserved" space t
12b40 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69  hat is.** someti
12b50 6d 65 73 20 75 73 65 64 20 62 79 20 65 78 74 65  mes used by exte
12b60 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73  nsions..*/.int s
12b70 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
12b80 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b  serve(Btree *p){
12b90 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
12ba0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
12bb0 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e  ;.  n = p->pBt->
12bc0 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42  pageSize - p->pB
12bd0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
12be0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
12bf0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
12c00 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  n;.}../*.** Set 
12c10 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
12c20 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74   count for a dat
12c30 61 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20  abase if mxPage 
12c40 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20  is positive..** 
12c50 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
12c60 61 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73  ade if mxPage is
12c70 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a   0 or negative..
12c80 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  ** Regardless of
12c90 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78   the value of mx
12ca0 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  Page, return the
12cb0 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
12cc0 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
12cd0 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43  te3BtreeMaxPageC
12ce0 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69  ount(Btree *p, i
12cf0 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e  nt mxPage){.  in
12d00 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
12d10 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
12d20 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
12d30 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70  axPageCount(p->p
12d40 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
12d50 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
12d60 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
12d70 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
12d80 2a 20 53 65 74 20 74 68 65 20 42 54 53 5f 53 45  * Set the BTS_SE
12d90 43 55 52 45 5f 44 45 4c 45 54 45 20 66 6c 61 67  CURE_DELETE flag
12da0 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20 30   if newFlag is 0
12db0 20 6f 72 20 31 2e 20 20 49 66 20 6e 65 77 46 6c   or 1.  If newFl
12dc0 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20 74 68 65  ag is -1,.** the
12dd0 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  n make no change
12de0 73 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72  s.  Always retur
12df0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
12e00 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  he BTS_SECURE_DE
12e10 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69 6e 67 20  LETE.** setting 
12e20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
12e30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12e40 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74  BtreeSecureDelet
12e50 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
12e60 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20  newFlag){.  int 
12e70 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  b;.  if( p==0 ) 
12e80 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69  return 0;.  sqli
12e90 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
12ea0 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e  ;.  if( newFlag>
12eb0 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74  =0 ){.    p->pBt
12ec0 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
12ed0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
12ee0 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 46 6c 61  ;.    if( newFla
12ef0 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46  g ) p->pBt->btsF
12f00 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55  lags |= BTS_SECU
12f10 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 20 0a  RE_DELETE;.  } .
12f20 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62    b = (p->pBt->b
12f30 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
12f40 43 55 52 45 5f 44 45 4c 45 54 45 29 21 3d 30 3b  CURE_DELETE)!=0;
12f50 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
12f60 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
12f70 6e 20 62 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n b;.}.#endif /*
12f80 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
12f90 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
12fa0 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  MAS) || !defined
12fb0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43  (SQLITE_OMIT_VAC
12fc0 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  UUM) */../*.** C
12fd0 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d  hange the 'auto-
12fe0 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
12ff0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
13000 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61  . If the 'autoVa
13010 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74  cuum'.** paramet
13020 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
13030 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  then auto-vacuum
13040 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64   mode is enabled
13050 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a  . If zero, it.**
13060 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68   is disabled. Th
13070 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
13080 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63  for the auto-vac
13090 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20  uum property is 
130a0 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62  .** determined b
130b0 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46  y the SQLITE_DEF
130c0 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
130d0 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71  macro..*/.int sq
130e0 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74  lite3BtreeSetAut
130f0 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  oVacuum(Btree *p
13100 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  , int autoVacuum
13110 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
13120 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
13130 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13140 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65  _READONLY;.#else
13150 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
13160 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
13170 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13180 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61  .  u8 av = (u8)a
13190 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71  utoVacuum;..  sq
131a0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
131b0 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74 2d 3e  p);.  if( (pBt->
131c0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
131d0 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29 21 3d  AGESIZE_FIXED)!=
131e0 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d  0 && (av ?1:0)!=
131f0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
13200 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
13210 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
13220 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61  else{.    pBt->a
13230 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f  utoVacuum = av ?
13240 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  1:0;.    pBt->in
13250 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32  crVacuum = av==2
13260 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c   ?1:0;.  }.  sql
13270 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
13280 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
13290 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
132a0 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
132b0 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61   of the 'auto-va
132c0 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20  cuum' property. 
132d0 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69  If auto-vacuum i
132e0 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20  s .** enabled 1 
132f0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
13300 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74  erwise 0..*/.int
13310 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
13320 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65  AutoVacuum(Btree
13330 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c   *p){.#ifdef SQL
13340 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
13350 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52  UUM.  return BTR
13360 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f  EE_AUTOVACUUM_NO
13370 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  NE;.#else.  int 
13380 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
13390 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
133a0 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42   = (.    (!p->pB
133b0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42  t->autoVacuum)?B
133c0 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
133d0 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70  NONE:.    (!p->p
133e0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f  Bt->incrVacuum)?
133f0 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
13400 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45  _FULL:.    BTREE
13410 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52  _AUTOVACUUM_INCR
13420 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  .  );.  sqlite3B
13430 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
13440 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
13450 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  f.}.../*.** Get 
13460 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
13470 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74  Page1 of the dat
13480 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69  abase file.  Thi
13490 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61  s will.** also a
134a0 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63  cquire a readloc
134b0 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a  k on that file..
134c0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
134d0 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
134e0 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20  uccess.  If the 
134f0 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a  file is not a.**
13500 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
13510 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
13520 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
13530 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20  is returned..** 
13540 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
13550 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64  eturned if the d
13560 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
13570 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  d.  SQLITE_NOMEM
13580 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
13590 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66  if we run out of
135a0 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61   memory. .*/.sta
135b0 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65  tic int lockBtre
135c0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
135d0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
135e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
135f0 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  lt code from sub
13600 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d  functions */.  M
13610 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20  emPage *pPage1; 
13620 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f 66      /* Page 1 of
13630 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13640 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  le */.  int nPag
13650 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
13660 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
13670 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
13680 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 46 69  */.  int nPageFi
13690 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  le = 0;   /* Num
136a0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
136b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
136c0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
136d0 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e  Header;     /* N
136e0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
136f0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
13700 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72 20  ccording to hdr 
13710 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
13720 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
13730 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
13740 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
13750 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63  Page1==0 );.  rc
13760 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
13770 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70  haredLock(pBt->p
13780 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
13790 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
137a0 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
137b0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
137c0 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29  , 1, &pPage1, 0)
137d0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
137e0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
137f0 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65  c;..  /* Do some
13800 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c   checking to hel
13810 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c  p insure the fil
13820 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c  e we opened real
13830 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c  ly is.  ** a val
13840 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  id database file
13850 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20  . .  */.  nPage 
13860 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20  = nPageHeader = 
13870 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a  get4byte(28+(u8*
13880 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  )pPage1->aData);
13890 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  .  sqlite3PagerP
138a0 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
138b0 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c 65  ager, &nPageFile
138c0 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  );.  if( nPage==
138d0 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28  0 || memcmp(24+(
138e0 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
138f0 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65  a, 92+(u8*)pPage
13900 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29  1->aData,4)!=0 )
13910 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50  {.    nPage = nP
13920 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69  ageFile;.  }.  i
13930 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  f( nPage>0 ){.  
13940 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a    u32 pageSize;.
13950 20 20 20 20 75 33 32 20 75 73 61 62 6c 65 53 69      u32 usableSi
13960 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65  ze;.    u8 *page
13970 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74  1 = pPage1->aDat
13980 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  a;.    rc = SQLI
13990 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 69  TE_NOTADB;.    i
139a0 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c  f( memcmp(page1,
139b0 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31   zMagicHeader, 1
139c0 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  6)!=0 ){.      g
139d0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
139e0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69  ailed;.    }..#i
139f0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
13a00 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67  _WAL.    if( pag
13a10 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[18]>1 ){.    
13a20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
13a30 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
13a40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13a50 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20  page1[19]>1 ){. 
13a60 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
13a70 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
13a80 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28   }.#else.    if(
13a90 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a   page1[18]>2 ){.
13aa0 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
13ab0 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f  ags |= BTS_READ_
13ac0 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ONLY;.    }.    
13ad0 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32 20  if( page1[19]>2 
13ae0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
13af0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
13b00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
13b10 66 20 74 68 65 20 77 72 69 74 65 20 76 65 72 73  f the write vers
13b20 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c  ion is set to 2,
13b30 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 73   this database s
13b40 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73 65  hould be accesse
13b50 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20  d.    ** in WAL 
13b60 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67  mode. If the log
13b70 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
13b80 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f  open, open it no
13b90 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20  w. Then .    ** 
13ba0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13bb0 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74 68   and return with
13bc0 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 42  out populating B
13bd0 74 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a  tShared.pPage1..
13be0 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65      ** The calle
13bf0 72 20 64 65 74 65 63 74 73 20 74 68 69 73 20 61  r detects this a
13c00 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  nd calls this fu
13c10 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68  nction again. Th
13c20 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71  is is.    ** req
13c30 75 69 72 65 64 20 61 73 20 74 68 65 20 76 65 72  uired as the ver
13c40 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 63  sion of page 1 c
13c50 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
13c60 70 61 67 65 31 20 62 75 66 66 65 72 0a 20 20 20  page1 buffer.   
13c70 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74   ** may not be t
13c80 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f  he latest versio
13c90 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62 65  n - there may be
13ca0 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20   a newer one in 
13cb0 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66  the log.    ** f
13cc0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
13cd0 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32  if( page1[19]==2
13ce0 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
13cf0 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29  gs & BTS_NO_WAL)
13d00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
13d10 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20   isOpen = 0;.   
13d20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
13d30 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d  agerOpenWal(pBt-
13d40 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70 65 6e  >pPager, &isOpen
13d50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
13d60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13d70 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
13d80 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
13d90 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
13da0 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Open==0 ){.     
13db0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
13dc0 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Page1);.        
13dd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13de0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13df0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41  rc = SQLITE_NOTA
13e00 44 42 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  DB;.    }.#endif
13e10 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78  ..    /* The max
13e20 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 66 72  imum embedded fr
13e30 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 65  action must be e
13e40 78 61 63 74 6c 79 20 32 35 25 2e 20 20 41 6e 64  xactly 25%.  And
13e50 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 20   the minimum.   
13e60 20 2a 2a 20 65 6d 62 65 64 64 65 64 20 66 72 61   ** embedded fra
13e70 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 31 32  ction must be 12
13e80 2e 35 25 20 66 6f 72 20 62 6f 74 68 20 6c 65 61  .5% for both lea
13e90 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c  f-data and non-l
13ea0 65 61 66 2d 64 61 74 61 2e 0a 20 20 20 20 2a 2a  eaf-data..    **
13eb0 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65   The original de
13ec0 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65  sign allowed the
13ed0 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61  se amounts to va
13ee0 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20  ry, but as of.  
13ef0 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36    ** version 3.6
13f00 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74  .0, we require t
13f10 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e  hem to be fixed.
13f20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
13f30 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31  memcmp(&page1[21
13f40 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30  ], "\100\040\040
13f50 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ",3)!=0 ){.     
13f60 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
13f70 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
13f80 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70     pageSize = (p
13f90 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28  age1[16]<<8) | (
13fa0 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a  page1[17]<<16);.
13fb0 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53 69      if( ((pageSi
13fc0 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21  ze-1)&pageSize)!
13fd0 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53  =0.     || pageS
13fe0 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
13ff0 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c  AGE_SIZE .     |
14000 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32 35 36 20  | pageSize<=256 
14010 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
14020 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
14030 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
14040 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
14050 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
14060 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61   usableSize = pa
14070 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32  geSize - page1[2
14080 30 5d 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32  0];.    if( (u32
14090 29 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e  )pageSize!=pBt->
140a0 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
140b0 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69    /* After readi
140c0 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ng the first pag
140d0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
140e0 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67  e assuming a pag
140f0 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20  e size.      ** 
14100 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65  of BtShared.page
14110 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69  Size, we have di
14120 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68  scovered that th
14130 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20  e page-size is. 
14140 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79       ** actually
14150 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63   pageSize. Unloc
14160 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  k the database, 
14170 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
14180 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65  1 at.      ** ze
14190 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ro and return SQ
141a0 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c  LITE_OK. The cal
141b0 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68  ler will call th
141c0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  is function.    
141d0 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20    ** again with 
141e0 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65  the correct page
141f0 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  -size..      */.
14200 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
14210 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20  e(pPage1);.     
14220 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
14230 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
14240 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
14250 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
14260 20 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61       freeTempSpa
14270 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72  ce(pBt);.      r
14280 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
14290 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
142a0 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
142b0 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ageSize,.       
142c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142d0 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
142e0 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29  Size-usableSize)
142f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
14300 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
14310 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73   (pBt->db->flags
14320 20 26 20 53 51 4c 49 54 45 5f 52 65 63 6f 76 65   & SQLITE_Recove
14330 72 79 4d 6f 64 65 29 3d 3d 30 20 26 26 20 6e 50  ryMode)==0 && nP
14340 61 67 65 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b  age>nPageFile ){
14350 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
14360 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
14370 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
14380 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
14390 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 61     }.    if( usa
143a0 62 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20  bleSize<480 ){. 
143b0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
143c0 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
143d0 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65   }.    pBt->page
143e0 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
143f0 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
14400 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a  Size = usableSiz
14410 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
14420 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
14430 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56  M.    pBt->autoV
14440 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
14450 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a  e(&page1[36 + 4*
14460 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42  4])?1:0);.    pB
14470 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
14480 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
14490 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
144a0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
144b0 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74  /* maxLocal is t
144c0 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  he maximum amoun
144d0 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20  t of payload to 
144e0 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f  store locally fo
144f0 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20  r.  ** a cell.  
14500 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20  Make sure it is 
14510 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20  small enough so 
14520 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69  that at least mi
14530 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c  nFanout.  ** cel
14540 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20  ls can will fit 
14550 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65  on one page.  We
14560 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74   assume a 10-byt
14570 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20  e page header.. 
14580 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20   ** Besides the 
14590 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c  payload, the cel
145a0 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20  l must store:.  
145b0 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f  **     2-byte po
145c0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
145d0 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  l.  **     4-byt
145e0 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a  e child pointer.
145f0 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20    **     9-byte 
14600 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20  nKey value.  ** 
14610 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61      4-byte nData
14620 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
14630 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20  4-byte overflow 
14640 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a  page pointer.  *
14650 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73  * So a cell cons
14660 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65  ists of a 2-byte
14670 20 70 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64   pointer, a head
14680 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d  er which is as m
14690 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62  uch as.  ** 17 b
146a0 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20  ytes long, 0 to 
146b0 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f  N bytes of paylo
146c0 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f  ad, and an optio
146d0 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66  nal 4 byte overf
146e0 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f  low.  ** page po
146f0 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42  inter..  */.  pB
14700 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75  t->maxLocal = (u
14710 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
14720 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20  Size-12)*64/255 
14730 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69  - 23);.  pBt->mi
14740 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28  nLocal = (u16)((
14750 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
14760 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29  12)*32/255 - 23)
14770 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  ;.  pBt->maxLeaf
14780 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73   = (u16)(pBt->us
14790 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a  ableSize - 35);.
147a0 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d    pBt->minLeaf =
147b0 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
147c0 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
147d0 35 35 20 2d 20 32 33 29 3b 0a 20 20 69 66 28 20  55 - 23);.  if( 
147e0 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32  pBt->maxLocal>12
147f0 37 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61  7 ){.    pBt->ma
14800 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
14810 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  127;.  }else{.  
14820 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50    pBt->max1byteP
14830 61 79 6c 6f 61 64 20 3d 20 28 75 38 29 70 42 74  ayload = (u8)pBt
14840 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  ->maxLocal;.  }.
14850 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d    assert( pBt->m
14860 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d  axLeaf + 23 <= M
14870 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
14880 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65   );.  pBt->pPage
14890 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42  1 = pPage1;.  pB
148a0 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  t->nPage = nPage
148b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
148c0 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69  E_OK;..page1_ini
148d0 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65  t_failed:.  rele
148e0 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
148f0 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d  .  pBt->pPage1 =
14900 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
14910 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
14920 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  UG./*.** Return 
14930 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75  the number of cu
14940 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42  rsors open on pB
14950 74 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75  t. This is for u
14960 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28  se.** in assert(
14970 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73  ) expressions, s
14980 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d  o it is only com
14990 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20  piled if NDEBUG 
149a0 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65  is not.** define
149b0 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72  d..**.** Only wr
149c0 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20  ite cursors are 
149d0 63 6f 75 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c  counted if wrOnl
149e0 79 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 77  y is true.  If w
149f0 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73  rOnly is.** fals
14a00 65 20 74 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f  e then all curso
14a10 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a  rs are counted..
14a20 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
14a30 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72  rposes of this r
14a40 6f 75 74 69 6e 65 2c 20 61 20 63 75 72 73 6f 72  outine, a cursor
14a50 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74   is any cursor t
14a60 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c  hat.** is capabl
14a70 65 20 6f 66 20 72 65 61 64 69 6e 67 20 6f 72 20  e of reading or 
14a80 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
14a90 61 74 61 62 73 65 2e 20 20 43 75 72 73 6f 72 73  atabse.  Cursors
14aa0 20 74 68 61 74 0a 2a 2a 20 68 61 76 65 20 62 65   that.** have be
14ab0 65 6e 20 74 72 69 70 70 65 64 20 69 6e 74 6f 20  en tripped into 
14ac0 74 68 65 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  the CURSOR_FAULT
14ad0 20 73 74 61 74 65 20 61 72 65 20 6e 6f 74 20 63   state are not c
14ae0 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ounted..*/.stati
14af0 63 20 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64  c int countValid
14b00 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
14b10 20 2a 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c   *pBt, int wrOnl
14b20 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  y){.  BtCursor *
14b30 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20  pCur;.  int r = 
14b40 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42  0;.  for(pCur=pB
14b50 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72  t->pCursor; pCur
14b60 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65  ; pCur=pCur->pNe
14b70 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 77 72  xt){.    if( (wr
14b80 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Only==0 || pCur-
14b90 3e 77 72 46 6c 61 67 29 20 26 26 20 70 43 75 72  >wrFlag) && pCur
14ba0 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
14bb0 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20  _FAULT ) r++; . 
14bc0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d   }.  return r;.}
14bd0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
14be0 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  f there are no o
14bf0 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f  utstanding curso
14c00 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f  rs and we are no
14c10 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a  t in the middle.
14c20 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  ** of a transact
14c30 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69 73  ion but there is
14c40 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   a read lock on 
14c50 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  the database, th
14c60 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
14c70 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66 69  ne unrefs the fi
14c80 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
14c90 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
14ca0 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20  ich .** has the 
14cb0 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73  effect of releas
14cc0 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ing the read loc
14cd0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  k..**.** If ther
14ce0 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  e is a transacti
14cf0 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20  on in progress, 
14d00 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
14d10 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
14d20 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74  ic void unlockBt
14d30 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53 68  reeIfUnused(BtSh
14d40 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73  ared *pBt){.  as
14d50 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
14d60 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
14d70 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
14d80 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73  ( countValidCurs
14d90 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c 7c  ors(pBt,0)==0 ||
14da0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
14db0 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ion>TRANS_NONE )
14dc0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54  ;.  if( pBt->inT
14dd0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
14de0 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70  S_NONE && pBt->p
14df0 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20  Page1!=0 ){.    
14e00 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
14e10 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  ge1->aData );.  
14e20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
14e30 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
14e40 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29  Bt->pPager)==1 )
14e50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
14e60 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
14e70 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   );.    releaseP
14e80 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31 29  age(pBt->pPage1)
14e90 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
14ea0 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  1 = 0;.  }.}../*
14eb0 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74  .** If pBt point
14ec0 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69  s to an empty fi
14ed0 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20  le then convert 
14ee0 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a  that empty file.
14ef0 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d  ** into a new em
14f00 70 74 79 20 64 61 74 61 62 61 73 65 20 62 79 20  pty database by 
14f10 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
14f20 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a   first page of.*
14f30 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  * the database..
14f40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65  */.static int ne
14f50 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72  wDatabase(BtShar
14f60 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
14f70 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69  age *pP1;.  unsi
14f80 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
14f90 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
14fa0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
14fb0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
14fc0 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
14fd0 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  t->nPage>0 ){.  
14fe0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14ff0 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20  OK;.  }.  pP1 = 
15000 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61  pBt->pPage1;.  a
15010 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b  ssert( pP1!=0 );
15020 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61  .  data = pP1->a
15030 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Data;.  rc = sql
15040 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
15050 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  P1->pDbPage);.  
15060 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
15070 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74  rc;.  memcpy(dat
15080 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  a, zMagicHeader,
15090 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
150a0 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74  ader));.  assert
150b0 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  ( sizeof(zMagicH
150c0 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20  eader)==16 );.  
150d0 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28  data[16] = (u8)(
150e0 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
150f0 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61  8)&0xff);.  data
15100 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74  [17] = (u8)((pBt
15110 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26  ->pageSize>>16)&
15120 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38  0xff);.  data[18
15130 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39  ] = 1;.  data[19
15140 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  ] = 1;.  assert(
15150 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
15160 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  <=pBt->pageSize 
15170 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  && pBt->usableSi
15180 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67  ze+255>=pBt->pag
15190 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
151a0 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70  0] = (u8)(pBt->p
151b0 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
151c0 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61  sableSize);.  da
151d0 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64  ta[21] = 64;.  d
151e0 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20  ata[22] = 32;.  
151f0 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20  data[23] = 32;. 
15200 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34   memset(&data[24
15210 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20  ], 0, 100-24);. 
15220 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50   zeroPage(pP1, P
15230 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
15240 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20  AF|PTF_LEAFDATA 
15250 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  );.  pBt->btsFla
15260 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
15270 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65  ZE_FIXED;.#ifnde
15280 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
15290 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72  TOVACUUM.  asser
152a0 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
152b0 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75  um==1 || pBt->au
152c0 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  toVacuum==0 );. 
152d0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
152e0 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  crVacuum==1 || p
152f0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
15300 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  0 );.  put4byte(
15310 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c  &data[36 + 4*4],
15320 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
15330 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
15340 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70  ata[36 + 7*4], p
15350 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b  Bt->incrVacuum);
15360 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e  .#endif.  pBt->n
15370 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61  Page = 1;.  data
15380 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75  [31] = 1;.  retu
15390 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
153a0 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
153b0 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  e the first page
153c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
153d0 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20   file (creating 
153e0 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  a database.** co
153f0 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69  nsisting of a si
15400 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f  ngle page and no
15410 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29   schema objects)
15420 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
15430 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73  OK.** if success
15440 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
15450 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
15460 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erwise..*/.int s
15470 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44 62  qlite3BtreeNewDb
15480 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
15490 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
154a0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
154b0 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  p->pBt->nPage = 
154c0 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74  0;.  rc = newDat
154d0 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20  abase(p->pBt);. 
154e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
154f0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
15500 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  rc;.}../*.** Att
15510 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20  empt to start a 
15520 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
15530 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
15540 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74  tion.** is start
15550 65 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  ed if the second
15560 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
15570 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20  zero, otherwise 
15580 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73  a read-.** trans
15590 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  action.  If the 
155a0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
155b0 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64  is 2 or more and
155c0 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72   exclusive.** tr
155d0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
155e0 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68  rted, meaning th
155f0 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63  at no other proc
15600 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a  ess is allowed.*
15610 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  * to access the 
15620 64 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65  database.  A pre
15630 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63  existing transac
15640 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a  tion may not be.
15650 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65  ** upgraded to e
15660 78 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c  xclusive by call
15670 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
15680 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d   a second time -
15690 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76   the.** exclusiv
156a0 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f  ity flag only wo
156b0 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72  rks for a new tr
156c0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
156d0 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
156e0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61  tion must be sta
156f0 72 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65  rted before atte
15700 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63  mpting any .** c
15710 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
15720 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66  tabase.  None of
15730 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
15740 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c  outines .** will
15750 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74   work unless a t
15760 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74  ransaction is st
15770 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a  arted first:.**.
15780 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
15790 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
157a0 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
157b0 33 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65  3BtreeCreateInde
157c0 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  x().**      sqli
157d0 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
157e0 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
157f0 69 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62  ite3BtreeDropTab
15800 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
15810 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28  ite3BtreeInsert(
15820 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
15830 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a  3BtreeDelete().*
15840 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
15850 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a  reeUpdateMeta().
15860 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74  **.** If an init
15870 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61  ial attempt to a
15880 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20  cquire the lock 
15890 66 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66  fails because of
158a0 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
158b0 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
158c0 62 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75  base was previou
158d0 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68  sly unlocked, th
158e0 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  en invoke the bu
158f0 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66  sy handler.** if
15900 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20   there is one.  
15910 42 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73  But if there was
15920 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65   previously a re
15930 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a  ad-lock, do not.
15940 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** invoke the bu
15950 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73  sy handler - jus
15960 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
15970 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55  BUSY.  SQLITE_BU
15980 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  SY is .** return
15990 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ed when there is
159a0 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
159b0 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f  lock in order to
159c0 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63   avoid a deadloc
159d0 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65  k..**.** Suppose
159e0 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70   there are two p
159f0 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42  rocesses A and B
15a00 2e 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20  .  A has a read 
15a10 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a  lock and B has.*
15a20 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  * a reserved loc
15a30 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70  k.  B tries to p
15a40 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73  romote to exclus
15a50 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ive but is block
15a60 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66  ed because.** of
15a70 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20   A's read lock. 
15a80 20 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d   A tries to prom
15a90 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20  ote to reserved 
15aa0 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
15ab0 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74  y B..** One or t
15ac0 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
15ad0 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75  two processes mu
15ae0 73 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74  st give way or t
15af0 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e  here can be.** n
15b00 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20  o progress.  By 
15b10 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
15b20 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e  _BUSY and not in
15b30 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20  voking the busy 
15b40 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e  callback.** when
15b50 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61   A already has a
15b60 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65   read lock, we e
15b70 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69  ncourage A to gi
15b80 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a  ve up and let B.
15b90 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69  ** proceed..*/.i
15ba0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
15bb0 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20  eginTrans(Btree 
15bc0 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b  *p, int wrflag){
15bd0 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f  .  sqlite3 *pBlo
15be0 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72  ck = 0;.  BtShar
15bf0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
15c00 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
15c10 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74  ITE_OK;..  sqlit
15c20 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
15c30 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
15c40 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  y(p);..  /* If t
15c50 68 65 20 62 74 72 65 65 20 69 73 20 61 6c 72 65  he btree is alre
15c60 61 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74  ady in a write-t
15c70 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69  ransaction, or i
15c80 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64  t.  ** is alread
15c90 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e  y in a read-tran
15ca0 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65  saction and a re
15cb0 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  ad-transaction. 
15cc0 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65 64   ** is requested
15cd0 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
15ce0 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  p..  */.  if( p-
15cf0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
15d00 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54  WRITE || (p->inT
15d10 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44  rans==TRANS_READ
15d20 20 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a   && !wrflag) ){.
15d30 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
15d40 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  egun;.  }.  asse
15d50 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
15d60 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
15d70 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74  ITE || IfNotOmit
15d80 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  AV(pBt->bDoTrunc
15d90 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  ate)==0 );..  /*
15da0 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   Write transacti
15db0 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73  ons are not poss
15dc0 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f  ible on a read-o
15dd0 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  nly database */.
15de0 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46    if( (pBt->btsF
15df0 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f  lags & BTS_READ_
15e00 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72 66 6c  ONLY)!=0 && wrfl
15e10 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ag ){.    rc = S
15e20 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
15e30 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
15e40 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  egun;.  }..#ifnd
15e50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
15e60 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
15e70 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61   If another data
15e80 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20  base handle has 
15e90 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61  already opened a
15ea0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
15eb0 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73  on .  ** on this
15ec0 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74   shared-btree st
15ed0 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65  ructure and a se
15ee0 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73  cond write trans
15ef0 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72  action is.  ** r
15f00 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e  equested, return
15f10 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a   SQLITE_LOCKED..
15f20 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66 6c    */.  if( (wrfl
15f30 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  ag && pBt->inTra
15f40 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
15f50 57 52 49 54 45 29 0a 20 20 20 7c 7c 20 28 70 42  WRITE).   || (pB
15f60 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
15f70 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20  S_PENDING)!=0.  
15f80 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20  ){.    pBlock = 
15f90 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62  pBt->pWriter->db
15fa0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72  ;.  }else if( wr
15fb0 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74  flag>1 ){.    Bt
15fc0 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20  Lock *pIter;.   
15fd0 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
15fe0 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
15ff0 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
16000 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
16010 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b  er->pBtree!=p ){
16020 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20  .        pBlock 
16030 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  = pIter->pBtree-
16040 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62 72 65  >db;.        bre
16050 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
16060 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f  }.  }.  if( pBlo
16070 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ck ){.    sqlite
16080 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
16090 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b  ed(p->db, pBlock
160a0 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
160b0 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
160c0 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20  CACHE;.    goto 
160d0 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
160e0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e  .#endif..  /* An
160f0 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72  y read-only or r
16100 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61  ead-write transa
16110 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20  ction implies a 
16120 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20  read-lock on .  
16130 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66  ** page 1. So if
16140 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72   some other shar
16150 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20  ed-cache client 
16160 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77 72  already has a wr
16170 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f  ite-lock .  ** o
16180 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74 72  n page 1, the tr
16190 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
161a0 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20   be opened. */. 
161b0 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72 65   rc = queryShare
161c0 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
161d0 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  p, MASTER_ROOT, 
161e0 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  READ_LOCK);.  if
161f0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
16200 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67  ) goto trans_beg
16210 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46  un;..  pBt->btsF
16220 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49  lags &= ~BTS_INI
16230 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20  TIALLY_EMPTY;.  
16240 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d  if( pBt->nPage==
16250 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  0 ) pBt->btsFlag
16260 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c  s |= BTS_INITIAL
16270 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b  LY_EMPTY;.  do {
16280 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63  .    /* Call loc
16290 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65  kBtree() until e
162a0 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65  ither pBt->pPage
162b0 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f  1 is populated o
162c0 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72  r.    ** lockBtr
162d0 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d  ee() returns som
162e0 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
162f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63  n SQLITE_OK. loc
16300 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20  kBtree().    ** 
16310 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
16320 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70  E_OK but leave p
16330 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74  Bt->pPage1 set t
16340 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20 20  o 0 if after.   
16350 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65   ** reading page
16360 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73 20   1 it discovers 
16370 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69  that the page-si
16380 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
16390 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  se .    ** file 
163a0 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65  is not pBt->page
163b0 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61  Size. In this ca
163c0 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77  se lockBtree() w
163d0 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a  ill update.    *
163e0 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  * pBt->pageSize 
163f0 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  to the page-size
16400 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   of the file on 
16410 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  disk..    */.   
16420 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61   while( pBt->pPa
16430 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45  ge1==0 && SQLITE
16440 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42  _OK==(rc = lockB
16450 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20  tree(pBt)) );.. 
16460 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
16470 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
16480 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 42 74  {.      if( (pBt
16490 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
164a0 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29  _READ_ONLY)!=0 )
164b0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
164c0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
164d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
164e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
164f0 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d  3PagerBegin(pBt-
16500 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31  >pPager,wrflag>1
16510 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65  ,sqlite3TempInMe
16520 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20  mory(p->db));.  
16530 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
16540 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16550 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
16560 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
16570 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
16580 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72    }.  .    if( r
16590 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
165a0 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65        unlockBtre
165b0 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
165c0 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
165d0 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54  (rc&0xFF)==SQLIT
165e0 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69  E_BUSY && pBt->i
165f0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
16600 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20  ANS_NONE &&.    
16610 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b        btreeInvok
16620 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74  eBusyHandler(pBt
16630 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ) );..  if( rc==
16640 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16650 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
16660 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
16670 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73       pBt->nTrans
16680 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65  action++;.#ifnde
16690 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
166a0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20  ARED_CACHE.     
166b0 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
166c0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
166d0 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72  rt( p->lock.pBtr
166e0 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b  ee==p && p->lock
166f0 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20  .iTable==1 );.  
16700 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c        p->lock.eL
16710 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b  ock = READ_LOCK;
16720 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b  .        p->lock
16730 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  .pNext = pBt->pL
16740 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74  ock;.        pBt
16750 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f  ->pLock = &p->lo
16760 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ck;.      }.#end
16770 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  if.    }.    p->
16780 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61  inTrans = (wrfla
16790 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52  g?TRANS_WRITE:TR
167a0 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69  ANS_READ);.    i
167b0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42  f( p->inTrans>pB
167c0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
167d0 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   ){.      pBt->i
167e0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70  nTransaction = p
167f0 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d  ->inTrans;.    }
16800 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20  .    if( wrflag 
16810 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  ){.      MemPage
16820 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
16830 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66 20  pPage1;.#ifndef 
16840 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
16850 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 61  ED_CACHE.      a
16860 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72  ssert( !pBt->pWr
16870 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42  iter );.      pB
16880 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a  t->pWriter = p;.
16890 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
168a0 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c  ags &= ~BTS_EXCL
168b0 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66 28  USIVE;.      if(
168c0 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74 2d   wrflag>1 ) pBt-
168d0 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
168e0 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64  _EXCLUSIVE;.#end
168f0 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  if..      /* If 
16900 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61 64  the db-size head
16910 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63 6f  er field is inco
16920 72 72 65 63 74 20 28 61 73 20 69 74 20 6d 61 79  rrect (as it may
16930 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20   be if an old.  
16940 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61      ** client ha
16950 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20 74  s been writing t
16960 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16970 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f 77  ), update it now
16980 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a  . Doing.      **
16990 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61 74   this sooner rat
169a0 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20 6d  her than later m
169b0 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
169c0 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65 6c  e size can safel
169d0 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d 72  y .      ** re-r
169e0 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
169f0 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65 20   size from page 
16a00 31 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e 74  1 if a savepoint
16a10 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a   or transaction.
16a20 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63        ** rollbac
16a30 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  k occurs within 
16a40 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
16a50 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
16a60 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  if( pBt->nPage!=
16a70 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
16a80 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a  ->aData[28]) ){.
16a90 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
16aa0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
16ab0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
16ac0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
16ad0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16ae0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
16af0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
16b00 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  28], pBt->nPage)
16b10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16b20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a    }.    }.  }...
16b30 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69  trans_begun:.  i
16b40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16b50 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
16b60 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d    /* This call m
16b70 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 74  akes sure that t
16b80 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65  he pager has the
16b90 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20   correct number 
16ba0 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73  of.    ** open s
16bb0 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68  avepoints. If th
16bc0 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
16bd0 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
16be0 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20  an 0 and.    ** 
16bf0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
16c00 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
16c10 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c  pen, then it wil
16c20 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65  l be opened here
16c30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
16c40 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
16c50 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  enSavepoint(pBt-
16c60 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e  >pPager, p->db->
16c70 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d  nSavepoint);.  }
16c80 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
16c90 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ty(p);.  sqlite3
16ca0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
16cb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
16cc0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16cd0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f  IT_AUTOVACUUM../
16ce0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69  *.** Set the poi
16cf0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
16d00 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65   for all childre
16d10 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e  n of page pPage.
16d20 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61   Also, if.** pPa
16d30 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c  ge contains cell
16d40 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
16d50 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
16d60 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  set the pointer.
16d70 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  ** map entries f
16d80 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
16d90 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a  pages as well..*
16da0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
16db0 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d  ChildPtrmaps(Mem
16dc0 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
16dd0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
16de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16df0 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61     /* Counter va
16e00 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  riable */.  int 
16e10 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
16e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16e30 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
16e40 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20  s in page pPage 
16e50 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
16e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e70 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
16e80 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68  n code */.  BtSh
16e90 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
16ea0 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73 49  e->pBt;.  u8 isI
16eb0 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d  nitOrig = pPage-
16ec0 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20  >isInit;.  Pgno 
16ed0 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67  pgno = pPage->pg
16ee0 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  no;..  assert( s
16ef0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
16f00 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
16f10 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 62  tex) );.  rc = b
16f20 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
16f30 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
16f40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16f50 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70  goto set_child_p
16f60 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a  trmaps_out;.  }.
16f70 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
16f80 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69  >nCell;..  for(i
16f90 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
16fa0 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ){.    u8 *pCell
16fb0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
16fc0 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d  e, i);..    ptrm
16fd0 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61  apPutOvflPtr(pPa
16fe0 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b  ge, pCell, &rc);
16ff0 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ..    if( !pPage
17000 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
17010 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d  Pgno childPgno =
17020 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
17030 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  ;.      ptrmapPu
17040 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
17050 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
17060 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20  pgno, &rc);.    
17070 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  }.  }..  if( !pP
17080 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
17090 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
170a0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
170b0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
170c0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
170d0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
170e0 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
170f0 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c  MAP_BTREE, pgno,
17100 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f   &rc);.  }..set_
17110 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
17120 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  t:.  pPage->isIn
17130 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b  it = isInitOrig;
17140 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17150 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65  ./*.** Somewhere
17160 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20 70   on pPage is a p
17170 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69  ointer to page i
17180 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68  From.  Modify th
17190 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a  is pointer so.**
171a0 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
171b0 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65  to iTo. Paramete
171c0 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62 65  r eType describe
171d0 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f  s the type of po
171e0 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d  inter to.** be m
171f0 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c  odified, as  fol
17200 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  lows:.**.** PTRM
17210 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50  AP_BTREE:     pP
17220 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70  age is a btree-p
17230 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
17240 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69   points at a chi
17250 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ld .**          
17260 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f 66           page of
17270 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54   pPage..**.** PT
17280 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20  RMAP_OVERFLOW1: 
17290 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
172a0 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
172b0 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  er points at an 
172c0 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20  overflow.**     
172d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
172e0 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ge pointed to by
172f0 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c   one of the cell
17300 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  s on pPage..**.*
17310 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
17320 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20  W2: pPage is an 
17330 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54  overflow-page. T
17340 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
17350 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a  s at the next.**
17360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17370 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65     overflow page
17380 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f   in the list..*/
17390 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69  .static int modi
173a0 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65  fyPagePointer(Me
173b0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67  mPage *pPage, Pg
173c0 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69  no iFrom, Pgno i
173d0 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20  To, u8 eType){. 
173e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
173f0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
17400 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
17410 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
17420 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
17430 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
17440 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79  ge) );.  if( eTy
17450 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
17460 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  LOW2 ){.    /* T
17470 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c  he pointer is al
17480 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34  ways the first 4
17490 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61   bytes of the pa
174a0 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
174b0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74    */.    if( get
174c0 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
174d0 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ta)!=iFrom ){.  
174e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
174f0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
17500 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79      }.    put4by
17510 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
17520 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   iTo);.  }else{.
17530 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69      u8 isInitOri
17540 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  g = pPage->isIni
17550 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  t;.    int i;.  
17560 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20    int nCell;..  
17570 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28    btreeInitPage(
17580 70 50 61 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c  pPage);.    nCel
17590 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
175a0 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
175b0 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
175c0 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d       u8 *pCell =
175d0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
175e0 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65   i);.      if( e
175f0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
17600 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20  RFLOW1 ){.      
17610 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
17620 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 50 61  .        btreePa
17630 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
17640 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
17650 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66  .        if( inf
17660 6f 2e 69 4f 76 65 72 66 6c 6f 77 0a 20 20 20 20  o.iOverflow.    
17670 20 20 20 20 20 26 26 20 70 43 65 6c 6c 2b 69 6e       && pCell+in
17680 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 3c 3d  fo.iOverflow+3<=
17690 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61  pPage->aData+pPa
176a0 67 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20 20 20  ge->maskPage.   
176b0 20 20 20 20 20 20 26 26 20 69 46 72 6f 6d 3d 3d        && iFrom==
176c0 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
176d0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
176e0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
176f0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
17700 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
17710 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20  flow], iTo);.   
17720 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
17730 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
17740 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
17750 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
17760 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
17770 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43       put4byte(pC
17780 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20  ell, iTo);.     
17790 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
177a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
177b0 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69    }.  .    if( i
177c0 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ==nCell ){.     
177d0 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
177e0 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20  AP_BTREE || .   
177f0 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28         get4byte(
17800 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
17810 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
17820 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  ])!=iFrom ){.   
17830 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
17840 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
17850 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
17860 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
17870 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
17880 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b  Offset+8], iTo);
17890 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67  .    }..    pPag
178a0 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
178b0 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65  itOrig;.  }.  re
178c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
178d0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
178e0 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
178f0 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74 6f   page pDbPage to
17900 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50   location iFreeP
17910 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64  age in the .** d
17920 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44 62  atabase. The pDb
17930 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20 72  Page reference r
17940 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a  emains valid..**
17950 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69 74  .** The isCommit
17960 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20   flag indicates 
17970 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
17980 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65   need to remembe
17990 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f  r that.** the jo
179a0 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62  urnal needs to b
179b0 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  e sync()ed befor
179c0 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
179d0 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a  pDbPage->pgno .*
179e0 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  * can be written
179f0 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20   to. The caller 
17a00 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d  has already prom
17a10 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74  ised not to writ
17a20 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67  e to that.** pag
17a30 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
17a40 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20   relocatePage(. 
17a50 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
17a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
17a70 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
17a80 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20  *pDbPage,       
17a90 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f   /* Open page to
17aa0 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54   move */.  u8 eT
17ab0 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
17ac0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
17ad0 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20  ap 'type' entry 
17ae0 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
17af0 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20   Pgno iPtrPage, 
17b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
17b10 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e  nter map 'page-n
17b20 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  o' entry for pDb
17b30 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
17b40 46 72 65 65 50 61 67 65 2c 20 20 20 20 20 20 20  FreePage,       
17b50 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69     /* The locati
17b60 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61  on to move pDbPa
17b70 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69  ge to */.  int i
17b80 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20  sCommit         
17b90 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20      /* isCommit 
17ba0 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20 73  flag passed to s
17bb0 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
17bc0 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50  age */.){.  MemP
17bd0 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20  age *pPtrPage;  
17be0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
17bf0 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  t contains a poi
17c00 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20  nter to pDbPage 
17c10 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67  */.  Pgno iDbPag
17c20 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  e = pDbPage->pgn
17c30 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  o;.  Pager *pPag
17c40 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
17c50 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
17c60 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54  ssert( eType==PT
17c70 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c  RMAP_OVERFLOW2 |
17c80 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
17c90 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20  OVERFLOW1 || .  
17ca0 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41      eType==PTRMA
17cb0 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
17cc0 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
17cd0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  E );.  assert( s
17ce0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
17cf0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
17d00 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61  .  assert( pDbPa
17d10 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  ge->pBt==pBt );.
17d20 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20  .  /* Move page 
17d30 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73  iDbPage from its
17d40 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
17d50 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  n to page number
17d60 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20   iFreePage */.  
17d70 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55  TRACE(("AUTOVACU
17d80 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f  UM: Moving %d to
17d90 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70   free page %d (p
17da0 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20  tr page %d type 
17db0 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69  %d)\n", .      i
17dc0 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
17dd0 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79  e, iPtrPage, eTy
17de0 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  pe));.  rc = sql
17df0 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
17e00 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67  e(pPager, pDbPag
17e10 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65  e->pDbPage, iFre
17e20 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29  ePage, isCommit)
17e30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
17e40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
17e50 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44  urn rc;.  }.  pD
17e60 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46  bPage->pgno = iF
17e70 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49  reePage;..  /* I
17e80 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20  f pDbPage was a 
17e90 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e  btree-page, then
17ea0 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69   it may have chi
17eb0 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20  ld pages and/or 
17ec0 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20  cells.  ** that 
17ed0 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
17ee0 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69  w pages. The poi
17ef0 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
17f00 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20   for all these. 
17f10 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74   ** pages need t
17f20 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20  o be changed..  
17f30 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61  **.  ** If pDbPa
17f40 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
17f50 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  w page, then the
17f60 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d   first 4 bytes m
17f70 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20  ay store a.  ** 
17f80 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62  pointer to a sub
17f90 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
17fa0 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69   page. If this i
17fb0 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
17fc0 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  .  ** the pointe
17fd0 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62  r map needs to b
17fe0 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68  e updated for th
17ff0 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  e subsequent ove
18000 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f  rflow page..  */
18010 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
18020 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
18030 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
18040 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
18050 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
18060 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
18070 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18080 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
18090 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   rc;.    }.  }el
180a0 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78  se{.    Pgno nex
180b0 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  tOvfl = get4byte
180c0 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29  (pDbPage->aData)
180d0 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76  ;.    if( nextOv
180e0 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  fl!=0 ){.      p
180f0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65  trmapPut(pBt, ne
18100 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  xtOvfl, PTRMAP_O
18110 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50  VERFLOW2, iFreeP
18120 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  age, &rc);.     
18130 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18140 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
18150 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
18160 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
18170 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73   Fix the databas
18180 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67  e pointer on pag
18190 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20  e iPtrPage that 
181a0 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61  pointed at iDbPa
181b0 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  ge so.  ** that 
181c0 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72  it points at iFr
181d0 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78  eePage. Also fix
181e0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
181f0 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20   entry for.  ** 
18200 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20  iPtrPage..  */. 
18210 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
18220 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
18230 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
18240 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61  Page(pBt, iPtrPa
18250 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30  ge, &pPtrPage, 0
18260 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
18270 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18280 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
18290 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
182a0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
182b0 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  trPage->pDbPage)
182c0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
182d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
182e0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
182f0 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  rPage);.      re
18300 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
18310 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61     rc = modifyPa
18320 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61  gePointer(pPtrPa
18330 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72  ge, iDbPage, iFr
18340 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a  eePage, eType);.
18350 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
18360 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  pPtrPage);.    i
18370 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18380 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
18390 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61  Put(pBt, iFreePa
183a0 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  ge, eType, iPtrP
183b0 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d  age, &rc);.    }
183c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
183d0 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
183e0 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75  declaration requ
183f0 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63 75  ired by incrVacu
18400 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61  umStep(). */.sta
18410 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
18420 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72  BtreePage(BtShar
18430 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a  ed *, MemPage **
18440 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20  , Pgno *, Pgno, 
18450 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66  u8);../*.** Perf
18460 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65  orm a single ste
18470 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e  p of an incremen
18480 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73  tal-vacuum. If s
18490 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
184a0 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  n.** SQLITE_OK. 
184b0 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  If there is no w
184c0 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74  ork to do (and t
184d0 68 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e  herefore no poin
184e0 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67  t in .** calling
184f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
18500 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51  gain), return SQ
18510 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69  LITE_DONE. Or, i
18520 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f  f an error .** o
18530 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 73 6f  ccurs, return so
18540 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
18550 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20  ode..**.** More 
18560 73 70 65 63 69 66 69 63 6c 79 2c 20 74 68 69 73  specificly, this
18570 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
18580 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a  ts to re-organiz
18590 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
185a0 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c  o .** that the l
185b0 61 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  ast page of the 
185c0 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69  file currently i
185d0 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67  n use is no long
185e0 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a  er in use..**.**
185f0 20 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20   Parameter nFin 
18600 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
18610 20 70 61 67 65 73 20 74 68 61 74 20 74 68 69 73   pages that this
18620 20 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20   database would 
18630 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20  contain.** were 
18640 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
18650 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65  lled until it re
18660 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
18670 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E..**.** If the 
18680 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65  bCommit paramete
18690 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
186a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73  his function ass
186b0 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a  umes that the .*
186c0 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65  * caller will ke
186d0 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56  ep calling incrV
186e0 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69  acuumStep() unti
186f0 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  l it returns SQL
18700 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20  ITE_DONE .** or 
18710 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69  an error. bCommi
18720 74 20 69 73 20 70 61 73 73 65 64 20 74 72 75 65  t is passed true
18730 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63   for an auto-vac
18740 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 6d 69 74 20 0a  uum-on-commmit .
18750 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72  ** operation, or
18760 20 66 61 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e   false for an in
18770 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
18780 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18790 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42  incrVacuumStep(B
187a0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
187b0 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c  no nFin, Pgno iL
187c0 61 73 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d  astPg, int bComm
187d0 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65  it){.  Pgno nFre
187e0 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  eList;          
187f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
18800 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65  ges still on the
18810 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20   free-list */.  
18820 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
18830 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
18840 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
18850 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
18860 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a  LastPg>nFin );..
18870 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53    if( !PTRMAP_IS
18880 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
18890 67 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50  g) && iLastPg!=P
188a0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
188b0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20  (pBt) ){.    u8 
188c0 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20  eType;.    Pgno 
188d0 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e  iPtrPage;..    n
188e0 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62  FreeList = get4b
188f0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
18900 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
18910 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d    if( nFreeList=
18920 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
18930 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
18940 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
18950 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
18960 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20  LastPg, &eType, 
18970 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  &iPtrPage);.    
18980 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18990 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
189a0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
189b0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
189c0 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
189d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
189e0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
189f0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65      }..    if( e
18a00 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
18a10 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69  EPAGE ){.      i
18a20 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  f( bCommit==0 ){
18a30 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f  .        /* Remo
18a40 76 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ve the page from
18a50 20 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d   the files free-
18a60 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f  list. This is no
18a70 74 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20  t required.     
18a80 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74     ** if bCommit
18a90 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e   is non-zero. In
18aa0 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20   that case, the 
18ab0 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  free-list will b
18ac0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75  e.        ** tru
18ad0 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61  ncated to zero a
18ae0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
18af0 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69  on returns, so i
18b00 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20  t doesn't .     
18b10 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20     ** matter if 
18b20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e  it still contain
18b30 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65  s some garbage e
18b40 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20  ntries..        
18b50 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  */.        Pgno 
18b60 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  iFreePg;.       
18b70 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
18b80 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
18b90 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
18ba0 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
18bb0 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74   &iFreePg, iLast
18bc0 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43  Pg, BTALLOC_EXAC
18bd0 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  T);.        if( 
18be0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18bf0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
18c00 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
18c10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
18c20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67  iFreePg==iLastPg
18c30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   );.        rele
18c40 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
18c50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
18c60 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e  else {.      Pgn
18c70 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20  o iFreePg;      
18c80 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
18c90 6f 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20  of free page to 
18ca0 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20  move pLastPg to 
18cb0 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  */.      MemPage
18cc0 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20 20 20   *pLastPg;.     
18cd0 20 75 38 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c   u8 eMode = BTAL
18ce0 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f  LOC_ANY;   /* Mo
18cf0 64 65 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  de parameter for
18d00 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
18d10 67 65 28 29 20 2a 2f 0a 20 20 20 20 20 20 50 67  ge() */.      Pg
18d20 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20 20 20  no iNear = 0;   
18d30 20 20 20 20 20 20 20 20 2f 2a 20 6e 65 61 72 62          /* nearb
18d40 79 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20  y parameter for 
18d50 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
18d60 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63  e() */..      rc
18d70 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
18d80 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70  pBt, iLastPg, &p
18d90 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20  LastPg, 0);.    
18da0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18db0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
18dc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
18dd0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 62  }..      /* If b
18de0 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20  Commit is zero, 
18df0 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65  this loop runs e
18e00 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20  xactly once and 
18e10 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20  page pLastPg.   
18e20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64     ** is swapped
18e30 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20   with the first 
18e40 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64  free page pulled
18e50 20 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c 69   off the free li
18e60 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  st..      **.   
18e70 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68     ** On the oth
18e80 65 72 20 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d  er hand, if bCom
18e90 6d 69 74 20 69 73 20 67 72 65 61 74 65 72 20 74  mit is greater t
18ea0 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b  han zero, then k
18eb0 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f  eep.      ** loo
18ec0 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65  ping until a fre
18ed0 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77  e-page located w
18ee0 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20  ithin the first 
18ef0 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20  nFin pages.     
18f00 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20   ** of the file 
18f10 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20  is found..      
18f20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f  */.      if( bCo
18f30 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  mmit==0 ){.     
18f40 20 20 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c     eMode = BTALL
18f50 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69  OC_LE;.        i
18f60 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20  Near = nFin;.   
18f70 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a     }.      do {.
18f80 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
18f90 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
18fa0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
18fb0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
18fc0 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
18fd0 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b  , iNear, eMode);
18fe0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
18ff0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19000 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
19010 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20  age(pLastPg);.  
19020 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
19030 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
19040 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
19050 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20  (pFreePg);.     
19060 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74   }while( bCommit
19070 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e   && iFreePg>nFin
19080 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
19090 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50  ( iFreePg<iLastP
190a0 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20  g );.      .    
190b0 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50    rc = relocateP
190c0 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67  age(pBt, pLastPg
190d0 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67  , eType, iPtrPag
190e0 65 2c 20 69 46 72 65 65 50 67 2c 20 62 43 6f 6d  e, iFreePg, bCom
190f0 6d 69 74 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  mit);.      rele
19100 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29  asePage(pLastPg)
19110 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
19120 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19130 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
19140 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19150 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74  }..  if( bCommit
19160 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a  ==0 ){.    do {.
19170 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b        iLastPg--;
19180 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 4c 61  .    }while( iLa
19190 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  stPg==PENDING_BY
191a0 54 45 5f 50 41 47 45 28 70 42 74 29 20 7c 7c 20  TE_PAGE(pBt) || 
191b0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
191c0 74 2c 20 69 4c 61 73 74 50 67 29 20 29 3b 0a 20  t, iLastPg) );. 
191d0 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63     pBt->bDoTrunc
191e0 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 70 42 74  ate = 1;.    pBt
191f0 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50  ->nPage = iLastP
19200 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
19210 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
19220 0a 2a 2a 20 54 68 65 20 64 61 74 61 62 61 73 65  .** The database
19230 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 66   opened by the f
19240 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
19250 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
19260 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69  database.** nOri
19270 67 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65 20  g pages in size 
19280 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65 65  containing nFree
19290 20 66 72 65 65 20 70 61 67 65 73 2e 20 52 65 74   free pages. Ret
192a0 75 72 6e 20 74 68 65 20 65 78 70 65 63 74 65 64  urn the expected
192b0 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65   .** size of the
192c0 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61 67   database in pag
192d0 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20  es following an 
192e0 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72  auto-vacuum oper
192f0 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
19300 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a   Pgno finalDbSiz
19310 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  e(BtShared *pBt,
19320 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e   Pgno nOrig, Pgn
19330 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74 20  o nFree){.  int 
19340 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20 20  nEntry;         
19350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
19360 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
19370 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70   on one ptrmap p
19380 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50  age */.  Pgno nP
19390 74 72 6d 61 70 3b 20 20 20 20 20 20 20 20 20 20  trmap;          
193a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
193b0 65 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67  er of PtrMap pag
193c0 65 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a  es to be freed *
193d0 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20  /.  Pgno nFin;  
193e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193f0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
19400 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79  lue */..  nEntry
19410 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
19420 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20  ze/5;.  nPtrmap 
19430 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50  = (nFree-nOrig+P
19440 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
19450 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29  , nOrig)+nEntry)
19460 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20  /nEntry;.  nFin 
19470 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20  = nOrig - nFree 
19480 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66 28  - nPtrmap;.  if(
19490 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42   nOrig>PENDING_B
194a0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26  YTE_PAGE(pBt) &&
194b0 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59   nFin<PENDING_BY
194c0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
194d0 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a      nFin--;.  }.
194e0 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f    while( PTRMAP_
194f0 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e  ISPAGE(pBt, nFin
19500 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49  ) || nFin==PENDI
19510 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
19520 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b  ) ){.    nFin--;
19530 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e  .  }..  return n
19540 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  Fin;.}../*.** A 
19550 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
19560 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64  n must be opened
19570 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
19580 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
19590 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20  * It performs a 
195a0 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77  single unit of w
195b0 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69  ork towards an i
195c0 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
195d0 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  m..**.** If the 
195e0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
195f0 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20 61  um is finished a
19600 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
19610 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53  on has run,.** S
19620 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65  QLITE_DONE is re
19630 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73  turned. If it is
19640 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62   not finished, b
19650 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
19660 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  rred,.** SQLITE_
19670 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
19680 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c  Otherwise an SQL
19690 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ite error code. 
196a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
196b0 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42  treeIncrVacuum(B
196c0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
196d0 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
196e0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
196f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
19700 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
19710 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
19720 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
19730 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
19740 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
19750 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56   if( !pBt->autoV
19760 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  acuum ){.    rc 
19770 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
19780 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f   }else{.    Pgno
19790 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61   nOrig = btreePa
197a0 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
197b0 20 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67    Pgno nFree = g
197c0 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
197d0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
197e0 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20  ;.    Pgno nFin 
197f0 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42  = finalDbSize(pB
19800 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29  t, nOrig, nFree)
19810 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67  ;..    if( nOrig
19820 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 72  <nFin ){.      r
19830 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
19840 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c  PT_BKPT;.    }el
19850 73 65 20 69 66 28 20 6e 46 72 65 65 3e 30 20 29  se if( nFree>0 )
19860 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76  {.      rc = sav
19870 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
19880 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
19890 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
198a0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c  ){.        inval
198b0 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
198c0 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20  Cache(pBt);.    
198d0 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
198e0 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69  uumStep(pBt, nFi
198f0 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20  n, nOrig, 0);.  
19900 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
19910 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19920 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
19930 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
19940 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
19950 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
19960 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
19970 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
19980 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
19990 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
199a0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
199b0 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
199c0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
199d0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
199e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
199f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
19a00 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f   called prior to
19a10 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
19a20 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73  mit when a trans
19a30 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d  action.** is com
19a40 6d 69 74 74 65 64 20 66 6f 72 20 61 6e 20 61 75  mitted for an au
19a50 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
19a60 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  se..**.** If SQL
19a70 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
19a80 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e  ed, then *pnTrun
19a90 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  c is set to the 
19aa0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a  number of pages.
19ab0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
19ac0 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74  file should be t
19ad0 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69  runcated to duri
19ae0 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72  ng the commit pr
19af0 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20  ocess. .** i.e. 
19b00 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
19b10 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65   been reorganize
19b20 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74  d so that only t
19b30 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e  he first *pnTrun
19b40 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69  c.** pages are i
19b50 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  n use..*/.static
19b60 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43   int autoVacuumC
19b70 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a  ommit(BtShared *
19b80 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pBt){.  int rc =
19b90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61   SQLITE_OK;.  Pa
19ba0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42  ger *pPager = pB
19bb0 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41  t->pPager;.  VVA
19bc0 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20  _ONLY( int nRef 
19bd0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
19be0 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29  fcount(pPager) )
19bf0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
19c00 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
19c10 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
19c20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
19c30 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
19c40 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e  ;.  assert(pBt->
19c50 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69  autoVacuum);.  i
19c60 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63  f( !pBt->incrVac
19c70 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
19c80 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  nFin;         /*
19c90 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
19ca0 20 69 6e 20 64 61 74 61 62 61 73 65 20 61 66 74   in database aft
19cb0 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67  er autovacuuming
19cc0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72   */.    Pgno nFr
19cd0 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ee;        /* Nu
19ce0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
19cf0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e   the freelist in
19d00 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50  itially */.    P
19d10 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20  gno iFree;      
19d20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61    /* The next pa
19d30 67 65 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a  ge to be freed *
19d40 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67  /.    Pgno nOrig
19d50 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ;        /* Data
19d60 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65  base size before
19d70 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20   freeing */..   
19d80 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61   nOrig = btreePa
19d90 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
19da0 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50    if( PTRMAP_ISP
19db0 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20  AGE(pBt, nOrig) 
19dc0 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e  || nOrig==PENDIN
19dd0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
19de0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20   ){.      /* It 
19df0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
19e00 74 6f 20 63 72 65 61 74 65 20 61 20 64 61 74 61  to create a data
19e10 62 61 73 65 20 66 6f 72 20 77 68 69 63 68 20 74  base for which t
19e20 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20  he final page.  
19e30 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72      ** is either
19e40 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
19e50 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69  age or the pendi
19e60 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66  ng-byte page. If
19e70 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73   one.      ** is
19e80 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
19e90 69 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72  is indicates cor
19ea0 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  ruption..      *
19eb0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
19ec0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
19ed0 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e  PT;.    }..    n
19ee0 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
19ef0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
19f00 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46  ata[36]);.    nF
19f10 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65  in = finalDbSize
19f20 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72  (pBt, nOrig, nFr
19f30 65 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 69  ee);.    if( nFi
19f40 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e  n>nOrig ) return
19f50 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
19f60 42 4b 50 54 3b 0a 20 20 20 20 69 66 28 20 6e 46  BKPT;.    if( nF
19f70 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20  in<nOrig ){.    
19f80 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75    rc = saveAllCu
19f90 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29  rsors(pBt, 0, 0)
19fa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
19fb0 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72  iFree=nOrig; iFr
19fc0 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53  ee>nFin && rc==S
19fd0 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d  QLITE_OK; iFree-
19fe0 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69  -){.      rc = i
19ff0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
1a000 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20  t, nFin, iFree, 
1a010 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
1a020 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  ( (rc==SQLITE_DO
1a030 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  NE || rc==SQLITE
1a040 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20  _OK) && nFree>0 
1a050 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
1a060 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1a070 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
1a080 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74  Page);.      put
1a090 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1a0a0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30  e1->aData[32], 0
1a0b0 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
1a0c0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1a0d0 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20  aData[36], 0);. 
1a0e0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1a0f0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1a100 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20  a[28], nFin);.  
1a110 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e      pBt->bDoTrun
1a120 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  cate = 1;.      
1a130 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69  pBt->nPage = nFi
1a140 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  n;.    }.    if(
1a150 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a160 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
1a170 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61  agerRollback(pPa
1a180 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
1a190 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3e  .  assert( nRef>
1a1a0 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66  =sqlite3PagerRef
1a1b0 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b  count(pPager) );
1a1c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a1d0 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66  .#else /* ifndef
1a1e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1a1f0 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66  OVACUUM */.# def
1a200 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d  ine setChildPtrm
1a210 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b  aps(x) SQLITE_OK
1a220 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1a230 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
1a240 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65   the first phase
1a250 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20   of a two-phase 
1a260 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f  commit.  This ro
1a270 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20  utine.** causes 
1a280 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  a rollback journ
1a290 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  al to be created
1a2a0 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74   (if it does not
1a2b0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a   already exist).
1a2c0 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64  ** and populated
1a2d0 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66   with enough inf
1a2e0 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74  ormation so that
1a2f0 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73   if a power loss
1a300 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64   occurs.** the d
1a310 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 72  atabase can be r
1a320 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f  estored to its o
1a330 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79  riginal state by
1a340 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a   playing back.**
1a350 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54   the journal.  T
1a360 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hen the contents
1a370 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1a380 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20  are flushed out 
1a390 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20  to.** the disk. 
1a3a0 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e   After the journ
1a3b0 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20  al is safely on 
1a3c0 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67  oxide, the chang
1a3d0 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74  es to the.** dat
1a3e0 61 62 61 73 65 20 61 72 65 20 77 72 69 74 74 65  abase are writte
1a3f0 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  n into the datab
1a400 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75  ase file and flu
1a410 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a  shed to oxide..*
1a420 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * At the end of 
1a430 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72  this call, the r
1a440 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
1a450 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20  still exists on 
1a460 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20  the.** disk and 
1a470 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c  we are still hol
1a480 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20  ding all locks, 
1a490 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  so the transacti
1a4a0 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f  on has not.** co
1a4b0 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73 71  mmitted.  See sq
1a4c0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1a4d0 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74  PhaseTwo() for t
1a4e0 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20  he second phase 
1a4f0 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74  of the.** commit
1a500 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
1a510 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  This call is a n
1a520 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65  o-op if no write
1a530 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
1a540 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
1a550 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f   on pBt..**.** O
1a560 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74  therwise, sync t
1a570 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1a580 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20 70   for the btree p
1a590 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e  Bt. zMaster poin
1a5a0 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d  ts to.** the nam
1a5b0 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
1a5c0 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
1a5d0 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
1a5e0 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e  n into the.** in
1a5f0 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
1a600 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c   file, or is NUL
1a610 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f  L, indicating no
1a620 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1a630 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65  file .** (single
1a640 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
1a650 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68  ction)..**.** Wh
1a660 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
1a670 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  d, the master jo
1a680 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72  urnal should alr
1a690 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a  eady have been.*
1a6a0 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c  * created, popul
1a6b0 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 6a  ated with this j
1a6c0 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61  ournal pointer a
1a6d0 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  nd synced to dis
1a6e0 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68  k..**.** Once th
1a6f0 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61  is is routine ha
1a700 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20  s returned, the 
1a710 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69  only thing requi
1a720 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a  red to commit.**
1a730 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73   the write-trans
1a740 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20  action for this 
1a750 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1a760 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
1a770 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73  ournal..*/.int s
1a780 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1a790 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20  tPhaseOne(Btree 
1a7a0 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
1a7b0 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
1a7c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1a7d0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1a7e0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
1a7f0 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
1a800 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
1a810 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1a820 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53  er(p);.#ifndef S
1a830 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1a840 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
1a850 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
1a860 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f  .      rc = auto
1a870 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74  VacuumCommit(pBt
1a880 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1a890 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a8a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1a8b0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
1a8c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1a8d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1a8e0 20 69 66 28 20 70 42 74 2d 3e 62 44 6f 54 72 75   if( pBt->bDoTru
1a8f0 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73  ncate ){.      s
1a900 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
1a910 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50  ateImage(pBt->pP
1a920 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65  ager, pBt->nPage
1a930 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
1a940 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a950 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
1a960 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  One(pBt->pPager,
1a970 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
1a980 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1a990 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ave(p);.  }.  re
1a9a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1a9b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1a9c0 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62  is called from b
1a9d0 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50  oth BtreeCommitP
1a9e0 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74  haseTwo() and Bt
1a9f0 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a  reeRollback().**
1aa00 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
1aa10 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  on of a transact
1aa20 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
1aa30 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e  oid btreeEndTran
1aa40 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70  saction(Btree *p
1aa50 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
1aa60 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
1aa70 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
1aa80 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  db;.  assert( sq
1aa90 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
1aaa0 75 74 65 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e  utex(p) );..#ifn
1aab0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1aac0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 70 42 74  AUTOVACUUM.  pBt
1aad0 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20  ->bDoTruncate = 
1aae0 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  0;.#endif.  if( 
1aaf0 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53  p->inTrans>TRANS
1ab00 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56 64  _NONE && db->nVd
1ab10 62 65 52 65 61 64 3e 31 20 29 7b 0a 20 20 20 20  beRead>1 ){.    
1ab20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
1ab30 6f 74 68 65 72 20 61 63 74 69 76 65 20 73 74 61  other active sta
1ab40 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c  tements that bel
1ab50 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74 61  ong to this data
1ab60 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64  base.    ** hand
1ab70 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f  le, downgrade to
1ab80 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61   a read-only tra
1ab90 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74  nsaction. The ot
1aba0 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20  her statements. 
1abb0 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20     ** may still 
1abc0 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  be reading from 
1abd0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a  the database.  *
1abe0 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41  /.    downgradeA
1abf0 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
1ac00 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20  leLocks(p);.    
1ac10 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
1ac20 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65  NS_READ;.  }else
1ac30 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
1ac40 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b  handle had any k
1ac50 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69  ind of transacti
1ac60 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65  on open, decreme
1ac70 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74  nt the .    ** t
1ac80 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1ac90 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 62   of the shared b
1aca0 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72 61  tree. If the tra
1acb0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a  nsaction count .
1acc0 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30      ** reaches 0
1acd0 2c 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64  , set the shared
1ace0 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
1acf0 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b  NONE. The unlock
1ad00 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a  BtreeIfUnused().
1ad10 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f      ** call belo
1ad20 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68  w will unlock th
1ad30 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20  e pager.  */.   
1ad40 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
1ad50 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
1ad60 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61       clearAllSha
1ad70 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1ad80 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74  ks(p);.      pBt
1ad90 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d  ->nTransaction--
1ada0 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70  ;.      if( 0==p
1adb0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
1adc0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
1add0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
1ade0 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20   TRANS_NONE;.   
1adf0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1ae00 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 72 65  /* Set the curre
1ae10 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
1ae20 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
1ae30 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  NE and unlock th
1ae40 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20  e .    ** pager 
1ae50 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f  if this call clo
1ae60 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61  sed the only rea
1ae70 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
1ae80 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20  action.  */.    
1ae90 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
1aea0 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c  NS_NONE;.    unl
1aeb0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
1aec0 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
1aed0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
1aee0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
1aef0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1af00 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72   currently in pr
1af10 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ogress..**.** Th
1af20 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65  is routine imple
1af30 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64  ments the second
1af40 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68   phase of a 2-ph
1af50 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65  ase commit.  The
1af60 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
1af70 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
1af80 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
1af90 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61 6e  e first phase an
1afa0 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69  d should.** be i
1afb0 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20  nvoked prior to 
1afc0 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
1afd0 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74  tine.  The sqlit
1afe0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1aff0 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69  seOne().** routi
1b000 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77  ne did all the w
1b010 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69  ork of writing i
1b020 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74  nformation out t
1b030 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68  o disk and flush
1b040 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ing the.** conte
1b050 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  nts so that they
1b060 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74   are written ont
1b070 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74  o the disk platt
1b080 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a  er.  All this.**
1b090 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20   routine has to 
1b0a0 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20  do is delete or 
1b0b0 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f  truncate or zero
1b0c0 20 74 68 65 20 68 65 61 64 65 72 20 69 6e 20 74   the header in t
1b0d0 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  he.** the rollba
1b0e0 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63  ck journal (whic
1b0f0 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72 61  h causes the tra
1b100 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d  nsaction to comm
1b110 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20  it) and.** drop 
1b120 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72  locks..**.** Nor
1b130 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72  mally, if an err
1b140 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
1b150 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
1b160 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  is attempting to
1b170 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68   .** finalize th
1b180 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75  e underlying jou
1b190 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20  rnal file, this 
1b1a0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1b1b0 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a   an error and.**
1b1c0 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
1b1d0 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20   will attempt a 
1b1e0 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65  rollback. Howeve
1b1f0 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  r, if the second
1b200 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20   argument.** is 
1b210 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68  non-zero then th
1b220 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61  is b-tree transa
1b230 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66  ction is part of
1b240 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a   a multi-file .*
1b250 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  * transaction. I
1b260 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
1b270 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
1b280 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f   already been co
1b290 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20  mmitted .** (by 
1b2a0 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65  deleting a maste
1b2b0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  r journal file) 
1b2c0 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77  and the caller w
1b2d0 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20  ill ignore this 
1b2e0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65  .** functions re
1b2f0 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65  turn code. So, e
1b300 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ven if an error 
1b310 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 70 61  occurs in the pa
1b320 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65  ger layer,.** re
1b330 73 65 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f  set the b-tree o
1b340 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20  bjects internal 
1b350 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74  state to indicat
1b360 65 20 74 68 61 74 20 74 68 65 20 77 72 69 74 65  e that the write
1b370 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
1b380 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e  has been closed.
1b390 20 54 68 69 73 20 69 73 20 71 75 69 74 65 20 73   This is quite s
1b3a0 61 66 65 2c 20 61 73 20 74 68 65 20 70 61 67 65  afe, as the page
1b3b0 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74  r will have.** t
1b3c0 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74  ransitioned to t
1b3d0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a  he error state..
1b3e0 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
1b3f0 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
1b400 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
1b410 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
1b420 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
1b430 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
1b440 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
1b450 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
1b460 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1b470 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
1b480 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  wo(Btree *p, int
1b490 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69   bCleanup){..  i
1b4a0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1b4b0 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75  RANS_NONE ) retu
1b4c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1b4d0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1b4e0 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
1b4f0 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
1b500 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68   If the handle h
1b510 61 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  as a write-trans
1b520 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d  action open, com
1b530 6d 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62  mit the shared-b
1b540 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e  trees .  ** tran
1b550 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20  saction and set 
1b560 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
1b570 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a   to TRANS_READ..
1b580 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
1b590 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1b5a0 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
1b5b0 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  ;.    BtShared *
1b5c0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1b5d0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
1b5e0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1b5f0 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20  ANS_WRITE );.   
1b600 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54   assert( pBt->nT
1b610 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a  ransaction>0 );.
1b620 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b630 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
1b640 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Two(pBt->pPager)
1b650 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1b660 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61  LITE_OK && bClea
1b670 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nup==0 ){.      
1b680 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1b690 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(p);.      retu
1b6a0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1b6b0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1b6c0 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
1b6d0 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72  ;.    btreeClear
1b6e0 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b  HasContent(pBt);
1b6f0 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64  .  }..  btreeEnd
1b700 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a  Transaction(p);.
1b710 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1b720 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1b730 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1b740 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61  *.** Do both pha
1b750 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e  ses of a commit.
1b760 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1b770 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65  treeCommit(Btree
1b780 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
1b790 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1b7a0 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73  ter(p);.  rc = s
1b7b0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1b7c0 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b  tPhaseOne(p, 0);
1b7d0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1b7e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1b7f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1b800 6d 69 74 50 68 61 73 65 54 77 6f 28 70 2c 20 30  mitPhaseTwo(p, 0
1b810 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1b820 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1b830 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1b840 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1b850 65 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65  e sets the state
1b860 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54   to CURSOR_FAULT
1b870 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a   and the error.*
1b880 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64  * code to errCod
1b890 65 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73  e for every curs
1b8a0 6f 72 20 6f 6e 20 42 74 53 68 61 72 65 64 20 74  or on BtShared t
1b8b0 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65  hat pBtree.** re
1b8c0 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20  ferences..**.** 
1b8d0 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20  Every cursor is 
1b8e0 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69  tripped, includi
1b8f0 6e 67 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  ng cursors that 
1b900 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68  belong.** to oth
1b910 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
1b920 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70  ections that hap
1b930 70 65 6e 20 74 6f 20 62 65 20 73 68 61 72 69 6e  pen to be sharin
1b940 67 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 77  g.** the cache w
1b950 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a  ith pBtree..**.*
1b960 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
1b970 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20  ets called when 
1b980 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
1b990 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72  s..** All cursor
1b9a0 73 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  s using the same
1b9b0 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 74   cache must be t
1b9c0 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72 65  ripped.** to pre
1b9d0 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20 74  vent them from t
1b9e0 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65  rying to use the
1b9f0 20 62 74 72 65 65 20 61 66 74 65 72 0a 2a 2a 20   btree after.** 
1ba00 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54  the rollback.  T
1ba10 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20  he rollback may 
1ba20 68 61 76 65 20 64 65 6c 65 74 65 64 20 74 61 62  have deleted tab
1ba30 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20  les.** or moved 
1ba40 72 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f 20 69  root pages, so i
1ba50 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69  t is not suffici
1ba60 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20 74  ent to.** save t
1ba70 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
1ba80 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63 75 72  cursor.  The cur
1ba90 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69  sor must be.** i
1baa0 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 76  nvalidated..*/.v
1bab0 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
1bac0 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42  TripAllCursors(B
1bad0 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e  tree *pBtree, in
1bae0 74 20 65 72 72 43 6f 64 65 29 7b 0a 20 20 42 74  t errCode){.  Bt
1baf0 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69 66 28  Cursor *p;.  if(
1bb00 20 70 42 74 72 65 65 3d 3d 30 20 29 20 72 65 74   pBtree==0 ) ret
1bb10 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  urn;.  sqlite3Bt
1bb20 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
1bb30 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65  ;.  for(p=pBtree
1bb40 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  ->pBt->pCursor; 
1bb50 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
1bb60 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
1bb70 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
1bb80 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 70  Cursor(p);.    p
1bb90 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
1bba0 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d 3e  R_FAULT;.    p->
1bbb0 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43 6f  skipNext = errCo
1bbc0 64 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  de;.    for(i=0;
1bbd0 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b   i<=p->iPage; i+
1bbe0 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  +){.      releas
1bbf0 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b  ePage(p->apPage[
1bc00 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70  i]);.      p->ap
1bc10 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  Page[i] = 0;.   
1bc20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
1bc30 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
1bc40 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  e);.}../*.** Rol
1bc50 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
1bc60 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
1bc70 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72 73 20  s.  All cursors 
1bc80 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c  will be.** inval
1bc90 69 64 65 64 20 62 79 20 74 68 69 73 20 6f 70 65  ided by this ope
1bca0 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74  ration.  Any att
1bcb0 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 63 75  empt to use a cu
1bcc0 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61 73  rsor.** that was
1bcd0 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65 67   open at the beg
1bce0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f  inning of this o
1bcf0 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65  peration will re
1bd00 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72  sult.** in an er
1bd10 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ror..**.** This 
1bd20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
1bd30 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
1bd40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1bd50 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
1bd60 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
1bd70 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
1bd80 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
1bd90 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
1bda0 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
1bdb0 6b 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  k(Btree *p, int 
1bdc0 74 72 69 70 43 6f 64 65 29 7b 0a 20 20 69 6e 74  tripCode){.  int
1bdd0 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
1bde0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1bdf0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
1be00 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
1be10 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
1be20 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54   tripCode==SQLIT
1be30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1be40 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61 76 65   tripCode = save
1be50 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
1be60 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  0, 0);.  }else{.
1be70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1be80 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 72  OK;.  }.  if( tr
1be90 69 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 73 71  ipCode ){.    sq
1bea0 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
1beb0 6c 43 75 72 73 6f 72 73 28 70 2c 20 74 72 69 70  lCursors(p, trip
1bec0 43 6f 64 65 29 3b 0a 20 20 7d 0a 20 20 62 74 72  Code);.  }.  btr
1bed0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1bee0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1bef0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1bf00 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a  {.    int rc2;..
1bf10 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e      assert( TRAN
1bf20 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e  S_WRITE==pBt->in
1bf30 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20  Transaction );. 
1bf40 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
1bf50 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42  PagerRollback(pB
1bf60 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
1bf70 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f  if( rc2!=SQLITE_
1bf80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
1bf90 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   rc2;.    }..   
1bfa0 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b   /* The rollback
1bfb0 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72 6f   may have destro
1bfc0 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e  yed the pPage1->
1bfd0 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f  aData value.  So
1bfe0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72  .    ** call btr
1bff0 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70  eeGetPage() on p
1c000 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d  age 1 again to m
1c010 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20  ake.    ** sure 
1c020 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73  pPage1->aData is
1c030 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20   set correctly. 
1c040 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65 65  */.    if( btree
1c050 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20  GetPage(pBt, 1, 
1c060 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c  &pPage1, 0)==SQL
1c070 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c080 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65 74 34  int nPage = get4
1c090 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61  byte(28+(u8*)pPa
1c0a0 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  ge1->aData);.   
1c0b0 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61     testcase( nPa
1c0c0 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ge==0 );.      i
1c0d0 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71  f( nPage==0 ) sq
1c0e0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1c0f0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
1c100 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
1c110 74 65 73 74 63 61 73 65 28 20 70 42 74 2d 3e 6e  testcase( pBt->n
1c120 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20  Page!=nPage );. 
1c130 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
1c140 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72  = nPage;.      r
1c150 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
1c160 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
1c170 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64  sert( countValid
1c180 43 75 72 73 6f 72 73 28 70 42 74 2c 20 31 29 3d  Cursors(pBt, 1)=
1c190 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  =0 );.    pBt->i
1c1a0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
1c1b0 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62  RANS_READ;.    b
1c1c0 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
1c1d0 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20  ent(pBt);.  }.. 
1c1e0 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
1c1f0 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74  tion(p);.  sqlit
1c200 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1c210 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c220 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73  ./*.** Start a s
1c230 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
1c240 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62  saction. The sub
1c250 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20  transaction can 
1c260 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a  can be rolled.**
1c270 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
1c280 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  tly of the main 
1c290 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75  transaction. You
1c2a0 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   must start a tr
1c2b0 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65  ansaction .** be
1c2c0 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61 20  fore starting a 
1c2d0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
1c2e0 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
1c2f0 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f  on is ended auto
1c300 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66  matically .** if
1c310 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
1c320 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72  ction commits or
1c330 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a   rolls back..**.
1c340 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62  ** Statement sub
1c350 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
1c360 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64   used around ind
1c370 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74  ividual SQL stat
1c380 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61  ements.** that a
1c390 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  re contained wit
1c3a0 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f  hin a BEGIN...CO
1c3b0 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20  MMIT block.  If 
1c3c0 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  a constraint.** 
1c3d0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
1c3e0 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
1c3f0 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  t, the effect of
1c400 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d   that one statem
1c410 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f  ent.** can be ro
1c420 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75  lled back withou
1c430 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c  t having to roll
1c440 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20  back the entire 
1c450 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1c460 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73  ** A statement s
1c470 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ub-transaction i
1c480 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
1c490 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61   an anonymous sa
1c4a0 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20  vepoint. The.** 
1c4b0 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
1c4c0 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
1c4d0 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74 61  eter is the tota
1c4e0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65  l number of save
1c4f0 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75  points,.** inclu
1c500 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f  ding the new ano
1c510 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
1c520 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d  , open on the B-
1c530 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68  Tree. i.e. if th
1c540 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
1c550 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
1c560 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61  and no other sta
1c570 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69  tement-transacti
1c580 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74  ons open,.** iSt
1c590 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68  atement is 1. Th
1c5a0 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  is anonymous sav
1c5b0 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65  epoint can be re
1c5c0 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64  leased or rolled
1c5d0 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74   back.** using t
1c5e0 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  he sqlite3BtreeS
1c5f0 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74  avepoint() funct
1c600 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
1c610 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d  te3BtreeBeginStm
1c620 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
1c630 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69  iStatement){.  i
1c640 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
1c650 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1c660 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1c670 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
1c680 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  t( p->inTrans==T
1c690 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
1c6a0 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74  assert( (pBt->bt
1c6b0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
1c6c0 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20  D_ONLY)==0 );.  
1c6d0 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
1c6e0 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  nt>0 );.  assert
1c6f0 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e  ( iStatement>p->
1c700 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29  db->nSavepoint )
1c710 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
1c720 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1c730 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
1c740 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65 72   /* At the pager
1c750 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d   level, a statem
1c760 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1c770 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77  is a savepoint w
1c780 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65  ith.  ** an inde
1c790 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61  x greater than a
1c7a0 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72  ll savepoints cr
1c7b0 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79  eated explicitly
1c7c0 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20   using.  ** SQL 
1c7d0 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69  statements. It i
1c7e0 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65  s illegal to ope
1c7f0 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f  n, release or ro
1c800 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20  llback any.  ** 
1c810 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20  such savepoints 
1c820 77 68 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d  while the statem
1c830 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1c840 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74  savepoint is act
1c850 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ive..  */.  rc =
1c860 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
1c870 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
1c880 70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65  pPager, iStateme
1c890 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  nt);.  sqlite3Bt
1c8a0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1c8b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1c8c0 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
1c8d0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
1c8e0 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20  unction, op, is 
1c8f0 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54  always SAVEPOINT
1c900 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20  _ROLLBACK.** or 
1c910 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
1c920 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  E. This function
1c930 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65 73   either releases
1c940 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74   or rolls back t
1c950 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  he.** savepoint 
1c960 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
1c970 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69  rameter iSavepoi
1c980 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  nt, depending on
1c990 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f   the value .** o
1c9a0 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  f op..**.** Norm
1c9b0 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74  ally, iSavepoint
1c9c0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1c9d0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
1c9e0 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f  o. However, if o
1c9f0 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e  p is.** SAVEPOIN
1ca00 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e  T_ROLLBACK, then
1ca10 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20   iSavepoint may 
1ca20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74  also be -1. In t
1ca30 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a  his case the .**
1ca40 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1ca50 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
1ca60 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62  ion are rolled b
1ca70 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66  ack. This is dif
1ca80 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61  ferent.** from a
1ca90 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74   normal transact
1caa0 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73  ion rollback, as
1cab0 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65   no locks are re
1cac0 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  leased and the.*
1cad0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65  * transaction re
1cae0 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69  mains open..*/.i
1caf0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
1cb00 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a  avepoint(Btree *
1cb10 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69  p, int op, int i
1cb20 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
1cb30 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1cb40 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
1cb50 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1cb60 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
1cb70 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1cb80 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
1cb90 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
1cba0 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56  LEASE || op==SAV
1cbb0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
1cbc0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
1cbd0 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20  Savepoint>=0 || 
1cbe0 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20  (iSavepoint==-1 
1cbf0 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  && op==SAVEPOINT
1cc00 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20  _ROLLBACK) );.  
1cc10 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1cc20 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d  ter(p);.    rc =
1cc30 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76   sqlite3PagerSav
1cc40 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
1cc50 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69  er, op, iSavepoi
1cc60 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  nt);.    if( rc=
1cc70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1cc80 20 20 20 20 69 66 28 20 69 53 61 76 65 70 6f 69      if( iSavepoi
1cc90 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62 74  nt<0 && (pBt->bt
1cca0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e 49  sFlags & BTS_INI
1ccb0 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30  TIALLY_EMPTY)!=0
1ccc0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
1ccd0 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  >nPage = 0;.    
1cce0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 6e    }.      rc = n
1ccf0 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
1cd00 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
1cd10 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 20  e = get4byte(28 
1cd20 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  + pBt->pPage1->a
1cd30 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Data);..      /*
1cd40 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1cd50 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69  ze was written i
1cd60 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 32  nto the offset 2
1cd70 38 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 0a  8 of the header.
1cd80 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68        ** when th
1cd90 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  e transaction st
1cda0 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f  arted, so we kno
1cdb0 77 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  w that the value
1cdc0 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20 20   at offset.     
1cdd0 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72   ** 28 is nonzer
1cde0 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  o. */.      asse
1cdf0 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30  rt( pBt->nPage>0
1ce00 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
1ce10 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1ce20 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
1ce30 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
1ce40 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f  eate a new curso
1ce50 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20  r for the BTree 
1ce60 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e  whose root is on
1ce70 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61   the page.** iTa
1ce80 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f  ble. If a read-o
1ce90 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72 65  nly cursor is re
1cea0 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 61  quested, it is a
1ceb0 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74  ssumed that.** t
1cec0 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64  he caller alread
1ced0 79 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 61  y has at least a
1cee0 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73   read-only trans
1cef0 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f  action open.** o
1cf00 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
1cf10 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77 72 69  lready. If a wri
1cf20 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71  te-cursor is req
1cf30 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20  uested, then.** 
1cf40 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73  the caller is as
1cf50 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e  sumed to have an
1cf60 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
1cf70 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  saction..**.** I
1cf80 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65  f wrFlag==0, the
1cf90 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e  n the cursor can
1cfa0 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f   only be used fo
1cfb0 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66  r reading..** If
1cfc0 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e   wrFlag==1, then
1cfd0 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
1cfe0 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
1cff0 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72  ing or for.** wr
1d000 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63  iting if other c
1d010 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72  onditions for wr
1d020 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d  iting are also m
1d030 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72  et.  These.** ar
1d040 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  e the conditions
1d050 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65   that must be me
1d060 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77  t in order for w
1d070 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20  riting to.** be 
1d080 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31  allowed:.**.** 1
1d090 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  :  The cursor mu
1d0a0 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  st have been ope
1d0b0 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d  ned with wrFlag=
1d0c0 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68  =1.**.** 2:  Oth
1d0d0 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
1d0e0 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61  ections that sha
1d0f0 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  re the same page
1d100 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62  r cache.**     b
1d110 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74  ut which are not
1d120 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43   in the READ_UNC
1d130 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d  OMMITTED state m
1d140 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20  ay not have.**  
1d150 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20     cursors open 
1d160 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f  with wrFlag==0 o
1d170 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  n the same table
1d180 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  .  Otherwise.** 
1d190 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20      the changes 
1d1a0 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69  made by this wri
1d1b0 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  te cursor would 
1d1c0 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a  be visible to.**
1d1d0 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75       the read cu
1d1e0 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68  rsors in the oth
1d1f0 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
1d200 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a  ection..**.** 3:
1d210 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d    The database m
1d220 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20  ust be writable 
1d230 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c  (not on read-onl
1d240 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34  y media).**.** 4
1d250 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  :  There must be
1d260 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73   an active trans
1d270 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  action..**.** No
1d280 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e   checking is don
1d290 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
1d2a0 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20  hat page iTable 
1d2b0 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a  really is the.**
1d2c0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
1d2d0 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69  b-tree.  If it i
1d2e0 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
1d2f0 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a  cursor acquired.
1d300 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b  ** will not work
1d310 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a   correctly..**.*
1d320 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  * It is assumed 
1d330 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
1d340 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28  BtreeCursorZero(
1d350 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  ) has been calle
1d360 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20  d.** on pCur to 
1d370 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d  initialize the m
1d380 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69 6f  emory space prio
1d390 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68  r to invoking th
1d3a0 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73  is routine..*/.s
1d3b0 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43  tatic int btreeC
1d3c0 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
1d3d0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1d3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3f0 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
1d400 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1d410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d420 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
1d430 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
1d440 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
1d450 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
1d460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d470 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
1d480 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
1d490 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
1d4a0 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
1d4b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1d4c0 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72  st arg to compar
1d4d0 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ison function */
1d4e0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
1d4f0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
1d500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
1d510 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f  ce for new curso
1d520 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  r */.){.  BtShar
1d530 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1d540 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d550 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65   /* Shared b-tre
1d560 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20 20 61  e handle */..  a
1d570 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
1d580 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
1d590 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
1d5a0 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61  Flag==0 || wrFla
1d5b0 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  g==1 );..  /* Th
1d5c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
1d5d0 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65  rt statements ve
1d5e0 72 69 66 79 20 74 68 61 74 20 69 66 20 74 68 69  rify that if thi
1d5f0 73 20 69 73 20 61 20 73 68 61 72 61 62 6c 65 20  s is a sharable 
1d600 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74  .  ** b-tree dat
1d610 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65  abase, the conne
1d620 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
1d630 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61   the required ta
1d640 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a  ble locks, .  **
1d650 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68   and that no oth
1d660 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
1d670 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f  s any open curso
1d680 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73  r that conflicts
1d690 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73   with .  ** this
1d6a0 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73   lock.  */.  ass
1d6b0 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61  ert( hasSharedCa
1d6c0 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
1d6d0 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f  iTable, pKeyInfo
1d6e0 21 3d 30 2c 20 77 72 46 6c 61 67 2b 31 29 20 29  !=0, wrFlag+1) )
1d6f0 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
1d700 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61  ag==0 || !hasRea
1d710 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54  dConflicts(p, iT
1d720 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41  able) );..  /* A
1d730 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 63  ssert that the c
1d740 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64  aller has opened
1d750 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 72   the required tr
1d760 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20  ansaction. */.  
1d770 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61  assert( p->inTra
1d780 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b  ns>TRANS_NONE );
1d790 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
1d7a0 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61  g==0 || p->inTra
1d7b0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1d7c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
1d7d0 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42 74 2d  ->pPage1 && pBt-
1d7e0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  >pPage1->aData )
1d7f0 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 77  ;..  if( NEVER(w
1d800 72 46 6c 61 67 20 26 26 20 28 70 42 74 2d 3e 62  rFlag && (pBt->b
1d810 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
1d820 41 44 5f 4f 4e 4c 59 29 21 3d 30 29 20 29 7b 0a  AD_ONLY)!=0) ){.
1d830 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d840 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_READONLY;.  }.
1d850 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20    if( iTable==1 
1d860 26 26 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  && btreePagecoun
1d870 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20  t(pBt)==0 ){.   
1d880 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
1d890 3d 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c 65  =0 );.    iTable
1d8a0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
1d8b0 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  Now that no othe
1d8c0 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63  r errors can occ
1d8d0 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69  ur, finish filli
1d8e0 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73  ng in the BtCurs
1d8f0 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  or.  ** variable
1d900 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63  s and link the c
1d910 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42  ursor into the B
1d920 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20 2a  tShared list.  *
1d930 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  /.  pCur->pgnoRo
1d940 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c  ot = (Pgno)iTabl
1d950 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  e;.  pCur->iPage
1d960 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70   = -1;.  pCur->p
1d970 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e  KeyInfo = pKeyIn
1d980 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72  fo;.  pCur->pBtr
1d990 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e  ee = p;.  pCur->
1d9a0 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75  pBt = pBt;.  pCu
1d9b0 72 2d 3e 77 72 46 6c 61 67 20 3d 20 28 75 38 29  r->wrFlag = (u8)
1d9c0 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e  wrFlag;.  pCur->
1d9d0 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75  pNext = pBt->pCu
1d9e0 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75 72  rsor;.  if( pCur
1d9f0 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
1da00 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  Cur->pNext->pPre
1da10 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20  v = pCur;.  }.  
1da20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
1da30 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74  Cur;.  pCur->eSt
1da40 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
1da50 41 4c 49 44 3b 0a 20 20 70 43 75 72 2d 3e 63 61  ALID;.  pCur->ca
1da60 63 68 65 64 52 6f 77 69 64 20 3d 20 30 3b 0a 20  chedRowid = 0;. 
1da70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1da80 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  K;.}.int sqlite3
1da90 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  BtreeCursor(.  B
1daa0 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
1dab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1dad0 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
1dae0 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
1daf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db00 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
1db10 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
1db20 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
1db30 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
1db40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db50 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20          /* 1 to 
1db60 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e  write. 0 read-on
1db70 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b  ly */.  struct K
1db80 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1db90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1dba0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
1dbb0 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a   to xCompare() *
1dbc0 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
1dbd0 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
1dbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbf0 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72  /* Write new cur
1dc00 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  sor here */.){. 
1dc10 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
1dc20 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1dc30 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72  .  rc = btreeCur
1dc40 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77  sor(p, iTable, w
1dc50 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c  rFlag, pKeyInfo,
1dc60 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65   pCur);.  sqlite
1dc70 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1dc80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1dc90 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1dca0 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72   size of a BtCur
1dcb0 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79  sor object in by
1dcc0 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tes..**.** This 
1dcd0 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e 65  interfaces is ne
1dce0 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73 65  eded so that use
1dcf0 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61  rs of cursors ca
1dd00 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a  n preallocate.**
1dd10 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72   sufficient stor
1dd20 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75  age to hold a cu
1dd30 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72  rsor.  The BtCur
1dd40 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70  sor object is op
1dd50 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73  aque.** to users
1dd60 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20   so they cannot 
1dd70 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20  do the sizeof() 
1dd80 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65  themselves - the
1dd90 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74  y must call.** t
1dda0 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  his routine..*/.
1ddb0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1ddc0 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29  CursorSize(void)
1ddd0 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44  {.  return ROUND
1dde0 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f  8(sizeof(BtCurso
1ddf0 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  r));.}../*.** In
1de00 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20  itialize memory 
1de10 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e  that will be con
1de20 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42 74  verted into a Bt
1de30 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a  Cursor object..*
1de40 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65 20  *.** The simple 
1de50 61 70 70 72 6f 61 63 68 20 68 65 72 65 20 77 6f  approach here wo
1de60 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65 74  uld be to memset
1de70 28 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f 62  () the entire ob
1de80 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e  ject.** to zero.
1de90 20 20 42 75 74 20 69 74 20 74 75 72 6e 73 20 6f    But it turns o
1dea0 75 74 20 74 68 61 74 20 74 68 65 20 61 70 50 61  ut that the apPa
1deb0 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d  ge[] and aiIdx[]
1dec0 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f   arrays.** do no
1ded0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65 72  t need to be zer
1dee0 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61 72 65  oed and they are
1def0 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63 61   large, so we ca
1df00 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20  n save a lot.** 
1df10 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20 73  of run-time by s
1df20 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74  kipping the init
1df30 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68  ialization of th
1df40 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f  ose elements..*/
1df50 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
1df60 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74 43  eeCursorZero(BtC
1df70 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d  ursor *p){.  mem
1df80 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65 74  set(p, 0, offset
1df90 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69 50 61  of(BtCursor, iPa
1dfa0 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ge));.}../*.** S
1dfb0 65 74 20 74 68 65 20 63 61 63 68 65 64 20 72 6f  et the cached ro
1dfc0 77 69 64 20 76 61 6c 75 65 20 6f 66 20 65 76 65  wid value of eve
1dfd0 72 79 20 63 75 72 73 6f 72 20 69 6e 20 74 68 65  ry cursor in the
1dfe0 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
1dff0 69 6c 65 0a 2a 2a 20 61 73 20 70 43 75 72 20 61  ile.** as pCur a
1e000 6e 64 20 68 61 76 69 6e 67 20 74 68 65 20 73 61  nd having the sa
1e010 6d 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  me root page num
1e020 62 65 72 20 61 73 20 70 43 75 72 2e 20 20 54 68  ber as pCur.  Th
1e030 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65  e value is.** se
1e040 74 20 74 6f 20 69 52 6f 77 69 64 2e 0a 2a 2a 0a  t to iRowid..**.
1e050 2a 2a 20 4f 6e 6c 79 20 70 6f 73 69 74 69 76 65  ** Only positive
1e060 20 72 6f 77 69 64 20 76 61 6c 75 65 73 20 61 72   rowid values ar
1e070 65 20 63 6f 6e 73 69 64 65 72 65 64 20 76 61 6c  e considered val
1e080 69 64 20 66 6f 72 20 74 68 69 73 20 63 61 63 68  id for this cach
1e090 65 2e 0a 2a 2a 20 54 68 65 20 63 61 63 68 65 20  e..** The cache 
1e0a0 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
1e0b0 6f 20 7a 65 72 6f 2c 20 69 6e 64 69 63 61 74 69  o zero, indicati
1e0c0 6e 67 20 61 6e 20 69 6e 76 61 6c 69 64 20 63 61  ng an invalid ca
1e0d0 63 68 65 2e 0a 2a 2a 20 41 20 62 74 72 65 65 20  che..** A btree 
1e0e0 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 20 77  will work fine w
1e0f0 69 74 68 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61  ith zero or nega
1e100 74 69 76 65 20 72 6f 77 69 64 73 2e 20 20 57 65  tive rowids.  We
1e110 20 6a 75 73 74 20 63 61 6e 6e 6f 74 0a 2a 2a 20   just cannot.** 
1e120 63 61 63 68 65 20 7a 65 72 6f 20 6f 72 20 6e 65  cache zero or ne
1e130 67 61 74 69 76 65 20 72 6f 77 69 64 73 2c 20 77  gative rowids, w
1e140 68 69 63 68 20 6d 65 61 6e 73 20 74 61 62 6c 65  hich means table
1e150 73 20 74 68 61 74 20 75 73 65 20 7a 65 72 6f 20  s that use zero 
1e160 6f 72 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 72  or.** negative r
1e170 6f 77 69 64 73 20 6d 69 67 68 74 20 72 75 6e 20  owids might run 
1e180 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e  a little slower.
1e190 20 20 42 75 74 20 69 6e 20 70 72 61 63 74 69 63    But in practic
1e1a0 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 6e 65  e, zero.** or ne
1e1b0 67 61 74 69 76 65 20 72 6f 77 69 64 73 20 61 72  gative rowids ar
1e1c0 65 20 76 65 72 79 20 75 6e 63 6f 6d 6d 6f 6e 20  e very uncommon 
1e1d0 73 6f 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e  so this should n
1e1e0 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e  ot be a problem.
1e1f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1e200 42 74 72 65 65 53 65 74 43 61 63 68 65 64 52 6f  BtreeSetCachedRo
1e210 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  wid(BtCursor *pC
1e220 75 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ur, sqlite3_int6
1e230 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 42 74 43  4 iRowid){.  BtC
1e240 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28  ursor *p;.  for(
1e250 70 3d 70 43 75 72 2d 3e 70 42 74 2d 3e 70 43 75  p=pCur->pBt->pCu
1e260 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
1e270 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  ext){.    if( p-
1e280 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43 75 72 2d  >pgnoRoot==pCur-
1e290 3e 70 67 6e 6f 52 6f 6f 74 20 29 20 70 2d 3e 63  >pgnoRoot ) p->c
1e2a0 61 63 68 65 64 52 6f 77 69 64 20 3d 20 69 52 6f  achedRowid = iRo
1e2b0 77 69 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  wid;.  }.  asser
1e2c0 74 28 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52  t( pCur->cachedR
1e2d0 6f 77 69 64 3d 3d 69 52 6f 77 69 64 20 29 3b 0a  owid==iRowid );.
1e2e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1e2f0 74 68 65 20 63 61 63 68 65 64 20 72 6f 77 69 64  the cached rowid
1e300 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63   for the given c
1e310 75 72 73 6f 72 2e 20 20 41 20 6e 65 67 61 74 69  ursor.  A negati
1e320 76 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20 72 65  ve or zero.** re
1e330 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63  turn value indic
1e340 61 74 65 73 20 74 68 61 74 20 74 68 65 20 72 6f  ates that the ro
1e350 77 69 64 20 63 61 63 68 65 20 69 73 20 69 6e 76  wid cache is inv
1e360 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20  alid and should 
1e370 62 65 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20  be.** ignored.  
1e380 49 66 20 74 68 65 20 72 6f 77 69 64 20 63 61 63  If the rowid cac
1e390 68 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 66  he has never bef
1e3a0 6f 72 65 20 62 65 65 6e 20 73 65 74 2c 20 74 68  ore been set, th
1e3b0 65 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20 69 73 20  en a.** zero is 
1e3c0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 71 6c  returned..*/.sql
1e3d0 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74  ite3_int64 sqlit
1e3e0 65 33 42 74 72 65 65 47 65 74 43 61 63 68 65 64  e3BtreeGetCached
1e3f0 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Rowid(BtCursor *
1e400 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  pCur){.  return 
1e410 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69  pCur->cachedRowi
1e420 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  d;.}../*.** Clos
1e430 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  e a cursor.  The
1e440 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
1e450 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1e460 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77  is released.** w
1e470 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72  hen the last cur
1e480 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
1e490 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1e4a0 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74  eeCloseCursor(Bt
1e4b0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1e4c0 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d   Btree *pBtree =
1e4d0 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
1e4e0 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
1e4f0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
1e500 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
1e510 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c  ur->pBt;.    sql
1e520 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1e530 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69  Btree);.    sqli
1e540 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
1e550 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20 69  sor(pCur);.    i
1e560 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29  f( pCur->pPrev )
1e570 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50  {.      pCur->pP
1e580 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75  rev->pNext = pCu
1e590 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  r->pNext;.    }e
1e5a0 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  lse{.      pBt->
1e5b0 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e  pCursor = pCur->
1e5c0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
1e5d0 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74   if( pCur->pNext
1e5e0 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
1e5f0 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
1e600 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  Cur->pPrev;.    
1e610 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
1e620 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  <=pCur->iPage; i
1e630 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
1e640 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
1e650 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  age[i]);.    }. 
1e660 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
1e670 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
1e680 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
1e690 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a  lowCache(pCur);.
1e6a0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66      /* sqlite3_f
1e6b0 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20  ree(pCur); */.  
1e6c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1e6d0 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
1e6e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1e6f0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  _OK;.}../*.** Ma
1e700 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43 75  ke sure the BtCu
1e710 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74  rsor* given in t
1e720 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20  he argument has 
1e730 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72  a valid.** BtCur
1e740 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75  sor.info structu
1e750 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  re.  If it is no
1e760 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c  t already valid,
1e770 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61   call.** btreePa
1e780 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c  rseCell() to fil
1e790 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42  l it in..**.** B
1e7a0 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20  tCursor.info is 
1e7b0 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 69  a cache of the i
1e7c0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
1e7d0 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a  e current cell..
1e7e0 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63 61  ** Using this ca
1e7f0 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65 20  che reduces the 
1e800 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
1e810 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  to btreeParseCel
1e820 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d  l()..**.** 2007-
1e830 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20 69 73  06-25:  There is
1e840 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65 20 76   a bug in some v
1e850 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20  ersions of MSVC 
1e860 74 68 61 74 20 63 61 75 73 65 20 74 68 65 0a 2a  that cause the.*
1e870 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72  * compiler to cr
1e880 61 73 68 20 77 68 65 6e 20 67 65 74 43 65 6c 6c  ash when getCell
1e890 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d  Info() is implem
1e8a0 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63 72 6f  ented as a macro
1e8b0 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20 69  ..** But there i
1e8c0 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20  s a measureable 
1e8d0 73 70 65 65 64 20 61 64 76 61 6e 74 61 67 65 20  speed advantage 
1e8e0 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d 61 63  to using the mac
1e8f0 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68  ro on gcc.** (wh
1e900 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72  en less compiler
1e910 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c   optimizations l
1e920 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61  ike -Os or -O0 a
1e930 72 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a  re used and the.
1e940 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e  ** compiler is n
1e950 6f 74 20 64 6f 69 6e 67 20 61 67 72 65 73 73 69  ot doing agressi
1e960 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53  ve inlining.)  S
1e970 6f 20 77 65 20 75 73 65 20 61 20 72 65 61 6c 20  o we use a real 
1e980 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  function.** for 
1e990 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72 6f  MSVC and a macro
1e9a0 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20   for everything 
1e9b0 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23 32  else.  Ticket #2
1e9c0 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  457..*/.#ifndef 
1e9d0 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20  NDEBUG.  static 
1e9e0 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49  void assertCellI
1e9f0 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
1ea00 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66  ur){.    CellInf
1ea10 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20  o info;.    int 
1ea20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
1ea30 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  age;.    memset(
1ea40 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  &info, 0, sizeof
1ea50 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72  (info));.    btr
1ea60 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
1ea70 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c  ->apPage[iPage],
1ea80 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61   pCur->aiIdx[iPa
1ea90 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ge], &info);.   
1eaa0 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d 70 28   assert( memcmp(
1eab0 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e  &info, &pCur->in
1eac0 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29  fo, sizeof(info)
1ead0 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73  )==0 );.  }.#els
1eae0 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73 65  e.  #define asse
1eaf0 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65  rtCellInfo(x).#e
1eb00 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d 53 43  ndif.#ifdef _MSC
1eb10 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20 61 20  _VER.  /* Use a 
1eb20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69 6e  real function in
1eb30 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20 61 72   MSVC to work ar
1eb40 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74 68 61  ound bugs in tha
1eb50 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20  t compiler. */. 
1eb60 20 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 74   static void get
1eb70 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
1eb80 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 69 66  r *pCur){.    if
1eb90 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
1eba0 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ze==0 ){.      i
1ebb0 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
1ebc0 3e 69 50 61 67 65 3b 0a 20 20 20 20 20 20 62 74  >iPage;.      bt
1ebd0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
1ebe0 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
1ebf0 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61  ,pCur->aiIdx[iPa
1ec00 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29  ge],&pCur->info)
1ec10 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61  ;.      pCur->va
1ec20 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20  lidNKey = 1;.   
1ec30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
1ec40 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75  sertCellInfo(pCu
1ec50 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  r);.    }.  }.#e
1ec60 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d  lse /* if not _M
1ec70 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55  SC_VER */.  /* U
1ec80 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c  se a macro in al
1ec90 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65 72  l other compiler
1eca0 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 75  s so that the fu
1ecb0 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65  nction is inline
1ecc0 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74  d */.#define get
1ecd0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20 20  CellInfo(pCur)  
1ece0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecf0 20 20 20 20 20 20 20 20 20 20 20 20 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 5c 0a 20 20 69 66 28 20 70 43 75 72      \.  if( pCur
1ed20 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
1ed30 29 7b 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 5c 0a 20 20 20 20 69 6e 74 20 69       \.    int i
1ed70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
1ed80 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
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 5c 0a 20 20 20 20 62 74 72 65        \.    btre
1edc0 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
1edd0 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70  >apPage[iPage],p
1ede0 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
1edf0 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20  ],&pCur->info); 
1ee00 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  \.    pCur->vali
1ee10 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20 20 20  dNKey = 1;      
1ee20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee50 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20   \.  }else{     
1ee60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eea0 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43 65    \.    assertCe
1eeb0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20 20 20  llInfo(pCur);   
1eec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eef0 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20     \.  }.#endif 
1ef00 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a  /* _MSC_VER */..
1ef10 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20  #ifndef NDEBUG  
1ef20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74  /* The next rout
1ef30 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69  ine used only wi
1ef40 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  thin assert() st
1ef50 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a  atements */./*.*
1ef60 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1ef70 20 74 68 65 20 67 69 76 65 6e 20 42 74 43 75 72   the given BtCur
1ef80 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41  sor is valid.  A
1ef90 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73   valid cursor is
1efa0 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20   one.** that is 
1efb0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
1efc0 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61  ng to a row in a
1efd0 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62   (non-empty) tab
1efe0 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  le..** This is a
1eff0 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f   verification ro
1f000 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e  utine is used on
1f010 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ly within assert
1f020 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  () statements..*
1f030 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1f040 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
1f050 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1f060 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 20 26  .  return pCur &
1f070 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  & pCur->eState==
1f080 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a  CURSOR_VALID;.}.
1f090 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47  #endif /* NDEBUG
1f0a0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a   */../*.** Set *
1f0b0 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a  pSize to the siz
1f0c0 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  e of the buffer 
1f0d0 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74  needed to hold t
1f0e0 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74  he value of.** t
1f0f0 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63  he key for the c
1f100 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49  urrent entry.  I
1f110 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
1f120 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20  not pointing.** 
1f130 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  to a valid entry
1f140 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20  , *pSize is set 
1f150 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72  to 0. .**.** For
1f160 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68   a table with th
1f170 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65  e INTKEY flag se
1f180 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  t, this routine 
1f190 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a  returns the key.
1f1a0 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74  ** itself, not t
1f1b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1f1c0 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a  es in the key..*
1f1d0 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
1f1e0 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e 20 74 68  must position th
1f1f0 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72 20 74  e cursor prior t
1f200 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20  o invoking this 
1f210 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20  routine..** .** 
1f220 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
1f230 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74 20 61 6c  not fail.  It al
1f240 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c  ways returns SQL
1f250 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74  ITE_OK.  .*/.int
1f260 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
1f270 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
1f280 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29  Cur, i64 *pSize)
1f290 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
1f2a0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1f2b0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1f2c0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1f2d0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20  RSOR_INVALID || 
1f2e0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1f2f0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1f300 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1f310 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
1f320 7b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30  {.    *pSize = 0
1f330 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67  ;.  }else{.    g
1f340 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
1f350 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70  ;.    *pSize = p
1f360 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
1f370 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1f380 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1f390 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74   Set *pSize to t
1f3a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1f3b0 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68  es of data in th
1f3c0 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63  e entry the.** c
1f3d0 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20  ursor currently 
1f3e0 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a  points to..**.**
1f3f0 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
1f400 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
1f410 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f  the cursor is po
1f420 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d  inting to a non-
1f430 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e  NULL.** valid en
1f440 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  try.  In other w
1f450 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ords, the callin
1f460 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74  g procedure must
1f470 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68   guarantee.** th
1f480 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 61  at the cursor ha
1f490 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74 65 3d  s Cursor.eState=
1f4a0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a  =CURSOR_VALID..*
1f4b0 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20  *.** Failure is 
1f4c0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 54  not possible.  T
1f4d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
1f4e0 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ays returns SQLI
1f4f0 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67  TE_OK..** It mig
1f500 68 74 20 6a 75 73 74 20 61 73 20 77 65 6c 6c 20  ht just as well 
1f510 62 65 20 61 20 70 72 6f 63 65 64 75 72 65 20 28  be a procedure (
1f520 72 65 74 75 72 6e 69 6e 67 20 76 6f 69 64 29 20  returning void) 
1f530 62 75 74 20 77 65 20 63 6f 6e 74 69 6e 75 65 0a  but we continue.
1f540 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ** to return an 
1f550 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74 20 63  integer result c
1f560 6f 64 65 20 66 6f 72 20 68 69 73 74 6f 72 69 63  ode for historic
1f570 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69  al reasons..*/.i
1f580 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
1f590 61 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72  ataSize(BtCursor
1f5a0 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69   *pCur, u32 *pSi
1f5b0 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ze){.  assert( c
1f5c0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1f5d0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1f5e0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1f5f0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1f600 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
1f610 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d  Cur);.  *pSize =
1f620 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74   pCur->info.nDat
1f630 61 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  a;.  return SQLI
1f640 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1f650 47 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e  Given the page n
1f660 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72  umber of an over
1f670 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
1f680 20 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d   database (param
1f690 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74  eter.** ovfl), t
1f6a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e  his function fin
1f6b0 64 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ds the page numb
1f6c0 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70  er of the next p
1f6d0 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c  age in the .** l
1f6e0 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76  inked list of ov
1f6f0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66  erflow pages. If
1f700 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73   possible, it us
1f710 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  es the auto-vacu
1f720 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61  um.** pointer-ma
1f730 70 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f  p data instead o
1f740 66 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f  f reading the co
1f750 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76  ntent of page ov
1f760 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a  fl to do so. .**
1f770 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1f780 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65  occurs an SQLite
1f790 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1f7a0 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
1f7b0 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  se:.**.** The pa
1f7c0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
1f7d0 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70   next overflow p
1f7e0 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65  age in the linke
1f7f0 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72  d list is .** wr
1f800 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e  itten to *pPgnoN
1f810 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66  ext. If page ovf
1f820 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61  l is the last pa
1f830 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64  ge in its linked
1f840 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e   .** list, *pPgn
1f850 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20  oNext is set to 
1f860 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  zero. .**.** If 
1f870 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55  ppPage is not NU
1f880 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65  LL, and a refere
1f890 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61  nce to the MemPa
1f8a0 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73  ge object corres
1f8b0 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61  ponding.** to pa
1f8c0 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20  ge number pOvfl 
1f8d0 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68  was obtained, th
1f8e0 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  en *ppPage is se
1f8f0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
1f900 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e  at.** reference.
1f910 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
1f920 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
1f930 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20   caller to call 
1f940 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a  releasePage().**
1f950 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66   on *ppPage to f
1f960 72 65 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ree the referenc
1f970 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e  e. In no referen
1f980 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  ce was obtained 
1f990 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20  (because.** the 
1f9a0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20  pointer-map was 
1f9b0 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74  used to obtain t
1f9c0 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50  he value for *pP
1f9d0 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a  gnoNext), then.*
1f9e0 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  * *ppPage is set
1f9f0 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61   to zero..*/.sta
1fa00 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66  tic int getOverf
1fa10 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61  lowPage(.  BtSha
1fa20 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
1fa30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
1fa40 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1fa50 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20    Pgno ovfl,    
1fa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fa70 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c  * Current overfl
1fa80 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ow page number *
1fa90 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
1faa0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
1fab0 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65   /* OUT: MemPage
1fac0 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20   handle (may be 
1fad0 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20  NULL) */.  Pgno 
1fae0 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20  *pPgnoNext      
1faf0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1fb00 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  Next overflow pa
1fb10 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a  ge number */.){.
1fb20 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b    Pgno next = 0;
1fb30 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1fb40 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  e = 0;.  int rc 
1fb50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1fb60 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1fb70 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1fb80 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1fb90 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a  rt(pPgnoNext);..
1fba0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1fbb0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1fbc0 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20   /* Try to find 
1fbd0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
1fbe0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
1fbf0 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a  st using the.  *
1fc00 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69  * autovacuum poi
1fc10 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20  nter-map pages. 
1fc20 47 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e  Guess that the n
1fc30 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a  ext page in .  *
1fc40 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c  * the overflow l
1fc50 69 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62  ist is page numb
1fc60 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20  er (ovfl+1). If 
1fc70 74 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73  that guess turns
1fc80 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65   .  ** out to be
1fc90 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63   wrong, fall bac
1fca0 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65  k to loading the
1fcb0 20 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20   data of page . 
1fcc0 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20   ** number ovfl 
1fcd0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
1fce0 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65   next page numbe
1fcf0 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  r..  */.  if( pB
1fd00 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
1fd10 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  .    Pgno pgno;.
1fd20 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20      Pgno iGuess 
1fd30 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38  = ovfl+1;.    u8
1fd40 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69   eType;..    whi
1fd50 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
1fd60 45 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c  E(pBt, iGuess) |
1fd70 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e  | iGuess==PENDIN
1fd80 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1fd90 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73   ){.      iGuess
1fda0 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ++;.    }..    i
1fdb0 66 28 20 69 47 75 65 73 73 3c 3d 62 74 72 65 65  f( iGuess<=btree
1fdc0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
1fdd0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
1fde0 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65  mapGet(pBt, iGue
1fdf0 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e  ss, &eType, &pgn
1fe00 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
1fe10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
1fe20 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1fe30 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d  RFLOW2 && pgno==
1fe40 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ovfl ){.        
1fe50 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20  next = iGuess;. 
1fe60 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1fe70 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  TE_DONE;.      }
1fe80 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1fe90 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78  f..  assert( nex
1fea0 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  t==0 || rc==SQLI
1feb0 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28  TE_DONE );.  if(
1fec0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1fed0 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  {.    rc = btree
1fee0 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66  GetPage(pBt, ovf
1fef0 6c 2c 20 26 70 50 61 67 65 2c 20 28 70 70 50 61  l, &pPage, (ppPa
1ff00 67 65 3d 3d 30 29 20 3f 20 50 41 47 45 52 5f 47  ge==0) ? PAGER_G
1ff10 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29  ET_READONLY : 0)
1ff20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
1ff30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
1ff40 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Page==0 );.    i
1ff50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ff60 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d   ){.      next =
1ff70 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
1ff80 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  >aData);.    }. 
1ff90 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74   }..  *pPgnoNext
1ffa0 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70   = next;.  if( p
1ffb0 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70  pPage ){.    *pp
1ffc0 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20  Page = pPage;.  
1ffd0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61  }else{.    relea
1ffe0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
1fff0 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d   }.  return (rc=
20000 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53  =SQLITE_DONE ? S
20010 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a  QLITE_OK : rc);.
20020 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61  }../*.** Copy da
20030 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
20040 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66   to a page, or f
20050 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20  rom a page to a 
20060 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50  buffer..**.** pP
20070 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e  ayload is a poin
20080 74 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72  ter to data stor
20090 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70  ed on database p
200a0 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20  age pDbPage..** 
200b0 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20  If argument eOp 
200c0 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e  is false, then n
200d0 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61  Byte bytes of da
200e0 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a  ta are copied.**
200f0 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74   from pPayload t
20100 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  o the buffer poi
20110 6e 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e  nted at by pBuf.
20120 20 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c   If eOp is true,
20130 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33  .** then sqlite3
20140 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20  PagerWrite() is 
20150 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67  called on pDbPag
20160 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65  e and nByte byte
20170 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65  s.** of data are
20180 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65   copied from the
20190 20 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20   buffer pBuf to 
201a0 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20  pPayload..**.** 
201b0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
201c0 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
201d0 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65  , otherwise an e
201e0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
201f0 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79  atic int copyPay
20200 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50  load(.  void *pP
20210 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20  ayload,         
20220 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
20230 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76  page data */.  v
20240 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
20250 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
20260 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f  ter to buffer */
20270 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20  .  int nByte,   
20280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20290 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
202a0 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74  to copy */.  int
202b0 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20   eOp,           
202c0 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63         /* 0 -> c
202d0 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31  opy from page, 1
202e0 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65   -> copy to page
202f0 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44   */.  DbPage *pD
20300 62 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20  bPage           
20310 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
20320 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29  ng pPayload */.)
20330 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20  {.  if( eOp ){. 
20340 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
20350 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70  from buffer to p
20360 61 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65  age (a write ope
20370 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69  ration) */.    i
20380 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
20390 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
203a0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
203b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
203c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
203d0 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
203e0 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e  Payload, pBuf, n
203f0 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Byte);.  }else{.
20400 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
20410 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75   from page to bu
20420 66 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65  ffer (a read ope
20430 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d  ration) */.    m
20440 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79  emcpy(pBuf, pPay
20450 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20  load, nByte);.  
20460 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
20470 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
20480 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
20490 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20  used to read or 
204a0 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61  overwrite payloa
204b0 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  d information.**
204c0 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   for the entry t
204d0 68 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72  hat the pCur cur
204e0 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
204f0 74 6f 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a  to. If the eOp.*
20500 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  * parameter is 0
20510 2c 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  , this is a read
20520 20 6f 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61   operation (data
20530 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20   copied into.** 
20540 62 75 66 66 65 72 20 70 42 75 66 29 2e 20 49 66  buffer pBuf). If
20550 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c   it is non-zero,
20560 20 61 20 77 72 69 74 65 20 28 64 61 74 61 20 63   a write (data c
20570 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75  opied from.** bu
20580 66 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a  ffer pBuf)..**.*
20590 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d  * A total of "am
205a0 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61  t" bytes are rea
205b0 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67  d or written beg
205c0 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65  inning at "offse
205d0 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72  t"..** Data is r
205e0 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ead to or from t
205f0 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  he buffer pBuf..
20600 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e  **.** The conten
20610 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20  t being read or 
20620 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70  written might ap
20630 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e  pear on the main
20640 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73   page.** or be s
20650 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20  cattered out on 
20660 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f  multiple overflo
20670 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  w pages..**.** I
20680 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69  f the BtCursor.i
20690 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
206a0 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64  flag is set, and
206b0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
206c0 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65  cursor entry use
206d0 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  s one or more ov
206e0 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68  erflow pages, th
206f0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  is function.** a
20700 6c 6c 6f 63 61 74 65 73 20 73 70 61 63 65 20 66  llocates space f
20710 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f  or and lazily po
20720 70 6c 75 61 74 65 73 20 74 68 65 20 6f 76 65 72  pluates the over
20730 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a  flow page-list .
20740 2a 2a 20 63 61 63 68 65 20 61 72 72 61 79 20 28  ** cache array (
20750 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
20760 6f 77 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20  ow). Subsequent 
20770 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a  calls use this.*
20780 2a 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20  * cache to make 
20790 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73  seeking to the s
207a0 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d  upplied offset m
207b0 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a  ore efficient..*
207c0 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65  *.** Once an ove
207d0 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
207e0 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
207f0 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79  llocated, it may
20800 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
20810 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ed if some other
20820 20 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74   cursor writes t
20830 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  o the same table
20840 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63  , or if.** the c
20850 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74  ursor is moved t
20860 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f  o a different ro
20870 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  w. Additionally,
20880 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a   in auto-vacuum.
20890 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c  ** mode, the fol
208a0 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61  lowing events ma
208b0 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20  y invalidate an 
208c0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
208d0 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  st cache..**.** 
208e0 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74    * An increment
208f0 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20  al vacuum,.**   
20900 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75  * A commit in au
20910 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22  to_vacuum="full"
20920 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72   mode,.**   * Cr
20930 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28  eating a table (
20940 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69  may require movi
20950 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ng an overflow p
20960 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  age)..*/.static 
20970 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61  int accessPayloa
20980 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
20990 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
209a0 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
209b0 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
209c0 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73  om */.  u32 offs
209d0 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et,          /* 
209e0 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68  Begin reading th
209f0 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c  is far into payl
20a00 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74  oad */.  u32 amt
20a10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
20a20 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20   Read this many 
20a30 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67  bytes */.  unsig
20a40 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20  ned char *pBuf, 
20a50 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74  /* Write the byt
20a60 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  es into this buf
20a70 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f  fer */ .  int eO
20a80 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p              /
20a90 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20  * zero to read. 
20aa0 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74  non-zero to writ
20ab0 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  e. */.){.  unsig
20ac0 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f  ned char *aPaylo
20ad0 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ad;.  int rc = S
20ae0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20  QLITE_OK;.  u32 
20af0 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49 64 78  nKey;.  int iIdx
20b00 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
20b10 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
20b20 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
20b30 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67  e]; /* Btree pag
20b40 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74  e of current ent
20b50 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ry */.  BtShared
20b60 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
20b70 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
20b80 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69      /* Btree thi
20b90 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73  s cursor belongs
20ba0 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74   to */..  assert
20bb0 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  ( pPage );.  ass
20bc0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
20bd0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
20be0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
20bf0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
20c00 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65  Page]<pPage->nCe
20c10 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
20c20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
20c30 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74  (pCur) );..  get
20c40 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
20c50 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75    aPayload = pCu
20c60 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20  r->info.pCell + 
20c70 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64  pCur->info.nHead
20c80 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50  er;.  nKey = (pP
20c90 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20  age->intKey ? 0 
20ca0 3a 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66  : (int)pCur->inf
20cb0 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20  o.nKey);..  if( 
20cc0 4e 45 56 45 52 28 6f 66 66 73 65 74 2b 61 6d 74  NEVER(offset+amt
20cd0 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e   > nKey+pCur->in
20ce0 66 6f 2e 6e 44 61 74 61 29 20 0a 20 20 20 7c 7c  fo.nData) .   ||
20cf0 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d   &aPayload[pCur-
20d00 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20  >info.nLocal] > 
20d10 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
20d20 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20  t->usableSize]. 
20d30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e   ){.    /* Tryin
20d40 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  g to read or wri
20d50 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
20d60 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61  of the data is a
20d70 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72  n error */.    r
20d80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
20d90 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
20da0 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61    /* Check if da
20db0 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f  ta must be read/
20dc0 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20  written to/from 
20dd0 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69  the btree page i
20de0 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20  tself. */.  if( 
20df0 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66  offset<pCur->inf
20e00 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
20e10 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
20e20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43   if( a+offset>pC
20e30 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
20e40 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75  ){.      a = pCu
20e50 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
20e60 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20   offset;.    }. 
20e70 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
20e80 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
20e90 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20  fset], pBuf, a, 
20ea0 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50  eOp, pPage->pDbP
20eb0 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74  age);.    offset
20ec0 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b   = 0;.    pBuf +
20ed0 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  = a;.    amt -= 
20ee0 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
20ef0 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e  offset -= pCur->
20f00 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  info.nLocal;.  }
20f10 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
20f20 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
20f30 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20  {.    const u32 
20f40 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ovflSize = pBt->
20f50 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20  usableSize - 4; 
20f60 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e   /* Bytes conten
20f70 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20  t per ovfl page 
20f80 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  */.    Pgno next
20f90 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50  Page;..    nextP
20fa0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
20fb0 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
20fc0 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23  nfo.nLocal]);..#
20fd0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
20fe0 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
20ff0 2f 2a 20 49 66 20 74 68 65 20 69 73 49 6e 63 72  /* If the isIncr
21000 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20  blobHandle flag 
21010 69 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 42  is set and the B
21020 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
21030 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e  w[].    ** has n
21040 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ot been allocate
21050 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e  d, allocate it n
21060 6f 77 2e 20 54 68 65 20 61 72 72 61 79 20 69 73  ow. The array is
21070 20 73 69 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a   sized at.    **
21080 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65   one entry for e
21090 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ach overflow pag
210a0 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
210b0 77 20 63 68 61 69 6e 2e 20 54 68 65 0a 20 20 20  w chain. The.   
210c0 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20   ** page number 
210d0 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  of the first ove
210e0 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 73 74  rflow page is st
210f0 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f  ored in aOverflo
21100 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63  w[0],.    ** etc
21110 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69  . A value of 0 i
21120 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b  n the aOverflow[
21130 5d 20 61 72 72 61 79 20 6d 65 61 6e 73 20 22 6e  ] array means "n
21140 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20  ot yet known".  
21150 20 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65 20    ** (the cache 
21160 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61  is lazily popula
21170 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ted)..    */.   
21180 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63   if( pCur->isInc
21190 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 21  rblobHandle && !
211a0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
211b0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76  ){.      int nOv
211c0 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f  fl = (pCur->info
211d0 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e  .nPayload-pCur->
211e0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c  info.nLocal+ovfl
211f0 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65  Size-1)/ovflSize
21200 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f  ;.      pCur->aO
21210 76 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20  verflow = (Pgno 
21220 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
21230 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29  ero(sizeof(Pgno)
21240 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 2f  *nOvfl);.      /
21250 2a 20 6e 4f 76 66 6c 20 69 73 20 61 6c 77 61 79  * nOvfl is alway
21260 73 20 70 6f 73 69 74 69 76 65 2e 20 20 49 66 20  s positive.  If 
21270 69 74 20 77 65 72 65 20 7a 65 72 6f 2c 20 66 65  it were zero, fe
21280 74 63 68 50 61 79 6c 6f 61 64 20 77 6f 75 6c 64  tchPayload would
21290 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 62   have.      ** b
212a0 65 65 6e 20 75 73 65 64 20 69 6e 73 74 65 61 64  een used instead
212b0 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
212c0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41  . */.      if( A
212d0 4c 57 41 59 53 28 6e 4f 76 66 6c 29 20 26 26 20  LWAYS(nOvfl) && 
212e0 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  !pCur->aOverflow
212f0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
21300 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
21310 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
21320 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72    /* If the over
21330 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
21340 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
21350 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a  located and the.
21360 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72      ** entry for
21370 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69   the first requi
21380 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  red overflow pag
21390 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70  e is valid, skip
213a0 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79  .    ** directly
213b0 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20   to it..    */. 
213c0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
213d0 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e  erflow && pCur->
213e0 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74  aOverflow[offset
213f0 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20  /ovflSize] ){.  
21400 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73      iIdx = (offs
21410 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20  et/ovflSize);.  
21420 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70      nextPage = p
21430 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
21440 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73  Idx];.      offs
21450 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66  et = (offset%ovf
21460 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65  lSize);.    }.#e
21470 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72 28 20 3b  ndif..    for( ;
21480 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
21490 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50  & amt>0 && nextP
214a0 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 23  age; iIdx++){..#
214b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
214c0 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
214d0 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64    /* If required
214e0 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  , populate the o
214f0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
21500 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  t cache. */.    
21510 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
21520 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
21530 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61   assert(!pCur->a
21540 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c  Overflow[iIdx] |
21550 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  | pCur->aOverflo
21560 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67  w[iIdx]==nextPag
21570 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72  e);.        pCur
21580 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
21590 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20  ] = nextPage;.  
215a0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
215b0 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d      if( offset>=
215c0 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
215d0 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20      /* The only 
215e0 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74  reason to read t
215f0 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f  his page is to o
21600 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20  btain the page. 
21610 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
21620 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61   for the next pa
21630 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
21640 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61  ow chain. The pa
21650 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  ge.        ** da
21660 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  ta is not requir
21670 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79  ed. So first try
21680 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f   to lookup the o
21690 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20  verflow.        
216a0 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ** page-list cac
216b0 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e  he, if any, then
216c0 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68   fall back to th
216d0 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  e getOverflowPag
216e0 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  e().        ** f
216f0 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  unction..       
21700 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
21710 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
21720 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75  .        if( pCu
21730 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20  r->aOverflow && 
21740 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
21750 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20  iIdx+1] ){.     
21760 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
21770 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
21780 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20  iIdx+1];.       
21790 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a   } else .#endif.
217a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67            rc = g
217b0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
217c0 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c  Bt, nextPage, 0,
217d0 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20   &nextPage);.   
217e0 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f       offset -= o
217f0 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d  vflSize;.      }
21800 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
21810 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68   Need to read th
21820 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79  is page properly
21830 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f  . It contains so
21840 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  me of the.      
21850 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61    ** range of da
21860 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  ta that is being
21870 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f   read (eOp==0) o
21880 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d  r written (eOp!=
21890 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23  0)..        */.#
218a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
218b0 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
218c0 44 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  D.        sqlite
218d0 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 23 65 6e 64  3_file *fd;.#end
218e0 69 66 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  if.        int a
218f0 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20   = amt;.        
21900 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e  if( a + offset >
21910 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20   ovflSize ){.   
21920 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53         a = ovflS
21930 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  ize - offset;.  
21940 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20        }..#ifdef 
21950 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56  SQLITE_DIRECT_OV
21960 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20  ERFLOW_READ.    
21970 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68      /* If all th
21980 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
21990 74 72 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a  true:.        **
219a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29  .        **   1)
219b0 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20   this is a read 
219c0 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a  operation, and .
219d0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20          **   2) 
219e0 64 61 74 61 20 69 73 20 72 65 71 75 69 72 65 64  data is required
219f0 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20   from the start 
21a00 6f 66 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77  of this overflow
21a10 20 70 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20   page, and.     
21a20 20 20 20 2a 2a 20 20 20 33 29 20 74 68 65 20 64     **   3) the d
21a30 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d  atabase is file-
21a40 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20  backed, and.    
21a50 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65 72      **   4) ther
21a60 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69  e is no open wri
21a70 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
21a80 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  and.        **  
21a90 20 35 29 20 74 68 65 20 64 61 74 61 62 61 73 65   5) the database
21aa0 20 69 73 20 6e 6f 74 20 61 20 57 41 4c 20 64 61   is not a WAL da
21ab0 74 61 62 61 73 65 2c 0a 20 20 20 20 20 20 20 20  tabase,.        
21ac0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  **.        ** th
21ad0 65 6e 20 64 61 74 61 20 63 61 6e 20 62 65 20 72  en data can be r
21ae0 65 61 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f  ead directly fro
21af0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
21b00 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ile into the.   
21b10 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 62       ** output b
21b20 75 66 66 65 72 2c 20 62 79 70 61 73 73 69 6e 67  uffer, bypassing
21b30 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
21b40 61 6c 74 6f 67 65 74 68 65 72 2e 20 54 68 69 73  altogether. This
21b50 20 73 70 65 65 64 73 0a 20 20 20 20 20 20 20 20   speeds.        
21b60 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61  ** up loading la
21b70 72 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74  rge records that
21b80 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66   span many overf
21b90 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 20 20 20  low pages..     
21ba0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
21bb0 28 20 65 4f 70 3d 3d 30 20 20 20 20 20 20 20 20  ( eOp==0        
21bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21be0 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20       /* (1) */. 
21bf0 20 20 20 20 20 20 20 20 26 26 20 6f 66 66 73 65          && offse
21c00 74 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20  t==0            
21c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21c30 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (2) */.        
21c40 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
21c50 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45  action==TRANS_RE
21c60 41 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20  AD              
21c70 20 20 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f         /* (4) */
21c80 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 66 64  .         && (fd
21c90 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46   = sqlite3PagerF
21ca0 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ile(pBt->pPager)
21cb0 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20 20 20  )->pMethods     
21cc0 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20 20  /* (3) */.      
21cd0 20 20 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65     && pBt->pPage
21ce0 31 2d 3e 61 44 61 74 61 5b 31 39 5d 3d 3d 30 78  1->aData[19]==0x
21cf0 30 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20  01              
21d00 20 20 20 20 20 20 20 20 20 2f 2a 20 28 35 29 20           /* (5) 
21d10 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  */.        ){.  
21d20 20 20 20 20 20 20 20 20 75 38 20 61 53 61 76 65          u8 aSave
21d30 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75  [4];.          u
21d40 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75  8 *aWrite = &pBu
21d50 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20  f[-4];.         
21d60 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61   memcpy(aSave, a
21d70 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20  Write, 4);.     
21d80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
21d90 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72 69  3OsRead(fd, aWri
21da0 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42  te, a+4, (i64)pB
21db0 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78  t->pageSize*(nex
21dc0 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20  tPage-1));.     
21dd0 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
21de0 67 65 74 34 62 79 74 65 28 61 57 72 69 74 65 29  get4byte(aWrite)
21df0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
21e00 70 79 28 61 57 72 69 74 65 2c 20 61 53 61 76 65  py(aWrite, aSave
21e10 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 4);.        }e
21e20 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  lse.#endif..    
21e30 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
21e40 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
21e50 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
21e60 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
21e70 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ire(pBt->pPager,
21e80 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50   nextPage, &pDbP
21e90 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  age,.           
21ea0 20 20 20 28 65 4f 70 3d 3d 30 20 3f 20 50 41 47     (eOp==0 ? PAG
21eb0 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
21ec0 3a 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 29  : 0).          )
21ed0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
21ee0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 50 61  .            aPa
21f00 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50  yload = sqlite3P
21f10 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
21f20 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
21f30 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
21f40 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b  4byte(aPayload);
21f50 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
21f60 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
21f70 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34  Payload[offset+4
21f80 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
21f90 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20   pDbPage);.     
21fa0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
21fb0 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
21fc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  );.            o
21fd0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
21fe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
21ff0 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20  .        amt -= 
22000 61 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66 20  a;.        pBuf 
22010 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += a;.      }.  
22020 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
22030 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
22040 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  amt>0 ){.    ret
22050 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
22060 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
22070 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
22080 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20  ** Read part of 
22090 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74  the key associat
220a0 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70  ed with cursor p
220b0 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a  Cur.  Exactly.**
220c0 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c   "amt" bytes wil
220d0 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20  l be transfered 
220e0 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68  into pBuf[].  Th
220f0 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65  e transfer.** be
22100 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22  gins at "offset"
22110 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
22120 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74  er must ensure t
22130 68 61 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e  hat pCur is poin
22140 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20  ting to a valid 
22150 72 6f 77 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61  row.** in the ta
22160 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ble..**.** Retur
22170 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
22180 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
22190 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
221a0 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
221b0 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
221c0 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
221d0 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
221e0 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
221f0 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
22200 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22210 42 74 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f  BtreeKey(BtCurso
22220 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
22230 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
22240 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73  id *pBuf){.  ass
22250 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
22260 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
22270 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
22280 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
22290 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
222a0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
222b0 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
222c0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
222d0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
222e0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
222f0 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
22300 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
22310 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ell );.  return 
22320 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
22330 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
22340 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
22350 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  )pBuf, 0);.}../*
22360 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
22370 20 74 68 65 20 64 61 74 61 20 61 73 73 6f 63 69   the data associ
22380 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
22390 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a   pCur.  Exactly.
223a0 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77  ** "amt" bytes w
223b0 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65  ill be transfere
223c0 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
223d0 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
223e0 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
223f0 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  t"..**.** Return
22400 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
22410 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
22420 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
22430 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
22440 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72  .  An error is r
22450 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73  eturned if "offs
22460 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65  et+amt" is large
22470 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76  r than.** the av
22480 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e  ailable payload.
22490 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
224a0 74 72 65 65 44 61 74 61 28 42 74 43 75 72 73 6f  treeData(BtCurso
224b0 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
224c0 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
224d0 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74  id *pBuf){.  int
224e0 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51   rc;..#ifndef SQ
224f0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
22500 4f 42 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e  OB.  if ( pCur->
22510 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
22520 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65  NVALID ){.    re
22530 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52  turn SQLITE_ABOR
22540 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  T;.  }.#endif.. 
22550 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
22560 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
22570 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
22580 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
22590 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
225a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
225b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
225c0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
225d0 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65  ALID );.    asse
225e0 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
225f0 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
22600 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
22610 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
22620 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
22630 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
22640 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
22650 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
22660 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
22670 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
22680 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a   amt, pBuf, 0);.
22690 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
226a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
226b0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
226c0 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
226d0 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79  n from the entry
226e0 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43   that the .** pC
226f0 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ur cursor is poi
22700 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70  nting to.  The p
22710 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65  ointer is to the
22720 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a   beginning of.**
22730 20 74 68 65 20 6b 65 79 20 69 66 20 73 6b 69 70   the key if skip
22740 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f  Key==0 and it po
22750 69 6e 74 73 20 74 6f 20 74 68 65 20 62 65 67 69  ints to the begi
22760 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 69 66  nning of data if
22770 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20  .** skipKey==1. 
22780 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   The number of b
22790 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c  ytes of availabl
227a0 65 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72  e key/data is wr
227b0 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70  itten.** into *p
227c0 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d  Amt.  If *pAmt==
227d0 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  0, then the valu
227e0 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20  e returned will 
227f0 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69  not be.** a vali
22800 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  d pointer..**.**
22810 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
22820 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
22830 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20  .  It is common 
22840 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b  for the entire k
22850 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74  ey.** and data t
22860 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63  o fit on the loc
22870 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20  al page and for 
22880 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f  there to be no o
22890 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73  verflow.** pages
228a0 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20  .  When that is 
228b0 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  so, this routine
228c0 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
228d0 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65  access the.** ke
228e0 79 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f  y and data witho
228f0 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79  ut making a copy
22900 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e  .  If the key an
22910 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73  d/or data spills
22920 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f  .** onto overflo
22930 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63  w pages, then ac
22940 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75  cessPayload() mu
22950 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  st be used to re
22960 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20  assemble.** the 
22970 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70  key/data and cop
22980 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61  y it into a prea
22990 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e  llocated buffer.
229a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
229b0 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
229c0 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b  his routine look
229d0 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20  s directly into 
229e0 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61  the cached.** pa
229f0 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
22a00 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69  se.  The data mi
22a10 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f  ght change or mo
22a20 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ve the next time
22a30 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f  .** any btree ro
22a40 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
22a50 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
22a60 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
22a70 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20  fetchPayload(.  
22a80 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
22a90 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
22aa0 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
22ab0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
22ac0 0a 20 20 75 33 32 20 2a 70 41 6d 74 2c 20 20 20  .  u32 *pAmt,   
22ad0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
22ae0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
22af0 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68  vailable bytes h
22b00 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69  ere */.  int ski
22b10 70 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a  pKey          /*
22b20 20 72 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20   read beginning 
22b30 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20  at data if this 
22b40 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  is true */.){.  
22b50 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
22b60 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61  Payload;.  MemPa
22b70 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 75 33 32  ge *pPage;.  u32
22b80 20 6e 4b 65 79 3b 0a 20 20 75 33 32 20 6e 4c 6f   nKey;.  u32 nLo
22b90 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  cal;..  assert( 
22ba0 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d  pCur!=0 && pCur-
22bb0 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75  >iPage>=0 && pCu
22bc0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
22bd0 69 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72  iPage]);.  asser
22be0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
22bf0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
22c00 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
22c10 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
22c20 29 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  ) );.  pPage = p
22c30 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
22c40 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65  ->iPage];.  asse
22c50 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
22c60 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
22c70 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69  ge->nCell );.  i
22c80 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
22c90 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 62 74  ize==0 ){.    bt
22ca0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
22cb0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
22cc0 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69  iPage], pCur->ai
22cd0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
22ce0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22cf0 20 20 20 20 20 26 70 43 75 72 2d 3e 69 6e 66 6f       &pCur->info
22d00 29 3b 0a 20 20 7d 0a 20 20 61 50 61 79 6c 6f 61  );.  }.  aPayloa
22d10 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
22d20 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cell;.  aPayload
22d30 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   += pCur->info.n
22d40 48 65 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50  Header;.  if( pP
22d50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
22d60 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d     nKey = 0;.  }
22d70 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d  else{.    nKey =
22d80 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f   (int)pCur->info
22d90 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28  .nKey;.  }.  if(
22da0 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20   skipKey ){.    
22db0 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79  aPayload += nKey
22dc0 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70  ;.    nLocal = p
22dd0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
22de0 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65   - nKey;.  }else
22df0 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70  {.    nLocal = p
22e00 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
22e10 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4c  ;.    assert( nL
22e20 6f 63 61 6c 3c 3d 6e 4b 65 79 20 29 3b 0a 20 20  ocal<=nKey );.  
22e30 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63  }.  *pAmt = nLoc
22e40 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 50 61  al;.  return aPa
22e50 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  yload;.}.../*.**
22e60 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   For the entry t
22e70 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20  hat cursor pCur 
22e80 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74  is point to, ret
22e90 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62  urn as.** many b
22ea0 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20  ytes of the key 
22eb0 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61  or data as are a
22ec0 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20  vailable on the 
22ed0 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20  local.** b-tree 
22ee0 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65  page.  Write the
22ef0 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
22f00 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20  able bytes into 
22f10 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  *pAmt..**.** The
22f20 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
22f30 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20  d is ephemeral. 
22f40 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61   The key/data ma
22f50 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20  y move.** or be 
22f60 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65  destroyed on the
22f70 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e   next call to an
22f80 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c  y Btree routine,
22f90 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61  .** including ca
22fa0 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74  lls from other t
22fb0 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 74  hreads against t
22fc0 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a  he same cache..*
22fd0 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78  * Hence, a mutex
22fe0 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64   on the BtShared
22ff0 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20   should be held 
23000 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
23010 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
23020 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
23030 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74  utines is used t
23040 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65  o get quick acce
23050 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61  ss to key and da
23060 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d  ta.** in the com
23070 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e  mon case where n
23080 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
23090 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f   are used..*/.co
230a0 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
230b0 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 42  3BtreeKeyFetch(B
230c0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
230d0 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 63 6f 6e  32 *pAmt){.  con
230e0 73 74 20 76 6f 69 64 20 2a 70 20 3d 20 30 3b 0a  st void *p = 0;.
230f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
23100 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
23110 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
23120 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
23130 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
23140 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69  tex(pCur) );.  i
23150 66 28 20 41 4c 57 41 59 53 28 70 43 75 72 2d 3e  f( ALWAYS(pCur->
23160 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
23170 41 4c 49 44 29 20 29 7b 0a 20 20 20 20 70 20 3d  ALID) ){.    p =
23180 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65   (const void*)fe
23190 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
231a0 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20   pAmt, 0);.  }. 
231b0 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 63 6f 6e   return p;.}.con
231c0 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
231d0 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28 42  BtreeDataFetch(B
231e0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
231f0 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 63 6f 6e  32 *pAmt){.  con
23200 73 74 20 76 6f 69 64 20 2a 70 20 3d 20 30 3b 0a  st void *p = 0;.
23210 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
23220 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
23230 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
23240 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
23250 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
23260 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69  tex(pCur) );.  i
23270 66 28 20 41 4c 57 41 59 53 28 70 43 75 72 2d 3e  f( ALWAYS(pCur->
23280 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
23290 41 4c 49 44 29 20 29 7b 0a 20 20 20 20 70 20 3d  ALID) ){.    p =
232a0 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65   (const void*)fe
232b0 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
232c0 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20   pAmt, 1);.  }. 
232d0 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f   return p;.}.../
232e0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
232f0 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e  rsor down to a n
23300 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20  ew child page.  
23310 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75  The newPgno argu
23320 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70  ment is the.** p
23330 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
23340 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20  e child page to 
23350 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54  move to..**.** T
23360 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
23370 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52  urns SQLITE_CORR
23380 55 50 54 20 69 66 20 74 68 65 20 70 61 67 65 2d  UPT if the page-
23390 68 65 61 64 65 72 20 66 6c 61 67 73 20 66 69 65  header flags fie
233a0 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ld of.** the new
233b0 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73   child page does
233c0 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66   not match the f
233d0 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68  lags field of th
233e0 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a  e parent (i.e..*
233f0 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70  * if an intkey p
23400 61 67 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  age appears to b
23410 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  e the parent of 
23420 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67  a non-intkey pag
23430 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65  e, or.** vice-ve
23440 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rsa)..*/.static 
23450 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  int moveToChild(
23460 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
23470 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20  u32 newPgno){.  
23480 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 20  int rc;.  int i 
23490 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
234a0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61   MemPage *pNewPa
234b0 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge;.  BtShared *
234c0 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
234d0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
234e0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
234f0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
23500 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
23510 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
23520 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
23530 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58  age<BTCURSOR_MAX
23540 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65  _DEPTH );.  asse
23550 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
23560 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  =0 );.  if( pCur
23570 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53  ->iPage>=(BTCURS
23580 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20  OR_MAX_DEPTH-1) 
23590 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
235a0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
235b0 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65  T;.  }.  rc = ge
235c0 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
235d0 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77  , newPgno, &pNew
235e0 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Page,.          
235f0 20 20 20 20 20 70 43 75 72 2d 3e 77 72 46 6c 61       pCur->wrFla
23600 67 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54  g==0 ? PAGER_GET
23610 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a  _READONLY : 0);.
23620 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
23630 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70  n rc;.  pCur->ap
23640 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77  Page[i+1] = pNew
23650 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69  Page;.  pCur->ai
23660 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20  Idx[i+1] = 0;.  
23670 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a  pCur->iPage++;..
23680 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
23690 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
236a0 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
236b0 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e   if( pNewPage->n
236c0 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e 65 77 50 61  Cell<1 || pNewPa
236d0 67 65 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72  ge->intKey!=pCur
236e0 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 69 6e 74  ->apPage[i]->int
236f0 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Key ){.    retur
23700 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
23710 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
23720 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
23730 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 50 61  ..#if 0./*.** Pa
23740 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e  ge pParent is an
23750 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c   internal (non-l
23760 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20  eaf) tree page. 
23770 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  This function .*
23780 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70  * asserts that p
23790 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c  age number iChil
237a0 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68  d is the left-ch
237b0 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27  ild if the iIdx'
237c0 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61  th.** cell in pa
237d0 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20  ge pParent. Or, 
237e0 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c  if iIdx is equal
237f0 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   to the total nu
23800 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73  mber of.** cells
23810 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61   in pParent, tha
23820 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43  t page number iC
23830 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68  hild is the righ
23840 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68  t-child of.** th
23850 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
23860 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72  c void assertPar
23870 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65  entIndex(MemPage
23880 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69   *pParent, int i
23890 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64  Idx, Pgno iChild
238a0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 49 64  ){.  assert( iId
238b0 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  x<=pParent->nCel
238c0 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d  l );.  if( iIdx=
238d0 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
238e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  ){.    assert( g
238f0 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
23900 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
23910 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d  >hdrOffset+8])==
23920 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73  iChild );.  }els
23930 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  e{.    assert( g
23940 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
23950 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29  (pParent, iIdx))
23960 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a  ==iChild );.  }.
23970 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  }.#else.#  defin
23980 65 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  e assertParentIn
23990 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64  dex(x,y,z) .#end
239a0 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  if../*.** Move t
239b0 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20  he cursor up to 
239c0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
239d0 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78  .**.** pCur->idx
239e0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63   is set to the c
239f0 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63  ell index that c
23a00 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e  ontains the poin
23a10 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61  ter.** to the pa
23a20 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67  ge we are coming
23a30 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72   from.  If we ar
23a40 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68  e coming from th
23a50 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20  e.** right-most 
23a60 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20  child page then 
23a70 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
23a80 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61   to one more tha
23a90 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74  n.** the largest
23aa0 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a   cell index..*/.
23ab0 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65  static void move
23ac0 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f  ToParent(BtCurso
23ad0 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
23ae0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
23af0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
23b00 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
23b10 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
23b20 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
23b30 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
23b40 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
23b50 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
23b60 61 67 65 5d 20 29 3b 0a 0a 20 20 2f 2a 20 55 50  age] );..  /* UP
23b70 44 41 54 45 3a 20 49 74 20 69 73 20 61 63 74 75  DATE: It is actu
23b80 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 66 6f  ally possible fo
23b90 72 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  r the condition 
23ba0 74 65 73 74 65 64 20 62 79 20 74 68 65 20 61 73  tested by the as
23bb0 73 65 72 74 0a 20 20 2a 2a 20 62 65 6c 6f 77 20  sert.  ** below 
23bc0 74 6f 20 62 65 20 75 6e 74 72 75 65 20 69 66 20  to be untrue if 
23bd0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
23be0 65 20 69 73 20 63 6f 72 72 75 70 74 2e 20 54 68  e is corrupt. Th
23bf0 69 73 20 63 61 6e 20 6f 63 63 75 72 20 69 66 0a  is can occur if.
23c00 20 20 2a 2a 20 6f 6e 65 20 63 75 72 73 6f 72 20    ** one cursor 
23c10 68 61 73 20 6d 6f 64 69 66 69 65 64 20 70 61 67  has modified pag
23c20 65 20 70 50 61 72 65 6e 74 20 77 68 69 6c 65 20  e pParent while 
23c30 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69  a reference to i
23c40 74 20 69 73 20 68 65 6c 64 20 0a 20 20 2a 2a 20  t is held .  ** 
23c50 62 79 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73  by a second curs
23c60 6f 72 2e 20 57 68 69 63 68 20 63 61 6e 20 6f 6e  or. Which can on
23c70 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61 20 73  ly happen if a s
23c80 69 6e 67 6c 65 20 70 61 67 65 20 69 73 20 6c 69  ingle page is li
23c90 6e 6b 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 6d  nked.  ** into m
23ca0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74  ore than one b-t
23cb0 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69 6e  ree structure in
23cc0 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
23cd0 61 73 65 2e 20 20 2a 2f 0a 23 69 66 20 30 0a 20  ase.  */.#if 0. 
23ce0 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
23cf0 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ex(.    pCur->ap
23d00 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
23d10 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
23d20 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
23d30 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d  e-1], .    pCur-
23d40 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
23d50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a  age]->pgno.  );.
23d60 23 65 6e 64 69 66 0a 20 20 74 65 73 74 63 61 73  #endif.  testcas
23d70 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
23d80 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20  Cur->iPage-1] > 
23d90 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
23da0 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65  r->iPage-1]->nCe
23db0 6c 6c 20 29 3b 0a 0a 20 20 72 65 6c 65 61 73 65  ll );..  release
23dc0 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
23dd0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b  e[pCur->iPage]);
23de0 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d  .  pCur->iPage--
23df0 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
23e00 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
23e10 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
23e20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
23e30 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69  he cursor to poi
23e40 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70  nt to the root p
23e50 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65  age of its b-tre
23e60 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  e structure..**.
23e70 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  ** If the table 
23e80 68 61 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f  has a virtual ro
23e90 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot page, then th
23ea0 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
23eb0 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f  d to point.** to
23ec0 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   the virtual roo
23ed0 74 20 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f  t page instead o
23ee0 66 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f  f the actual roo
23ef0 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20  t page. A table 
23f00 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c  has a.** virtual
23f10 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20   root page when 
23f20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20  the actual root 
23f30 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  page contains no
23f40 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a   cells and a .**
23f50 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61   single child pa
23f60 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  ge. This can onl
23f70 79 20 68 61 70 70 65 6e 20 77 69 74 68 20 74 68  y happen with th
23f80 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61  e table rooted a
23f90 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20  t page 1..**.** 
23fa0 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 73 74  If the b-tree st
23fb0 72 75 63 74 75 72 65 20 69 73 20 65 6d 70 74 79  ructure is empty
23fc0 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  , the cursor sta
23fd0 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a  te is set to .**
23fe0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e   CURSOR_INVALID.
23ff0 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
24000 63 75 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f  cursor is set to
24010 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69   point to the fi
24020 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61  rst.** cell loca
24030 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20  ted on the root 
24040 28 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  (or virtual root
24050 29 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 63  ) page and the c
24060 75 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69  ursor state.** i
24070 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
24080 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  VALID..**.** If 
24090 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
240a0 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c  turns successful
240b0 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73  ly, it may be as
240c0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a  sumed that the.*
240d0 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c  * page-header fl
240e0 61 67 73 20 69 6e 64 69 63 61 74 65 20 74 68 61  ags indicate tha
240f0 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20  t the [virtual] 
24100 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65  root-page is the
24110 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69   expected .** ki
24120 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67  nd of b-tree pag
24130 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20  e (i.e. if when 
24140 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73  opening the curs
24150 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69  or the caller di
24160 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79  d not.** specify
24170 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
24180 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62  ture the flags b
24190 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78  yte is set to 0x
241a0 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69  05 or 0x0D,.** i
241b0 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c  ndicating a tabl
241c0 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20  e b-tree, or if 
241d0 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73  the caller did s
241e0 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f  pecify a KeyInfo
241f0 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74   .** structure t
24200 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73  he flags byte is
24210 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20   set to 0x02 or 
24220 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67  0x0A, indicating
24230 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74   an index.** b-t
24240 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ree)..*/.static 
24250 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42  int moveToRoot(B
24260 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
24270 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
24280 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
24290 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
242a0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
242b0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
242c0 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e  ssert( CURSOR_IN
242d0 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52  VALID < CURSOR_R
242e0 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
242f0 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
24300 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f  ALID   < CURSOR_
24310 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
24320 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
24330 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52  FAULT   > CURSOR
24340 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
24350 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
24360 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
24370 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66  RESEEK ){.    if
24380 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
24390 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
243a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
243b0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51  ur->skipNext!=SQ
243c0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
243d0 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
243e0 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  ipNext;.    }.  
243f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
24400 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
24410 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72  .  }..  if( pCur
24420 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20  ->iPage>=0 ){.  
24430 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69    while( pCur->i
24440 50 61 67 65 20 29 20 72 65 6c 65 61 73 65 50 61  Page ) releasePa
24450 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
24460 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b  pCur->iPage--]);
24470 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 75  .  }else if( pCu
24480 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29  r->pgnoRoot==0 )
24490 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
244a0 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
244b0 4c 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  LID;.    return 
244c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
244d0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74  se{.    rc = get
244e0 41 6e 64 49 6e 69 74 50 61 67 65 28 70 43 75 72  AndInitPage(pCur
244f0 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c 20 70  ->pBtree->pBt, p
24500 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26  Cur->pgnoRoot, &
24510 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2c  pCur->apPage[0],
24520 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24530 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 77           pCur->w
24540 72 46 6c 61 67 3d 3d 30 20 3f 20 50 41 47 45 52  rFlag==0 ? PAGER
24550 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  _GET_READONLY : 
24560 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
24570 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24580 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
24590 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
245a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
245b0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  c;.    }.    pCu
245c0 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 0a 20  r->iPage = 0;.. 
245d0 20 20 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70     /* If pCur->p
245e0 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e  KeyInfo is not N
245f0 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61  ULL, then the ca
24600 6c 6c 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64  ller that opened
24610 20 74 68 69 73 20 63 75 72 73 6f 72 0a 20 20 20   this cursor.   
24620 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20   ** expected to 
24630 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e  open it on an in
24640 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68 65  dex b-tree. Othe
24650 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79 49 6e  rwise, if pKeyIn
24660 66 6f 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c  fo is.    ** NUL
24670 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78  L, the caller ex
24680 70 65 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d  pects a table b-
24690 74 72 65 65 2e 20 49 66 20 74 68 69 73 20 69 73  tree. If this is
246a0 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20   not the case,. 
246b0 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20     ** return an 
246c0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65  SQLITE_CORRUPT e
246d0 72 72 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 61 73  rror.  */.    as
246e0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
246f0 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 31  ge[0]->intKey==1
24700 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
24710 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29  [0]->intKey==0 )
24720 3b 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d  ;.    if( (pCur-
24730 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70  >pKeyInfo==0)!=p
24740 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
24750 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
24760 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
24770 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
24780 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 65  }.  }..  /* Asse
24790 72 74 20 74 68 61 74 20 74 68 65 20 72 6f 6f 74  rt that the root
247a0 20 70 61 67 65 20 69 73 20 6f 66 20 74 68 65 20   page is of the 
247b0 63 6f 72 72 65 63 74 20 74 79 70 65 2e 20 54 68  correct type. Th
247c0 69 73 20 6d 75 73 74 20 62 65 20 74 68 65 0a 20  is must be the. 
247d0 20 2a 2a 20 63 61 73 65 20 61 73 20 74 68 65 20   ** case as the 
247e0 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e  call to this fun
247f0 63 74 69 6f 6e 20 74 68 61 74 20 6c 6f 61 64 65  ction that loade
24800 64 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  d the root-page 
24810 28 65 69 74 68 65 72 0a 20 20 2a 2a 20 74 68 69  (either.  ** thi
24820 73 20 63 61 6c 6c 20 6f 72 20 61 20 70 72 65 76  s call or a prev
24830 69 6f 75 73 20 69 6e 76 6f 63 61 74 69 6f 6e 29  ious invocation)
24840 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65   would have dete
24850 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 20  cted corruption 
24860 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 61 73 73  .  ** if the ass
24870 75 6d 70 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74  umption were not
24880 20 74 72 75 65 2c 20 61 6e 64 20 69 74 20 69 73   true, and it is
24890 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
248a0 72 20 74 68 65 20 66 6c 61 67 73 20 0a 20 20 2a  r the flags .  *
248b0 2a 20 62 79 74 65 20 74 6f 20 68 61 76 65 20 62  * byte to have b
248c0 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 77 68 69  een modified whi
248d0 6c 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 69  le this cursor i
248e0 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65  s holding a refe
248f0 72 65 6e 63 65 0a 20 20 2a 2a 20 74 6f 20 74 68  rence.  ** to th
24900 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 70 52  e page.  */.  pR
24910 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  oot = pCur->apPa
24920 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28  ge[0];.  assert(
24930 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43   pRoot->pgno==pC
24940 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a  ur->pgnoRoot );.
24950 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
24960 3e 69 73 49 6e 69 74 20 26 26 20 28 70 43 75 72  >isInit && (pCur
24970 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 3d 3d  ->pKeyInfo==0)==
24980 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 3b  pRoot->intKey );
24990 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ..  pCur->aiIdx[
249a0 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  0] = 0;.  pCur->
249b0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
249c0 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d    pCur->atLast =
249d0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69   0;.  pCur->vali
249e0 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 69 66  dNKey = 0;..  if
249f0 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30  ( pRoot->nCell>0
24a00 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53   ){.    pCur->eS
24a10 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
24a20 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  LID;.  }else if(
24a30 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b   !pRoot->leaf ){
24a40 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67  .    Pgno subpag
24a50 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74  e;.    if( pRoot
24a60 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75  ->pgno!=1 ) retu
24a70 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
24a80 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70  T_BKPT;.    subp
24a90 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
24aa0 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f  pRoot->aData[pRo
24ab0 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ot->hdrOffset+8]
24ac0 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
24ad0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
24ae0 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ID;.    rc = mov
24af0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73  eToChild(pCur, s
24b00 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  ubpage);.  }else
24b10 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
24b20 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
24b30 4c 49 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  LID;.  }.  retur
24b40 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
24b50 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
24b60 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  own to the left-
24b70 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
24b80 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65  beneath the.** e
24b90 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74  ntry to which it
24ba0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
24bb0 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  inting..**.** Th
24bc0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
24bd0 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
24be0 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65   the smallest ke
24bf0 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  y - the first.**
24c00 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
24c10 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
24c20 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  nt moveToLeftmos
24c30 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
24c40 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
24c50 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
24c60 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
24c70 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
24c80 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
24c90 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
24ca0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
24cb0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
24cc0 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  D );.  while( rc
24cd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
24ce0 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  (pPage = pCur->a
24cf0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
24d00 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  e])->leaf ){.   
24d10 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
24d20 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
24d30 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ]<pPage->nCell )
24d40 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  ;.    pgno = get
24d50 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
24d60 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64  Page, pCur->aiId
24d70 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29  x[pCur->iPage]))
24d80 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
24d90 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
24da0 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
24db0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
24dc0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
24dd0 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  wn to the right-
24de0 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
24df0 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70  beneath the.** p
24e00 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20  age to which it 
24e10 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
24e20 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74  nting.  Notice t
24e30 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a  he difference.**
24e40 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c   between moveToL
24e50 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f  eftmost() and mo
24e60 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e  veToRightmost().
24e70 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74    moveToLeftmost
24e80 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20  ().** finds the 
24e90 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  left-most entry 
24ea0 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74  beneath the *ent
24eb0 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65  ry* whereas move
24ec0 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a  ToRightmost().**
24ed0 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74   finds the right
24ee0 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
24ef0 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a  ath the *page*..
24f00 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d  **.** The right-
24f10 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68  most entry is th
24f20 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c  e one with the l
24f30 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65  argest key - the
24f40 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20   last.** key in 
24f50 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
24f60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
24f70 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42  oveToRightmost(B
24f80 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
24f90 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69    Pgno pgno;.  i
24fa0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
24fb0 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  K;.  MemPage *pP
24fc0 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  age = 0;..  asse
24fd0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
24fe0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
24ff0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
25000 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
25010 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ID );.  while( r
25020 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
25030 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
25040 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
25050 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  ge])->leaf ){.  
25060 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
25070 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
25080 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
25090 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  +8]);.    pCur->
250a0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
250b0 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  e] = pPage->nCel
250c0 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  l;.    rc = move
250d0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
250e0 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  no);.  }.  if( r
250f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
25100 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
25110 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70  pCur->iPage] = p
25120 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
25130 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
25140 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  ize = 0;.    pCu
25150 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
25160 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
25170 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
25180 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
25190 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
251a0 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
251b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
251c0 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20  n success.  Set 
251d0 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68  *pRes to 0 if th
251e0 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c  e cursor actuall
251f0 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65  y points to some
25200 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20  thing.** or set 
25210 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68  *pRes to 1 if th
25220 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
25230 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
25240 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75 72  BtreeFirst(BtCur
25250 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
25260 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
25270 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
25280 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
25290 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
252a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
252b0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
252c0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
252d0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
252e0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
252f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25300 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
25310 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
25320 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73  LID ){.      ass
25330 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
25340 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
25350 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
25360 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
25370 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
25380 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25390 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
253a0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
253b0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  age]->nCell>0 );
253c0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
253d0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
253e0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
253f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
25400 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
25410 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
25420 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
25430 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
25440 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
25450 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
25460 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
25470 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
25480 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
25490 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
254a0 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
254b0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
254c0 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
254d0 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
254e0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
254f0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
25500 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74  t rc;. .  assert
25510 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
25520 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
25530 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
25540 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
25550 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
25560 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
25570 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79  e cursor already
25580 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c   points to the l
25590 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20  ast entry, this 
255a0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20  is a no-op. */. 
255b0 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49   if( CURSOR_VALI
255c0 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
255d0 26 26 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20  && pCur->atLast 
255e0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
255f0 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68  _DEBUG.    /* Th
25600 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20  is block serves 
25610 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
25620 20 74 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c   the cursor real
25630 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20  ly does point . 
25640 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73     ** to the las
25650 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62  t entry in the b
25660 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e  -tree. */.    in
25670 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69  t ii;.    for(ii
25680 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61  =0; ii<pCur->iPa
25690 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ge; ii++){.     
256a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
256b0 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e  iIdx[ii]==pCur->
256c0 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c  apPage[ii]->nCel
256d0 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  l );.    }.    a
256e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
256f0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d  dx[pCur->iPage]=
25700 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  =pCur->apPage[pC
25710 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
25720 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  l-1 );.    asser
25730 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
25740 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65  pCur->iPage]->le
25750 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  af );.#endif.   
25760 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25770 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d  K;.  }..  rc = m
25780 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
25790 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
257a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
257b0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
257c0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
257d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
257e0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
257f0 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
25800 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
25810 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ell==0 );.      
25820 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d  *pRes = 1;.    }
25830 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
25840 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
25850 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
25860 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
25870 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  0;.      rc = mo
25880 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
25890 75 72 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  ur);.      pCur-
258a0 3e 61 74 4c 61 73 74 20 3d 20 72 63 3d 3d 53 51  >atLast = rc==SQ
258b0 4c 49 54 45 5f 4f 4b 20 3f 31 3a 30 3b 0a 20 20  LITE_OK ?1:0;.  
258c0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
258d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
258e0 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68  the cursor so th
258f0 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
25900 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68  an entry near th
25910 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66  e key .** specif
25920 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f  ied by pIdxKey o
25930 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75  r intKey.   Retu
25940 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64  rn a success cod
25950 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54  e..**.** For INT
25960 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20  KEY tables, the 
25970 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72  intKey parameter
25980 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b   is used.  pIdxK
25990 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e  ey .** must be N
259a0 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20  ULL.  For index 
259b0 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20  tables, pIdxKey 
259c0 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b  is used and intK
259d0 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ey.** is ignored
259e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78  ..**.** If an ex
259f0 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74  act match is not
25a00 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65   found, then the
25a10 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79   cursor is alway
25a20 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69  s.** left pointi
25a30 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67  ng at a leaf pag
25a40 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f  e which would ho
25a50 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20  ld the entry if 
25a60 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65  it.** were prese
25a70 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  nt.  The cursor 
25a80 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
25a90 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d  n entry that com
25aa0 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20  es.** before or 
25ab0 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a  after the key..*
25ac0 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20  *.** An integer 
25ad0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
25ae0 2a 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74  *pRes which is t
25af0 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
25b00 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65  comparing the ke
25b10 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79  y with the entry
25b20 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75   to which the cu
25b30 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e  rsor is .** poin
25b40 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69  ting.  The meani
25b50 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ng of the intege
25b60 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  r written into.*
25b70 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f  * *pRes is as fo
25b80 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
25b90 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68   *pRes<0      Th
25ba0 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
25bb0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
25bc0 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
25bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
25be0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69  s smaller than i
25bf0 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72  ntKey/pIdxKey or
25c00 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
25c10 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20   empty.**       
25c20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74             and t
25c30 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65  he cursor is the
25c40 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e  refore left poin
25c50 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a  t to nothing..**
25c60 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30  .**     *pRes==0
25c70 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
25c80 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
25c90 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
25ca0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
25cb0 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61        exactly ma
25cc0 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64  tches intKey/pId
25cd0 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  xKey..**.**     
25ce0 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65  *pRes>0      The
25cf0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
25d00 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
25d10 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
25d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
25d30 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74   larger than int
25d40 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a  Key/pIdxKey..**.
25d50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
25d60 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
25d70 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
25d80 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Cur,          /*
25d90 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62   The cursor to b
25da0 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70  e moved */.  Unp
25db0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64  ackedRecord *pId
25dc0 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65  xKey, /* Unpacke
25dd0 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20  d index key */. 
25de0 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20   i64 intKey,    
25df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
25e00 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20   table key */.  
25e10 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20 20  int biasRight,  
25e20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
25e30 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73 65  rue, bias the se
25e40 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68  arch to the high
25e50 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   end */.  int *p
25e60 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  Res             
25e70 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72     /* Write sear
25e80 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ch results here 
25e90 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
25ea0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
25eb0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
25ec0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
25ed0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
25ee0 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
25ef0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
25f00 61 73 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a  assert( pRes );.
25f10 20 20 61 73 73 65 72 74 28 20 28 70 49 64 78 4b    assert( (pIdxK
25f20 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70  ey==0)==(pCur->p
25f30 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a  KeyInfo==0) );..
25f40 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
25f50 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
25f60 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20  sitioned at the 
25f70 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72 79  point we are try
25f80 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65  ing.  ** to move
25f90 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72   to, then just r
25fa0 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
25fb0 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a  ing any work */.
25fc0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
25fd0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
25fe0 20 26 26 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e   && pCur->validN
25ff0 4b 65 79 20 0a 20 20 20 26 26 20 70 43 75 72 2d  Key .   && pCur-
26000 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
26010 65 79 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  ey .  ){.    if(
26020 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
26030 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ==intKey ){.    
26040 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
26050 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26060 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
26070 66 28 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20  f( pCur->atLast 
26080 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  && pCur->info.nK
26090 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
260a0 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
260b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
260c0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
260d0 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ..  rc = moveToR
260e0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
260f0 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
26100 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
26110 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
26120 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
26130 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
26140 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e] );.  assert( 
26150 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
26160 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
26170 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
26180 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65  isInit );.  asse
26190 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
261a0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
261b0 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
261c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
261d0 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66 28 20  Cell>0 );.  if( 
261e0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
261f0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
26200 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
26210 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
26220 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
26230 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
26240 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
26250 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  l==0 );.    retu
26260 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
26270 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
26280 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
26290 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29  Key || pIdxKey )
262a0 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20  ;.  for(;;){.   
262b0 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69   int lwr, upr, i
262c0 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20  dx, c;.    Pgno 
262d0 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50  chldPg;.    MemP
262e0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
262f0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
26300 69 50 61 67 65 5d 3b 0a 20 20 20 20 75 38 20 2a  iPage];.    u8 *
26310 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pCell;          
26320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26330 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75  /* Pointer to cu
26340 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50  rrent cell in pP
26350 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70  age */..    /* p
26360 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74  Page->nCell must
26370 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
26380 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69   zero. If this i
26390 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a  s the root-page.
263a0 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f      ** the curso
263b0 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65  r would have bee
263c0 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20  n INVALID above 
263d0 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29  and this for(;;)
263e0 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74   loop.    ** not
263f0 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73   run. If this is
26400 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61   not the root-pa
26410 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76  ge, then the mov
26420 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69  eToChild() routi
26430 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20  ne.    ** would 
26440 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65 74  have already det
26450 65 63 74 65 64 20 64 62 20 63 6f 72 72 75 70 74  ected db corrupt
26460 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20  ion. Similarly, 
26470 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a  pPage must.    *
26480 2a 20 62 65 20 74 68 65 20 72 69 67 68 74 20 6b  * be the right k
26490 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61  ind (index or ta
264a0 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70  ble) of b-tree p
264b0 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20  age. Otherwise. 
264c0 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68     ** a moveToCh
264d0 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52  ild() or moveToR
264e0 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64  oot() call would
264f0 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63   have detected c
26500 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20  orruption.  */. 
26510 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
26520 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
26530 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
26540 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79  intKey==(pIdxKey
26550 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20  ==0) );.    lwr 
26560 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70  = 0;.    upr = p
26570 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
26580 20 20 20 61 73 73 65 72 74 28 20 62 69 61 73 52     assert( biasR
26590 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52  ight==0 || biasR
265a0 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69  ight==1 );.    i
265b0 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61  dx = upr>>(1-bia
265c0 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78 20  sRight); /* idx 
265d0 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20 75 70  = biasRight ? up
265e0 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  r : (lwr+upr)/2;
265f0 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61 69   */.    pCur->ai
26600 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
26610 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
26620 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
26630 65 79 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  ey ){.      for(
26640 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  ;;){.        i64
26650 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
26660 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
26670 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 20  ell(pPage, idx) 
26680 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
26690 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  rSize;.        i
266a0 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
266b0 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  a ){.          w
266c0 68 69 6c 65 28 20 30 78 38 30 20 3c 3d 20 2a 28  hile( 0x80 <= *(
266d0 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20  pCell++) ){.    
266e0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c          if( pCel
266f0 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  l>=pPage->aDataE
26700 6e 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  nd ) return SQLI
26710 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
26720 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26730 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
26740 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20  etVarint(pCell, 
26750 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29  (u64*)&nCellKey)
26760 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
26770 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  ellKey<intKey ){
26780 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
26790 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20   idx+1;.        
267a0 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b    if( lwr>upr ){
267b0 20 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20   c = -1; break; 
267c0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  }.        }else 
267d0 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74  if( nCellKey>int
267e0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
267f0 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20   upr = idx-1;.  
26800 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e          if( lwr>
26810 75 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62  upr ){ c = +1; b
26820 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20  reak; }.        
26830 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
26840 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65   assert( nCellKe
26850 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20  y==intKey );.   
26860 20 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c         pCur->val
26870 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  idNKey = 1;.    
26880 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
26890 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79  .nKey = nCellKey
268a0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
268b0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
268c0 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b  age] = (u16)idx;
268d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
268e0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
268f0 20 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d             lwr =
26900 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20   idx;.          
26910 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65    goto moveto_ne
26920 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20 20  xt_layer;.      
26930 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26940 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30         *pRes = 0
26950 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
26960 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
26970 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
26980 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
26990 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
269a0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
269b0 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29  rt( lwr+upr>=0 )
269c0 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20  ;.        idx = 
269d0 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f  (lwr+upr)>>1;  /
269e0 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72  * idx = (lwr+upr
269f0 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  )/2; */.      }.
26a00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26a10 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
26a20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20    int nCell;.   
26a30 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e       pCell = fin
26a40 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
26a50 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  ) + pPage->child
26a60 50 74 72 53 69 7a 65 3b 0a 0a 20 20 20 20 20 20  PtrSize;..      
26a70 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
26a80 20 73 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d   supported page-
26a90 73 69 7a 65 20 69 73 20 36 35 35 33 36 20 62 79  size is 65536 by
26aa0 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  tes. This means 
26ab0 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
26ac0 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
26ad0 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74  er of record byt
26ae0 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20  es stored on an 
26af0 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20  index B-Tree.   
26b00 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20       ** page is 
26b10 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38 34 20  less than 16384 
26b20 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65  bytes and may be
26b30 20 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62   stored as a 2-b
26b40 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76  yte.        ** v
26b50 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f  arint. This info
26b60 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
26b70 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76  to attempt to av
26b80 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20  oid parsing .   
26b90 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69       ** the enti
26ba0 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b  re cell by check
26bb0 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73 65  ing for the case
26bc0 73 20 77 68 65 72 65 20 74 68 65 20 72 65 63 6f  s where the reco
26bd0 72 64 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a  rd is .        *
26be0 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c  * stored entirel
26bf0 79 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74  y within the b-t
26c00 72 65 65 20 70 61 67 65 20 62 79 20 69 6e 73 70  ree page by insp
26c10 65 63 74 69 6e 67 20 74 68 65 20 66 69 72 73 74  ecting the first
26c20 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62   .        ** 2 b
26c30 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  ytes of the cell
26c40 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
26c50 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65       nCell = pCe
26c60 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[0];.        i
26c70 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d  f( nCell<=pPage-
26c80 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
26c90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
26ca0 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e   This branch run
26cb0 73 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d  s if the record-
26cc0 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68  size field of th
26cd0 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20  e cell is a.    
26ce0 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
26cf0 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20  byte varint and 
26d00 74 68 65 20 72 65 63 6f 72 64 20 66 69 74 73 20  the record fits 
26d10 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20  entirely on the 
26d20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  main.          *
26d30 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
26d40 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
26d50 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65  tcase( pCell+nCe
26d60 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61  ll+1==pPage->aDa
26d70 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20  taEnd );.       
26d80 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64     c = sqlite3Vd
26d90 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
26da0 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70  nCell, (void*)&p
26db0 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79  Cell[1], pIdxKey
26dc0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
26dd0 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20   if( !(pCell[1] 
26de0 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20 20  & 0x80) .       
26df0 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28     && (nCell = (
26e00 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29  (nCell&0x7f)<<7)
26e10 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50   + pCell[1])<=pP
26e20 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20  age->maxLocal.  
26e30 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
26e40 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
26e50 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61  -size field is a
26e60 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20 61   2 byte varint a
26e70 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20  nd the record . 
26e80 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73           ** fits
26e90 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
26ea0 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67   main b-tree pag
26eb0 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
26ec0 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c   testcase( pCell
26ed0 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d  +nCell+2==pPage-
26ee0 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20  >aDataEnd );.   
26ef0 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
26f00 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
26f10 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64  are(nCell, (void
26f20 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64  *)&pCell[2], pId
26f30 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  xKey);.        }
26f40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26f50 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c  /* The record fl
26f60 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e  ows over onto on
26f70 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
26f80 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20  ow pages. In.   
26f90 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
26fa0 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65  ase the whole ce
26fb0 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  ll needs to be p
26fc0 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 20  arsed, a buffer 
26fd0 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20  allocated.      
26fe0 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73      ** and acces
26ff0 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20  sPayload() used 
27000 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20  to retrieve the 
27010 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a  record into the.
27020 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66            ** buf
27030 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65 52  fer before VdbeR
27040 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63  ecordCompare() c
27050 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f  an be called. */
27060 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20  .          void 
27070 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20  *pCellKey;.     
27080 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20       u8 * const 
27090 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c  pCellBody = pCel
270a0 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l - pPage->child
270b0 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  PtrSize;.       
270c0 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
270d0 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
270e0 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e  lBody, &pCur->in
270f0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  fo);.          n
27100 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72  Cell = (int)pCur
27110 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20  ->info.nKey;.   
27120 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20         pCellKey 
27130 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
27140 20 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20   nCell );.      
27150 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79      if( pCellKey
27160 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
27170 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
27180 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
27190 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
271a0 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
271b0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  }.          pCur
271c0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
271d0 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b  age] = (u16)idx;
271e0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
271f0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
27200 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75  ur, 0, nCell, (u
27210 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43  nsigned char*)pC
27220 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20  ellKey, 0);.    
27230 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
27240 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
27250 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
27260 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
27270 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
27280 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
27290 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71            c = sq
272a0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
272b0 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43  ompare(nCell, pC
272c0 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29  ellKey, pIdxKey)
272d0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
272e0 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
272f0 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  y);.        }.  
27300 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b        if( c<0 ){
27310 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
27320 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20   idx+1;.        
27330 7d 65 6c 73 65 20 69 66 28 20 63 3e 30 20 29 7b  }else if( c>0 ){
27340 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d  .          upr =
27350 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20   idx-1;.        
27360 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
27370 20 61 73 73 65 72 74 28 20 63 3d 3d 30 20 29 3b   assert( c==0 );
27380 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73  .          *pRes
27390 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
273a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
273b0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
273c0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
273d0 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  e] = (u16)idx;. 
273e0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
273f0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
27400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
27410 66 28 20 6c 77 72 3e 75 70 72 20 29 20 62 72 65  f( lwr>upr ) bre
27420 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ak;.        asse
27430 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29  rt( lwr+upr>=0 )
27440 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20  ;.        idx = 
27450 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f  (lwr+upr)>>1;  /
27460 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72  * idx = (lwr+upr
27470 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  )/2 */.      }. 
27480 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
27490 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28   lwr==upr+1 || (
274a0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
274b0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29   !pPage->leaf) )
274c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
274d0 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
274e0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
274f0 61 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  af ){.      asse
27500 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
27510 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
27520 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
27530 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
27540 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49  .      pCur->aiI
27550 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
27560 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
27570 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20    *pRes = c;.   
27580 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
27590 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f  K;.      goto mo
275a0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
275b0 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c   }.moveto_next_l
275c0 61 79 65 72 3a 0a 20 20 20 20 69 66 28 20 6c 77  ayer:.    if( lw
275d0 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r>=pPage->nCell 
275e0 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  ){.      chldPg 
275f0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
27600 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
27610 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
27620 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27630 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
27640 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
27650 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20  , lwr));.    }. 
27660 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
27670 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
27680 31 36 29 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d  16)lwr;.    rc =
27690 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
276a0 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20  r, chldPg);.    
276b0 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
276c0 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73    }.moveto_finis
276d0 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  h:.  pCur->info.
276e0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
276f0 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
27700 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
27710 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
27720 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73  TRUE if the curs
27730 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
27740 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f  ng at an entry o
27750 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  f the table..**.
27760 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20  ** TRUE will be 
27770 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61  returned after a
27780 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
27790 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65  BtreeNext() move
277a0 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61  s.** past the la
277b0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
277c0 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33  table or sqlite3
277d0 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65  BtreePrev() move
277e0 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69  s past.** the fi
277f0 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45  rst entry.  TRUE
27800 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
27810 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  d if the table i
27820 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
27830 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28  sqlite3BtreeEof(
27840 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
27850 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74  .  /* TODO: What
27860 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
27870 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55  s in CURSOR_REQU
27880 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20  IRESEEK but all 
27890 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20  table entries.  
278a0 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c  ** have been del
278b0 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77  eted? This API w
278c0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e  ill need to chan
278d0 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ge to return an 
278e0 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20  error code.  ** 
278f0 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62  as well as the b
27900 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61  oolean result va
27910 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  lue..  */.  retu
27920 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44  rn (CURSOR_VALID
27930 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b  !=pCur->eState);
27940 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
27950 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
27960 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69  the next entry i
27970 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
27980 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   If.** successfu
27990 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  l then set *pRes
279a0 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  =0.  If the curs
279b0 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64  or.** was alread
279c0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
279d0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
279e0 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
279f0 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ore.** this rout
27a00 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ine was called, 
27a10 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31  then set *pRes=1
27a20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
27a30 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73  BtreeNext(BtCurs
27a40 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
27a50 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
27a60 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d    int idx;.  Mem
27a70 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
27a80 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
27a90 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
27aa0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
27ab0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
27ac0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
27ad0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  =0 || pCur->eSta
27ae0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
27af0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
27b00 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
27b10 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 63 20 3d  ALID ){.    rc =
27b20 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
27b30 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
27b40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27b50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  _OK ){.      *pR
27b60 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  es = 0;.      re
27b70 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
27b80 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
27b90 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
27ba0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  ate ){.      *pR
27bb0 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  es = 1;.      re
27bc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27bd0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
27be0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a  ur->skipNext ){.
27bf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
27c00 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
27c10 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
27c20 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
27c30 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20  _SKIPNEXT );.   
27c40 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
27c50 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
27c60 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
27c70 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20  skipNext>0 ){.  
27c80 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
27c90 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Next = 0;.      
27ca0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
27cb0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
27cc0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
27cd0 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
27ce0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ext = 0;.    }. 
27cf0 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
27d00 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
27d10 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d  >iPage];.  idx =
27d20 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   ++pCur->aiIdx[p
27d30 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
27d40 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
27d50 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  Init );..  /* If
27d60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
27d70 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20 69  le is corrupt, i
27d80 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
27d90 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69  r the value of i
27da0 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69  dx .  ** to be i
27db0 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68 69  nvalid here. Thi
27dc0 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72  s can only occur
27dd0 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75 72   if a second cur
27de0 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a  sor modifies.  *
27df0 2a 20 74 68 65 20 70 61 67 65 20 77 68 69 6c 65  * the page while
27e00 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
27e10 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65  holding a refere
27e20 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63 68  nce to it. Which
27e30 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68   can.  ** only h
27e40 61 70 70 65 6e 20 69 66 20 74 68 65 20 64 61 74  appen if the dat
27e50 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74  abase is corrupt
27e60 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 61   in such a way a
27e70 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20  s to link the.  
27e80 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72  ** page into mor
27e90 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65  e than one b-tre
27ea0 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  e structure. */.
27eb0 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 3e    testcase( idx>
27ec0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
27ed0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
27ee0 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
27ef0 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
27f00 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65    if( idx>=pPage
27f10 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69  ->nCell ){.    i
27f20 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
27f30 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  ){.      rc = mo
27f40 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
27f50 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
27f60 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
27f70 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20  rOffset+8]));.  
27f80 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
27f90 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
27fa0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
27fb0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
27fc0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
27fd0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
27fe0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
27ff0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
28000 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20     }.    do{.   
28010 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61     if( pCur->iPa
28020 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
28030 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
28040 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
28050 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
28060 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  D;.        retur
28070 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
28080 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54     }.      moveT
28090 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
280a0 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75       pPage = pCu
280b0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
280c0 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69  iPage];.    }whi
280d0 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  le( pCur->aiIdx[
280e0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50  pCur->iPage]>=pP
280f0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
28100 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
28110 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
28120 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
28130 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
28140 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  t(pCur, pRes);. 
28150 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28160 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
28170 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
28180 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73   rc;.  }.  *pRes
28190 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
281a0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
281b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
281c0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65  .  }.  rc = move
281d0 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
281e0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
281f0 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68  .../*.** Step th
28200 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
28210 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76  back to the prev
28220 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68  ious entry in th
28230 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
28240 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
28250 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
28260 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
28270 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
28280 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69  inting to the fi
28290 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
282a0 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
282b0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
282c0 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
282d0 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
282e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
282f0 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
28300 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
28310 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
28320 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
28330 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
28340 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
28350 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
28360 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61  ( pRes!=0 );.  a
28370 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
28380 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
28390 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
283a0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 43 75 72  _VALID );.  pCur
283b0 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20  ->atLast = 0;.  
283c0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
283d0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
283e0 7b 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59 53  {.    if( ALWAYS
283f0 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43  (pCur->eState>=C
28400 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
28410 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  K) ){.      rc =
28420 20 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72   btreeRestoreCur
28430 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
28440 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
28450 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28460 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
28470 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
28480 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
28490 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  }.    if( CURSOR
284a0 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
284b0 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
284c0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
284d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
284e0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
284f0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
28500 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
28510 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
28520 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
28530 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
28540 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a  SOR_SKIPNEXT );.
28550 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
28560 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
28570 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  D;.      if( pCu
28580 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b  r->skipNext<0 ){
28590 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73  .        pCur->s
285a0 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
285b0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
285c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
285d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
285e0 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b  }.      pCur->sk
285f0 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
28600 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d  }.  }..  pPage =
28610 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
28620 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
28630 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
28640 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50  nit );.  if( !pP
28650 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
28660 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d   int idx = pCur-
28670 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
28680 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ge];.    rc = mo
28690 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
286a0 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
286b0 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b  l(pPage, idx)));
286c0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
286d0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
286e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
286f0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
28700 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
28710 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCur);.  }else{.
28720 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d      while( pCur-
28730 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
28740 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ge]==0 ){.      
28750 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
28760 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  =0 ){.        pC
28770 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
28780 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
28790 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
287a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
287b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
287c0 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61  }.      moveToPa
287d0 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
287e0 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  }.    pCur->info
287f0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
28800 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
28810 3d 20 30 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e  = 0;..    pCur->
28820 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
28830 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20  e]--;.    pPage 
28840 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
28850 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
28860 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
28870 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ey && !pPage->le
28880 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
28890 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
288a0 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73  vious(pCur, pRes
288b0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
288c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
288d0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
288e0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74  *pRes = 0;.  ret
288f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
28900 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
28910 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61  page from the da
28920 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
28930 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  ** The new page 
28940 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  is marked as dir
28950 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77  ty.  (In other w
28960 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67  ords, sqlite3Pag
28970 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73  erWrite().** has
28980 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
28990 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20  lled on the new 
289a0 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20  page.)  The new 
289b0 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a  page has also.**
289c0 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64   been referenced
289d0 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67   and the calling
289e0 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70   routine is resp
289f0 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c  onsible for call
28a00 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  ing.** sqlite3Pa
28a10 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68  gerUnref() on th
28a20 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20  e new page when 
28a30 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a  it is done..**.*
28a40 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
28a50 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
28a60 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72  ss.  Any other r
28a70 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69  eturn value indi
28a80 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f  cates.** an erro
28a90 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20  r.  *ppPage and 
28aa0 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66  *pPgno are undef
28ab0 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ined in the even
28ac0 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  t of an error..*
28ad0 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20  * Do not invoke 
28ae0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
28af0 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69  f() on *ppPage i
28b00 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  f an error is re
28b10 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
28b20 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61   the "nearby" pa
28b30 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30  rameter is not 0
28b40 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72 74  , then an effort
28b50 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20   is made to .** 
28b60 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c  locate a page cl
28b70 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  ose to the page 
28b80 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e  number "nearby".
28b90 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
28ba0 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65  ed in an.** atte
28bb0 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61  mpt to keep rela
28bc0 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20  ted pages close 
28bd0 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e  to each other in
28be0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
28bf0 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20  le,.** which in 
28c00 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61  turn can make da
28c10 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61  tabase access fa
28c20 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ster..**.** If t
28c30 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65 74  he eMode paramet
28c40 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58  er is BTALLOC_EX
28c50 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61 72  ACT and the near
28c60 62 79 20 70 61 67 65 20 65 78 69 73 74 73 0a 2a  by page exists.*
28c70 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68  * anywhere on th
28c80 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
28c90 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  n it is guarante
28ca0 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ed to be returne
28cb0 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20  d.  If.** eMode 
28cc0 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68  is BTALLOC_LT th
28cd0 65 6e 20 74 68 65 20 70 61 67 65 20 72 65 74 75  en the page retu
28ce0 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65 73  rned will be les
28cf0 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  s than or equal.
28d00 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66 20  ** to nearby if 
28d10 61 6e 79 20 73 75 63 68 20 70 61 67 65 20 65 78  any such page ex
28d20 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65 20  ists.  If eMode 
28d30 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74  is BTALLOC_ANY t
28d40 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65  hen there.** are
28d50 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 73   no restrictions
28d60 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20 69   on which page i
28d70 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
28d80 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
28d90 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42  teBtreePage(.  B
28da0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
28db0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
28dc0 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
28dd0 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 2f  **ppPage,      /
28de0 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72 20  * Store pointer 
28df0 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  to the allocated
28e00 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20   page here */.  
28e10 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20  Pgno *pPgno,    
28e20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
28e30 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
28e40 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  here */.  Pgno n
28e50 65 61 72 62 79 2c 20 20 20 20 20 20 20 20 20 20  earby,          
28e60 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
28e70 20 70 61 67 65 20 6e 65 61 72 20 74 68 69 73 20   page near this 
28e80 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64  one */.  u8 eMod
28e90 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
28ea0 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  /* BTALLOC_EXACT
28eb0 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72  , BTALLOC_LT, or
28ec0 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a   BTALLOC_ANY */.
28ed0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
28ee0 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  age1;.  int rc;.
28ef0 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20    u32 n;     /* 
28f00 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
28f10 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
28f20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20  */.  u32 k;     
28f30 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  /* Number of lea
28f40 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  ves on the trunk
28f50 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
28f60 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
28f70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d  Trunk = 0;.  Mem
28f80 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b  Page *pPrevTrunk
28f90 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50   = 0;.  Pgno mxP
28fa0 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61  age;     /* Tota
28fb0 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  l size of the da
28fc0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
28fd0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
28fe0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
28ff0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
29000 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41  sert( eMode==BTA
29010 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61  LLOC_ANY || (nea
29020 72 62 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f 6d  rby>0 && IfNotOm
29030 69 74 41 56 28 70 42 74 2d 3e 61 75 74 6f 56 61  itAV(pBt->autoVa
29040 63 75 75 6d 29 29 20 29 3b 0a 20 20 70 50 61 67  cuum)) );.  pPag
29050 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
29060 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74 72  ;.  mxPage = btr
29070 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
29080 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65  ;.  n = get4byte
29090 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
290a0 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65  36]);.  testcase
290b0 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b  ( n==mxPage-1 );
290c0 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65  .  if( n>=mxPage
290d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
290e0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
290f0 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e  PT;.  }.  if( n>
29100 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
29110 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74  e are pages on t
29120 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65  he freelist.  Re
29130 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  use one of those
29140 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50   pages. */.    P
29150 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  gno iTrunk;.    
29160 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20  u8 searchList = 
29170 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65  0; /* If the fre
29180 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73  e-list must be s
29190 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61  earched for 'nea
291a0 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20  rby' */.    .   
291b0 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54   /* If eMode==BT
291c0 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20  ALLOC_EXACT and 
291d0 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70  a query of the p
291e0 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a  ointer-map.    *
291f0 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65  * shows that the
29200 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
29210 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74  s somewhere on t
29220 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
29230 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  en.    ** the en
29240 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  tire-list will b
29250 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
29260 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  hat page..    */
29270 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29280 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
29290 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42      if( eMode==B
292a0 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a  TALLOC_EXACT ){.
292b0 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
292c0 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  <=mxPage ){.    
292d0 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
292e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65        assert( ne
292f0 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20  arby>0 );.      
29300 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
29310 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20  utoVacuum );.   
29320 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
29330 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c  Get(pBt, nearby,
29340 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20   &eType, 0);.   
29350 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
29360 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
29370 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
29380 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
29390 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c           searchL
293a0 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ist = 1;.       
293b0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
293c0 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65 3d 3d  else if( eMode==
293d0 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20  BTALLOC_LE ){.  
293e0 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
293f0 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
29400 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
29410 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  nt the free-list
29420 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74   count by 1. Set
29430 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69   iTrunk to the i
29440 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20  ndex of the.    
29450 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69  ** first free-li
29460 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69  st trunk page. i
29470 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69  PrevTrunk is ini
29480 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f  tially 1..    */
29490 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
294a0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
294b0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
294c0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
294d0 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79  n rc;.    put4by
294e0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
294f0 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20  a[36], n-1);..  
29500 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69    /* The code wi
29510 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69  thin this loop i
29520 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20  s run only once 
29530 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69  if the 'searchLi
29540 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20  st' variable.   
29550 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e   ** is not true.
29560 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72   Otherwise, it r
29570 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
29580 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20  h trunk-page on 
29590 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d  the.    ** free-
295a0 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70  list until the p
295b0 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
295c0 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d  located (eMode==
295d0 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20  BTALLOC_EXACT). 
295e0 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61     ** or until a
295f0 20 70 61 67 65 20 6c 65 73 73 20 74 68 61 6e 20   page less than 
29600 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
29610 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c  ted (eMode==BTAL
29620 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20  LOC_LT).    */. 
29630 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50     do {.      pP
29640 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e  revTrunk = pTrun
29650 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  k;.      if( pPr
29660 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
29670 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
29680 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
29690 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20  ->aData[0]);.   
296a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
296b0 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
296c0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
296d0 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d  ta[32]);.      }
296e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
296f0 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20   iTrunk==mxPage 
29700 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 72  );.      if( iTr
29710 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20  unk>mxPage ){.  
29720 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
29730 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
29740 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29750 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
29760 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  etPage(pBt, iTru
29770 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  nk, &pTrunk, 0);
29780 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
29790 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
297a0 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
297b0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
297c0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
297d0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
297e0 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a  t( pTrunk!=0 );.
297f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
29800 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29  runk->aData!=0 )
29810 3b 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74  ;..      k = get
29820 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
29830 44 61 74 61 5b 34 5d 29 3b 20 2f 2a 20 23 20 6f  Data[4]); /* # o
29840 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 69 73  f leaves on this
29850 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20   trunk page */. 
29860 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26       if( k==0 &&
29870 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a   !searchList ){.
29880 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
29890 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76  runk has no leav
298a0 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20  es and the list 
298b0 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61  is not being sea
298c0 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20  rched. .        
298d0 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68  ** So extract th
298e0 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73  e trunk page its
298f0 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61  elf and use it a
29900 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20  s the newly .   
29910 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
29920 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  d page */.      
29930 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54    assert( pPrevT
29940 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  runk==0 );.     
29950 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
29960 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
29970 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
29980 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
29990 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
299a0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
299b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
299c0 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
299d0 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  k;.        memcp
299e0 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
299f0 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
29a00 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
29a10 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
29a20 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70  Trunk;.        p
29a30 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
29a40 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
29a50 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
29a60 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
29a70 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
29a80 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  -1));.      }els
29a90 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42  e if( k>(u32)(pB
29aa0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
29ab0 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  - 2) ){.        
29ac0 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73  /* Value of k is
29ad0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20   out of range.  
29ae0 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
29af0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ion */.        r
29b00 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
29b10 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
29b20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
29b30 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66  te_page;.#ifndef
29b40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
29b50 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65  OVACUUM.      }e
29b60 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69  lse if( searchLi
29b70 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  st .            
29b80 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75  && (nearby==iTru
29b90 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65  nk || (iTrunk<ne
29ba0 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
29bb0 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
29bc0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
29bd0 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
29be0 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
29bf0 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
29c00 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
29c10 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
29c20 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
29c30 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
29c40 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
29c50 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67   */.        *pPg
29c60 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
29c70 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
29c80 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
29c90 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
29ca0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
29cb0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
29cc0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
29cd0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
29ce0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
29cf0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
29d00 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
29d10 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
29d20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
29d30 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
29d40 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
29d50 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
29d60 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
29d70 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
29d80 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
29d90 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
29da0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
29db0 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
29dc0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
29dd0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29de0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
29df0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
29e00 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
29e10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
29e20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
29e30 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
29e40 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
29e50 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
29e60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29e70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
29e80 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70    /* The trunk p
29e90 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20  age is required 
29ea0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75  by the caller bu
29eb0 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20  t it contains . 
29ec0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e           ** poin
29ed0 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73  ters to free-lis
29ee0 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69  t leaves. The fi
29ef0 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73  rst leaf becomes
29f00 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20   a trunk.       
29f10 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
29f20 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20  is case..       
29f30 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
29f40 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75  MemPage *pNewTru
29f50 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67  nk;.          Pg
29f60 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67  no iNewTrunk = g
29f70 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
29f80 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20  >aData[8]);.    
29f90 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72        if( iNewTr
29fa0 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20  unk>mxPage ){ . 
29fb0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
29fc0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
29fd0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
29fe0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
29ff0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2a000 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74     }.          t
2a010 65 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75  estcase( iNewTru
2a020 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  nk==mxPage );.  
2a030 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
2a040 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
2a050 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54  NewTrunk, &pNewT
2a060 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
2a070 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2a080 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2a090 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2a0a0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2a0b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a0c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2a0d0 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72  agerWrite(pNewTr
2a0e0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2a0f0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2a100 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a110 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
2a120 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
2a130 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2a140 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2a150 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
2a160 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
2a170 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
2a180 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
2a190 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
2a1a0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
2a1b0 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  te(&pNewTrunk->a
2a1c0 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
2a1d0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
2a1e0 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
2a1f0 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[8], &pTrunk->a
2a200 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a  Data[12], (k-1)*
2a210 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  4);.          re
2a220 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
2a230 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
2a240 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
2a250 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
2a260 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2a270 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2a280 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20  Page1->pDbPage) 
2a290 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
2a2a0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
2a2b0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77  >aData[32], iNew
2a2c0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
2a2d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2a2e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2a2f0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65  3PagerWrite(pPre
2a300 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  vTrunk->pDbPage)
2a310 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2a320 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2a330 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2a340 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2a350 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a360 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
2a370 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
2a380 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e  ata[0], iNewTrun
2a390 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  k);.          }.
2a3a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a3b0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
2a3c0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
2a3d0 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
2a3e0 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
2a3f0 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
2a400 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  , n-1));.#endif.
2a410 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2a420 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  k>0 ){.        /
2a430 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66  * Extract a leaf
2a440 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20   from the trunk 
2a450 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 63  */.        u32 c
2a460 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20  losest;.        
2a470 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20  Pgno iPage;.    
2a480 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
2a490 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e  r *aData = pTrun
2a4a0 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  k->aData;.      
2a4b0 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29    if( nearby>0 )
2a4c0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  {.          u32 
2a4d0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  i;.          clo
2a4e0 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
2a4f0 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42      if( eMode==B
2a500 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20  TALLOC_LE ){.   
2a510 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
2a520 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
2a530 20 20 20 20 20 20 20 20 20 20 20 69 50 61 67 65             iPage
2a540 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
2a550 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20  ta[8+i*4]);.    
2a560 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50            if( iP
2a570 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20  age<=nearby ){. 
2a580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2a590 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
2a5a0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2a5b0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
2a5c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
2a5d0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2a5e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
2a5f0 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20  t dist;.        
2a600 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74      dist = sqlit
2a610 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62  e3AbsInt32(get4b
2a620 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d  yte(&aData[8]) -
2a630 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20   nearby);.      
2a640 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
2a650 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; i++){.      
2a660 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d          int d2 =
2a670 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32   sqlite3AbsInt32
2a680 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61  (get4byte(&aData
2a690 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62  [8+i*4]) - nearb
2a6a0 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
2a6b0 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b    if( d2<dist ){
2a6c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a6d0 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
2a6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
2a6f0 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20  st = d2;.       
2a700 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2a720 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2a730 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  {.          clos
2a740 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
2a750 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67   }..        iPag
2a760 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
2a770 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
2a780 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
2a790 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61  ase( iPage==mxPa
2a7a0 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ge );.        if
2a7b0 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29  ( iPage>mxPage )
2a7c0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2a7d0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2a7e0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
2a7f0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2a800 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2a810 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  }.        testca
2a820 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67  se( iPage==mxPag
2a830 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
2a840 20 21 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20   !searchList .  
2a850 20 20 20 20 20 20 20 7c 7c 20 28 69 50 61 67 65         || (iPage
2a860 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69 50 61  ==nearby || (iPa
2a870 67 65 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f  ge<nearby && eMo
2a880 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29  de==BTALLOC_LE))
2a890 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20   .        ){.   
2a8a0 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e         int noCon
2a8b0 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20  tent;.          
2a8c0 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a  *pPgno = iPage;.
2a8d0 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28            TRACE(
2a8e0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77  ("ALLOCATE: %d w
2a8f0 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64  as leaf %d of %d
2a900 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20   on trunk %d".  
2a910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2a920 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70  : %d more free p
2a930 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ages\n",.       
2a940 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
2a950 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20  , closest+1, k, 
2a960 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d  pTrunk->pgno, n-
2a970 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  1));.          r
2a980 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2a990 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
2a9a0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2a9b0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2a9c0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2a9d0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
2a9e0 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a   closest<k-1 ){.
2a9f0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
2aa00 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  py(&aData[8+clos
2aa10 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34  est*4], &aData[4
2aa20 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20  +k*4], 4);.     
2aa30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2aa40 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61   put4byte(&aData
2aa50 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
2aa60 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d       noContent =
2aa70 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e   !btreeGetHasCon
2aa80 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f  tent(pBt, *pPgno
2aa90 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f  ) ? PAGER_GET_NO
2aaa0 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20 20 20  CONTENT : 0;.   
2aab0 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
2aac0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70  eGetPage(pBt, *p
2aad0 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f  Pgno, ppPage, no
2aae0 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20  Content);.      
2aaf0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2ab00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2ab10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2ab20 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
2ab30 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
2ab40 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2ab50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2ab60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2ab70 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
2ab80 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2ab90 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
2aba0 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68            search
2abb0 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
2abc0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2abd0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2abe0 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  revTrunk);.     
2abf0 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b   pPrevTrunk = 0;
2ac00 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61  .    }while( sea
2ac10 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  rchList );.  }el
2ac20 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65  se{.    /* There
2ac30 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e   are no pages on
2ac40 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73   the freelist, s
2ac50 6f 20 61 70 70 65 6e 64 20 61 20 6e 65 77 20 70  o append a new p
2ac60 61 67 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  age to the.    *
2ac70 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  * database image
2ac80 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2ac90 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61  Normally, new pa
2aca0 67 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  ges allocated by
2acb0 20 74 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20   this block can 
2acc0 62 65 20 72 65 71 75 65 73 74 65 64 20 66 72 6f  be requested fro
2acd0 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  m the.    ** pag
2ace0 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68  er layer with th
2acf0 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66  e 'no-content' f
2ad00 6c 61 67 20 73 65 74 2e 20 54 68 69 73 20 70 72  lag set. This pr
2ad10 65 76 65 6e 74 73 20 74 68 65 20 70 61 67 65 72  events the pager
2ad20 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79  .    ** from try
2ad30 69 6e 67 20 74 6f 20 72 65 61 64 20 74 68 65 20  ing to read the 
2ad40 70 61 67 65 73 20 63 6f 6e 74 65 6e 74 20 66 72  pages content fr
2ad50 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76 65 72  om disk. However
2ad60 2c 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  , if the.    ** 
2ad70 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
2ad80 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
2ad90 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  run one or more 
2ada0 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
2adb0 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70 73 2c  um.    ** steps,
2adc0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 77   then the page w
2add0 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 61  e are about to a
2ade0 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e 74  llocate may cont
2adf0 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20  ain content.    
2ae00 2a 2a 20 74 68 61 74 20 69 73 20 72 65 71 75 69  ** that is requi
2ae10 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  red in the event
2ae20 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20   of a rollback. 
2ae30 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 64 6f  In this case, do
2ae40 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20  .    ** not set 
2ae50 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66  the no-content f
2ae60 6c 61 67 2e 20 54 68 69 73 20 63 61 75 73 65 73  lag. This causes
2ae70 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 6c 6f   the pager to lo
2ae80 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20  ad and journal. 
2ae90 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
2aea0 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 62  t page content b
2aeb0 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e  efore overwritin
2aec0 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  g it..    **.   
2aed0 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
2aee0 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74  e pager will not
2aef0 20 61 63 74 75 61 6c 6c 79 20 61 74 74 65 6d 70   actually attemp
2af00 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75  t to load or jou
2af10 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e  rnal .    ** con
2af20 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 70 61 67  tent for any pag
2af30 65 20 74 68 61 74 20 72 65 61 6c 6c 79 20 64 6f  e that really do
2af40 65 73 20 6c 69 65 20 70 61 73 74 20 74 68 65 20  es lie past the 
2af50 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62  end of the datab
2af60 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ase.    ** file 
2af70 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68 65 20  on disk. So the 
2af80 65 66 66 65 63 74 73 20 6f 66 20 64 69 73 61 62  effects of disab
2af90 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74  ling the no-cont
2afa0 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ent optimization
2afb0 0a 20 20 20 20 2a 2a 20 68 65 72 65 20 61 72 65  .    ** here are
2afc0 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f   confined to tho
2afd0 73 65 20 70 61 67 65 73 20 74 68 61 74 20 6c 69  se pages that li
2afe0 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 65 6e  e between the en
2aff0 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
2b000 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 61  database image a
2b010 6e 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  nd the end of th
2b020 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2b030 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
2b040 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d  bNoContent = (0=
2b050 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74  =IfNotOmitAV(pBt
2b060 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 29 20  ->bDoTruncate)) 
2b070 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  ? PAGER_GET_NOCO
2b080 4e 54 45 4e 54 20 3a 20 30 3b 0a 0a 20 20 20 20  NTENT : 0;..    
2b090 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2b0a0 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
2b0b0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
2b0c0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2b0d0 6e 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e  n rc;.    pBt->n
2b0e0 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Page++;.    if( 
2b0f0 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44  pBt->nPage==PEND
2b100 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2b110 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b  t) ) pBt->nPage+
2b120 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  +;..#ifndef SQLI
2b130 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2b140 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
2b150 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54  autoVacuum && PT
2b160 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
2b170 20 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a   pBt->nPage) ){.
2b180 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67        /* If *pPg
2b190 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70  no refers to a p
2b1a0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
2b1b0 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65   allocate two ne
2b1c0 77 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a  w pages.      **
2b1d0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
2b1e0 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  he file instead 
2b1f0 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73  of one. The firs
2b200 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  t allocated page
2b210 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65  .      ** become
2b220 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d  s a new pointer-
2b230 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65  map page, the se
2b240 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20  cond is used by 
2b250 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20  the caller..    
2b260 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61    */.      MemPa
2b270 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20  ge *pPg = 0;.   
2b280 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
2b290 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
2b2a0 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65   of file (pointe
2b2b0 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20  r-map page)\n", 
2b2c0 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20  pBt->nPage));.  
2b2d0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
2b2e0 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f  >nPage!=PENDING_
2b2f0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
2b300 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  ;.      rc = btr
2b310 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
2b320 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c  Bt->nPage, &pPg,
2b330 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20   bNoContent);.  
2b340 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2b350 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2b360 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2b370 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62  erWrite(pPg->pDb
2b380 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
2b390 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b  eleasePage(pPg);
2b3a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2b3b0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2b3c0 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  c;.      pBt->nP
2b3d0 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  age++;.      if(
2b3e0 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e   pBt->nPage==PEN
2b3f0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
2b400 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67  Bt) ){ pBt->nPag
2b410 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e  e++; }.    }.#en
2b420 64 69 66 0a 20 20 20 20 70 75 74 34 62 79 74 65  dif.    put4byte
2b430 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e  (28 + (u8*)pBt->
2b440 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70  pPage1->aData, p
2b450 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
2b460 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50  *pPgno = pBt->nP
2b470 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  age;..    assert
2b480 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
2b490 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2b4a0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   );.    rc = btr
2b4b0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a  eeGetPage(pBt, *
2b4c0 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62  pPgno, ppPage, b
2b4d0 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  NoContent);.    
2b4e0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2b4f0 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
2b500 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
2b510 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
2b520 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
2b530 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b540 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
2b550 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  ppPage);.    }. 
2b560 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
2b570 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
2b580 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50   of file\n", *pP
2b590 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  gno));.  }..  as
2b5a0 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
2b5b0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2b5c0 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c  pBt) );..end_all
2b5d0 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65  ocate_page:.  re
2b5e0 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
2b5f0 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
2b600 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
2b610 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b620 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  K ){.    if( sql
2b630 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
2b640 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
2b650 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20  >pDbPage)>1 ){. 
2b660 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2b670 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
2b680 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2b690 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2b6a0 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29   }.    (*ppPage)
2b6b0 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
2b6c0 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61  }else{.    *ppPa
2b6d0 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  ge = 0;.  }.  as
2b6e0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
2b6f0 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  _OK || sqlite3Pa
2b700 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 28  gerIswriteable((
2b710 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
2b720 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e) );.  return r
2b730 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
2b740 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
2b750 64 20 74 6f 20 61 64 64 20 70 61 67 65 20 69 50  d to add page iP
2b760 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
2b770 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69  ase file free-li
2b780 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73  st. .** It is as
2b790 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 70  sumed that the p
2b7a0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
2b7b0 64 79 20 61 20 70 61 72 74 20 6f 66 20 74 68 65  dy a part of the
2b7c0 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a   free-list..**.*
2b7d0 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61 73 73  * The value pass
2b7e0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
2b7f0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
2b800 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70  s function is op
2b810 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68  tional..** If th
2b820 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73  e caller happens
2b830 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74   to have a point
2b840 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  er to the MemPag
2b850 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72  e object .** cor
2b860 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61  responding to pa
2b870 67 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20  ge iPage handy, 
2b880 69 74 20 6d 61 79 20 70 61 73 73 20 69 74 20 61  it may pass it a
2b890 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c  s the second val
2b8a0 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ue. .** Otherwis
2b8b0 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e  e, it may pass N
2b8c0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ULL..**.** If a 
2b8d0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d  pointer to a Mem
2b8e0 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70  Page object is p
2b8f0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
2b900 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  ond argument,.**
2b910 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63   its reference c
2b920 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65  ount is not alte
2b930 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  red by this func
2b940 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
2b950 69 6e 74 20 66 72 65 65 50 61 67 65 32 28 42 74  int freePage2(Bt
2b960 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d  Shared *pBt, Mem
2b970 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20  Page *pMemPage, 
2b980 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d  Pgno iPage){.  M
2b990 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
2b9a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2b9b0 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20     /* Free-list 
2b9c0 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20  trunk page */.  
2b9d0 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b  Pgno iTrunk = 0;
2b9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b9f0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
2ba00 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20  er of free-list 
2ba10 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20  trunk page */ . 
2ba20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
2ba30 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20   = pBt->pPage1; 
2ba40 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65       /* Local re
2ba50 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
2ba60 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  1 */.  MemPage *
2ba70 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  pPage;          
2ba80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2ba90 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20  ge being freed. 
2baa0 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a  May be NULL. */.
2bab0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
2bac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bad0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2bae0 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  Code */.  int nF
2baf0 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ree;            
2bb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bb10 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20   Initial number 
2bb20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65  of pages on free
2bb30 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65  -list */..  asse
2bb40 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2bb50 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
2bb60 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2bb70 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73  iPage>1 );.  ass
2bb80 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c  ert( !pMemPage |
2bb90 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f  | pMemPage->pgno
2bba0 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66  ==iPage );..  if
2bbb0 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20  ( pMemPage ){.  
2bbc0 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61    pPage = pMemPa
2bbd0 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ge;.    sqlite3P
2bbe0 61 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70  agerRef(pPage->p
2bbf0 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  DbPage);.  }else
2bc00 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62 74  {.    pPage = bt
2bc10 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42  reePageLookup(pB
2bc20 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  t, iPage);.  }..
2bc30 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
2bc40 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75  he free page cou
2bc50 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a  nt on pPage1 */.
2bc60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2bc70 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
2bc80 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
2bc90 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70   rc ) goto freep
2bca0 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65  age_out;.  nFree
2bcb0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2bcc0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
2bcd0 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
2bce0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
2bcf0 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28  nFree+1);..  if(
2bd00 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
2bd10 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
2bd20 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  TE ){.    /* If 
2bd30 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74  the secure_delet
2bd40 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62  e option is enab
2bd50 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  led, then.    **
2bd60 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76   always fully ov
2bd70 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20  erwrite deleted 
2bd80 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68  information with
2bd90 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20   zeros..    */. 
2bda0 20 20 20 69 66 28 20 28 21 70 50 61 67 65 20 26     if( (!pPage &
2bdb0 26 20 28 28 72 63 20 3d 20 62 74 72 65 65 47 65  & ((rc = btreeGe
2bdc0 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65  tPage(pBt, iPage
2bdd0 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30  , &pPage, 0))!=0
2bde0 29 20 29 0a 20 20 20 20 20 7c 7c 20 20 20 20 20  ) ).     ||     
2bdf0 20 20 20 20 20 20 20 28 28 72 63 20 3d 20 73 71         ((rc = sq
2be00 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2be10 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29  pPage->pDbPage))
2be20 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0).    ){.    
2be30 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
2be40 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  out;.    }.    m
2be50 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61  emset(pPage->aDa
2be60 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42  ta, 0, pPage->pB
2be70 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
2be80 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  }..  /* If the d
2be90 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
2bea0 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72   auto-vacuum, wr
2beb0 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  ite an entry in 
2bec0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
2bed0 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65    ** to indicate
2bee0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
2bef0 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69  s free..  */.  i
2bf00 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
2bf10 29 7b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  ){.    ptrmapPut
2bf20 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52  (pBt, iPage, PTR
2bf30 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c  MAP_FREEPAGE, 0,
2bf40 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72   &rc);.    if( r
2bf50 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67  c ) goto freepag
2bf60 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e_out;.  }..  /*
2bf70 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20   Now manipulate 
2bf80 74 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62  the actual datab
2bf90 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74  ase free-list st
2bfa0 72 75 63 74 75 72 65 2e 20 54 68 65 72 65 20 61  ructure. There a
2bfb0 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73  re two.  ** poss
2bfc0 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68  ibilities. If th
2bfd0 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63  e free-list is c
2bfe0 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20  urrently empty, 
2bff0 6f 72 20 69 66 20 74 68 65 20 66 69 72 73 74 0a  or if the first.
2c000 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20    ** trunk page 
2c010 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
2c020 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74   is full, then t
2c030 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65  his page will be
2c040 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20  come a.  ** new 
2c050 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
2c060 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  page. Otherwise,
2c070 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   it will become 
2c080 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20  a leaf of the.  
2c090 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70  ** first trunk p
2c0a0 61 67 65 20 69 6e 20 74 68 65 20 63 75 72 72 65  age in the curre
2c0b0 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68  nt free-list. Th
2c0c0 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69  is block tests i
2c0d0 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73  f it.  ** is pos
2c0e0 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65  sible to add the
2c0f0 20 70 61 67 65 20 61 73 20 61 20 6e 65 77 20 66   page as a new f
2c100 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20  ree-list leaf.. 
2c110 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21   */.  if( nFree!
2c120 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c  =0 ){.    u32 nL
2c130 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
2c140 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e      /* Initial n
2c150 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65  umber of leaf ce
2c160 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67  lls on trunk pag
2c170 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b  e */..    iTrunk
2c180 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2c190 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b  ge1->aData[32]);
2c1a0 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
2c1b0 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  etPage(pBt, iTru
2c1c0 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  nk, &pTrunk, 0);
2c1d0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2c1e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2c1f0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
2c200 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c  t;.    }..    nL
2c210 65 61 66 20 3d 20 67 65 74 34 62 79 74 65 28 26  eaf = get4byte(&
2c220 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
2c230 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2c240 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33  Bt->usableSize>3
2c250 32 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65  2 );.    if( nLe
2c260 61 66 20 3e 20 28 75 33 32 29 70 42 74 2d 3e 75  af > (u32)pBt->u
2c270 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20  sableSize/4 - 2 
2c280 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
2c290 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2c2a0 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  T;.      goto fr
2c2b0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
2c2c0 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20  }.    if( nLeaf 
2c2d0 3c 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62  < (u32)pBt->usab
2c2e0 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a  leSize/4 - 8 ){.
2c2f0 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73        /* In this
2c300 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20 72   case there is r
2c310 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  oom on the trunk
2c320 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20   page to insert 
2c330 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a  the page.      *
2c340 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73  * being freed as
2c350 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20   a new leaf..   
2c360 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e     **.      ** N
2c370 6f 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75  ote that the tru
2c380 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72  nk page is not r
2c390 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c  eally full until
2c3a0 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20   it contains.   
2c3b0 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65     ** usableSize
2c3c0 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20  /4 - 2 entries, 
2c3d0 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34  not usableSize/4
2c3e0 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20   - 8 entries as 
2c3f0 77 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a  we have.      **
2c400 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65   coded.  But due
2c410 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72   to a coding err
2c420 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f  or in versions o
2c430 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74  f SQLite prior t
2c440 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30  o.      ** 3.6.0
2c450 2c 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  , databases with
2c460 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
2c470 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f  pages holding mo
2c480 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a  re than.      **
2c490 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
2c4a0 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62  8 entries will b
2c4b0 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f  e reported as co
2c4c0 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72  rrupt.  In order
2c4d0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69  .      ** to mai
2c4e0 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20  ntain backwards 
2c4f0 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69  compatibility wi
2c500 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  th older version
2c510 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20  s of SQLite,.   
2c520 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f     ** we will co
2c530 6e 74 69 6e 75 65 20 74 6f 20 72 65 73 74 72 69  ntinue to restri
2c540 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ct the number of
2c550 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62   entries to usab
2c560 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20  leSize/4 - 8.   
2c570 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20     ** for now.  
2c580 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  At some point in
2c590 20 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63   the future (onc
2c5a0 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75  e everyone has u
2c5b0 70 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a  pgraded.      **
2c5c0 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74   to 3.6.0 or lat
2c5d0 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f  er) we should co
2c5e0 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68  nsider fixing th
2c5f0 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62  e conditional ab
2c600 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ove.      ** to 
2c610 72 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65  read "usableSize
2c620 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66  /4-2" instead of
2c630 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38   "usableSize/4-8
2c640 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
2c650 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2c660 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
2c670 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2c680 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c690 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  OK ){.        pu
2c6a0 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
2c6b0 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b  aData[4], nLeaf+
2c6c0 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  1);.        put4
2c6d0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
2c6e0 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20  ata[8+nLeaf*4], 
2c6f0 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  iPage);.        
2c700 69 66 28 20 70 50 61 67 65 20 26 26 20 28 70 42  if( pPage && (pB
2c710 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
2c720 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29  S_SECURE_DELETE)
2c730 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2c740 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
2c750 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  tWrite(pPage->pD
2c760 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2c770 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  }.        rc = b
2c780 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
2c790 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20  t(pBt, iPage);. 
2c7a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
2c7b0 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
2c7c0 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b  %d leaf on trunk
2c7d0 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67   page %d\n",pPag
2c7e0 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e  e->pgno,pTrunk->
2c7f0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f  pgno));.      go
2c800 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
2c810 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2c820 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77   If control flow
2c830 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
2c840 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74   then it was not
2c850 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64   possible to add
2c860 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61   the.  ** the pa
2c870 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 61  ge being freed a
2c880 73 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66  s a leaf page of
2c890 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b   the first trunk
2c8a0 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
2c8b0 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79  t..  ** Possibly
2c8c0 20 62 65 63 61 75 73 65 20 74 68 65 20 66 72 65   because the fre
2c8d0 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c  e-list is empty,
2c8e0 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63   or possibly bec
2c8f0 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66  ause the .  ** f
2c900 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68  irst trunk in th
2c910 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66  e free-list is f
2c920 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c  ull. Either way,
2c930 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
2c940 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20  freed.  ** will 
2c950 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66  become the new f
2c960 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  irst trunk page 
2c970 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
2c980 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
2c990 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f  ge==0 && SQLITE_
2c9a0 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65 47  OK!=(rc = btreeG
2c9b0 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67  etPage(pBt, iPag
2c9c0 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20 29  e, &pPage, 0)) )
2c9d0 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70  {.    goto freep
2c9e0 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72  age_out;.  }.  r
2c9f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2ca00 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
2ca10 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
2ca20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ca30 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
2ca40 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62  out;.  }.  put4b
2ca50 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
2ca60 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74  , iTrunk);.  put
2ca70 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2ca80 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75  ata[4], 0);.  pu
2ca90 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
2caa0 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65  aData[32], iPage
2cab0 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52 45  );.  TRACE(("FRE
2cac0 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74  E-PAGE: %d new t
2cad0 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63  runk page replac
2cae0 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  ing %d\n", pPage
2caf0 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29  ->pgno, iTrunk))
2cb00 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a  ;..freepage_out:
2cb10 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a  .  if( pPage ){.
2cb20 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
2cb30 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c  t = 0;.  }.  rel
2cb40 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
2cb50 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
2cb60 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e  Trunk);.  return
2cb70 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f   rc;.}.static vo
2cb80 69 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50  id freePage(MemP
2cb90 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
2cba0 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70  *pRC){.  if( (*p
2cbb0 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  RC)==SQLITE_OK )
2cbc0 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72 65  {.    *pRC = fre
2cbd0 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70 42  ePage2(pPage->pB
2cbe0 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65 2d  t, pPage, pPage-
2cbf0 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  >pgno);.  }.}../
2cc00 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76  *.** Free any ov
2cc10 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73  erflow pages ass
2cc20 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
2cc30 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a   given Cell..*/.
2cc40 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
2cc50 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
2cc60 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  age, unsigned ch
2cc70 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74  ar *pCell){.  Bt
2cc80 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
2cc90 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c  age->pBt;.  Cell
2cca0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e  Info info;.  Pgn
2ccb0 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e  o ovflPgno;.  in
2ccc0 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66  t rc;.  int nOvf
2ccd0 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50 61 67  l;.  u32 ovflPag
2cce0 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74  eSize;..  assert
2ccf0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2cd00 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2cd10 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 62 74 72  >mutex) );.  btr
2cd20 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
2cd30 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
2cd40 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e  fo);.  if( info.
2cd50 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a  iOverflow==0 ){.
2cd60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2cd70 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65  E_OK;  /* No ove
2cd80 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74  rflow pages. Ret
2cd90 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  urn without doin
2cda0 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20  g anything */.  
2cdb0 7d 0a 20 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e  }.  if( pCell+in
2cdc0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 20 3e  fo.iOverflow+3 >
2cdd0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50   pPage->aData+pP
2cde0 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b  age->maskPage ){
2cdf0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2ce00 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2ce10 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64    /* Cell extend
2ce20 73 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70 61  s past end of pa
2ce30 67 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c  ge */.  }.  ovfl
2ce40 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
2ce50 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
2ce60 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72  rflow]);.  asser
2ce70 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
2ce80 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c  ze > 4 );.  ovfl
2ce90 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  PageSize = pBt->
2cea0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
2ceb0 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e    nOvfl = (info.
2cec0 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e  nPayload - info.
2ced0 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67  nLocal + ovflPag
2cee0 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50  eSize - 1)/ovflP
2cef0 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  ageSize;.  asser
2cf00 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c  t( ovflPgno==0 |
2cf10 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77  | nOvfl>0 );.  w
2cf20 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b  hile( nOvfl-- ){
2cf30 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20  .    Pgno iNext 
2cf40 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  = 0;.    MemPage
2cf50 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20   *pOvfl = 0;.   
2cf60 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20   if( ovflPgno<2 
2cf70 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65  || ovflPgno>btre
2cf80 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
2cf90 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73  ){.      /* 0 is
2cfa0 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67   not a legal pag
2cfb0 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67  e number and pag
2cfc0 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e  e 1 cannot be an
2cfd0 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66   .      ** overf
2cfe0 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65 66  low page. Theref
2cff0 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c  ore if ovflPgno<
2d000 32 20 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e  2 or past the en
2d010 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20  d of the .      
2d020 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74 61  ** file the data
2d030 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72  base must be cor
2d040 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72  rupt. */.      r
2d050 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2d060 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
2d070 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29  .    if( nOvfl )
2d080 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74  {.      rc = get
2d090 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
2d0a0 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76  , ovflPgno, &pOv
2d0b0 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20  fl, &iNext);.   
2d0c0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2d0d0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
2d0e0 20 20 69 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c    if( ( pOvfl ||
2d0f0 20 28 28 70 4f 76 66 6c 20 3d 20 62 74 72 65 65   ((pOvfl = btree
2d100 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
2d110 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29  ovflPgno))!=0) )
2d120 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33  .     && sqlite3
2d130 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
2d140 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  t(pOvfl->pDbPage
2d150 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20 20  )!=1.    ){.    
2d160 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
2d170 20 72 65 61 73 6f 6e 20 61 6e 79 20 63 75 72 73   reason any curs
2d180 6f 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  or should have a
2d190 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  n outstanding re
2d1a0 66 65 72 65 6e 63 65 20 0a 20 20 20 20 20 20 2a  ference .      *
2d1b0 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  * to an overflow
2d1c0 20 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20   page belonging 
2d1d0 74 6f 20 61 20 63 65 6c 6c 20 74 68 61 74 20 69  to a cell that i
2d1e0 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2f  s being deleted/
2d1f0 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 2a  updated..      *
2d200 2a 20 53 6f 20 69 66 20 74 68 65 72 65 20 65 78  * So if there ex
2d210 69 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ists more than o
2d220 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ne reference to 
2d230 74 68 69 73 20 70 61 67 65 2c 20 74 68 65 6e 20  this page, then 
2d240 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73  it .      ** mus
2d250 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20  t not really be 
2d260 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
2d270 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
2d280 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
2d290 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 74 20  t. .      ** It 
2d2a0 69 73 20 68 65 6c 70 66 75 6c 20 74 6f 20 64 65  is helpful to de
2d2b0 74 65 63 74 20 74 68 69 73 20 62 65 66 6f 72 65  tect this before
2d2c0 20 63 61 6c 6c 69 6e 67 20 66 72 65 65 50 61 67   calling freePag
2d2d0 65 32 28 29 2c 20 61 73 20 0a 20 20 20 20 20 20  e2(), as .      
2d2e0 2a 2a 20 66 72 65 65 50 61 67 65 32 28 29 20 6d  ** freePage2() m
2d2f0 61 79 20 7a 65 72 6f 20 74 68 65 20 70 61 67 65  ay zero the page
2d300 20 63 6f 6e 74 65 6e 74 73 20 69 66 20 73 65 63   contents if sec
2d310 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20  ure-delete mode 
2d320 69 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62  is.      ** enab
2d330 6c 65 64 2e 20 49 66 20 74 68 69 73 20 27 6f 76  led. If this 'ov
2d340 65 72 66 6c 6f 77 27 20 70 61 67 65 20 68 61 70  erflow' page hap
2d350 70 65 6e 73 20 74 6f 20 62 65 20 61 20 70 61 67  pens to be a pag
2d360 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
2d370 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20 69 74   ** caller is it
2d380 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
2d390 6f 72 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65  or using in some
2d3a0 20 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73   other way, this
2d3b0 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65  .      ** can be
2d3c0 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20   problematic..  
2d3d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
2d3e0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2d3f0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
2d400 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72 65  {.      rc = fre
2d410 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66  ePage2(pBt, pOvf
2d420 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20  l, ovflPgno);.  
2d430 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 76    }..    if( pOv
2d440 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  fl ){.      sqli
2d450 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f  te3PagerUnref(pO
2d460 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  vfl->pDbPage);. 
2d470 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
2d480 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2d490 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78   ovflPgno = iNex
2d4a0 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
2d4b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2d4c0 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62  .** Create the b
2d4d0 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65  yte sequence use
2d4e0 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61  d to represent a
2d4f0 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50   cell on page pP
2d500 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  age.** and write
2d510 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65   that byte seque
2d520 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d  nce into pCell[]
2d530 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  .  Overflow page
2d540 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  s are.** allocat
2d550 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e  ed and filled in
2d560 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20   as necessary.  
2d570 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  The calling proc
2d580 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70  edure.** is resp
2d590 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69  onsible for maki
2d5a0 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65  ng sure sufficie
2d5b0 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65  nt space has bee
2d5c0 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66  n allocated.** f
2d5d0 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a  or pCell[]..**.*
2d5e0 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c  * Note that pCel
2d5f0 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73  l does not neces
2d600 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69  sary need to poi
2d610 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d  nt to the pPage-
2d620 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20  >aData.** area. 
2d630 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69   pCell might poi
2d640 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f  nt to some tempo
2d650 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54  rary storage.  T
2d660 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20  he cell will.** 
2d670 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  be constructed i
2d680 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  n this temporary
2d690 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65   area then copie
2d6a0 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  d into pPage->aD
2d6b0 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f  ata.** later..*/
2d6c0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
2d6d0 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  InCell(.  MemPag
2d6e0 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
2d6f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2d700 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
2d710 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ns the cell */. 
2d720 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2d730 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
2d740 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74  /* Complete text
2d750 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a   of the cell */.
2d760 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
2d770 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  ey, i64 nKey,   
2d780 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20   /* The key */. 
2d790 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61   const void *pDa
2d7a0 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20  ta,int nData,   
2d7b0 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20  /* The data */. 
2d7c0 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20   int nZero,     
2d7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d7e0 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79  /* Extra zero by
2d7f0 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f  tes to append to
2d800 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20   pData */.  int 
2d810 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20  *pnSize         
2d820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
2d830 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65  ite cell size he
2d840 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
2d850 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74  Payload;.  const
2d860 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74   u8 *pSrc;.  int
2d870 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20   nSrc, n, rc;.  
2d880 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20  int spaceLeft;. 
2d890 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20   MemPage *pOvfl 
2d8a0 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
2d8b0 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a  pToRelease = 0;.
2d8c0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2d8d0 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67  *pPrior;.  unsig
2d8e0 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f  ned char *pPaylo
2d8f0 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ad;.  BtShared *
2d900 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
2d910 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66  ;.  Pgno pgnoOvf
2d920 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65  l = 0;.  int nHe
2d930 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f  ader;.  CellInfo
2d940 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74   info;..  assert
2d950 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2d960 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2d970 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
2d980 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65   pPage is not ne
2d990 63 65 73 73 61 72 69 6c 79 20 77 72 69 74 65 61  cessarily writea
2d9a0 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20  ble since pCell 
2d9b0 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c 69 61  might be auxilia
2d9c0 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73  ry.  ** buffer s
2d9d0 70 61 63 65 20 74 68 61 74 20 69 73 20 73 65 70  pace that is sep
2d9e0 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70  arate from the p
2d9f0 50 61 67 65 20 62 75 66 66 65 72 20 61 72 65 61  Page buffer area
2da00 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43   */.  assert( pC
2da10 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  ell<pPage->aData
2da20 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67   || pCell>=&pPag
2da30 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
2da40 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
2da50 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
2da60 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2da70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
2da80 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
2da90 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  the header. */. 
2daa0 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20   nHeader = 0;.  
2dab0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2dac0 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
2dad0 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20  += 4;.  }.  if( 
2dae0 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29  pPage->hasData )
2daf0 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d  {.    nHeader +=
2db00 20 70 75 74 56 61 72 69 6e 74 33 32 28 26 70 43   putVarint32(&pC
2db10 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44  ell[nHeader], nD
2db20 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65  ata+nZero);.  }e
2db30 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d  lse{.    nData =
2db40 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a   nZero = 0;.  }.
2db50 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
2db60 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
2db70 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
2db80 6e 4b 65 79 29 3b 0a 20 20 62 74 72 65 65 50 61  nKey);.  btreePa
2db90 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
2dba0 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
2dbb0 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
2dbc0 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72  nHeader==nHeader
2dbd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e   );.  assert( in
2dbe0 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b  fo.nKey==nKey );
2dbf0 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
2dc00 6e 44 61 74 61 3d 3d 28 75 33 32 29 28 6e 44 61  nData==(u32)(nDa
2dc10 74 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a  ta+nZero) );.  .
2dc20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
2dc30 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50   payload */.  nP
2dc40 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b  ayload = nData +
2dc50 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50   nZero;.  if( pP
2dc60 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
2dc70 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
2dc80 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74  .    nSrc = nDat
2dc90 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30  a;.    nData = 0
2dca0 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20  ;.  }else{ .    
2dcb0 69 66 28 20 4e 45 56 45 52 28 6e 4b 65 79 3e 30  if( NEVER(nKey>0
2dcc0 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70 4b 65  x7fffffff || pKe
2dcd0 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 72  y==0) ){.      r
2dce0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2dcf0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
2dd00 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d  .    nPayload +=
2dd10 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20   (int)nKey;.    
2dd20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20  pSrc = pKey;.   
2dd30 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65   nSrc = (int)nKe
2dd40 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65  y;.  }.  *pnSize
2dd50 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20   = info.nSize;. 
2dd60 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66   spaceLeft = inf
2dd70 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79  o.nLocal;.  pPay
2dd80 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48  load = &pCell[nH
2dd90 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72  eader];.  pPrior
2dda0 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69   = &pCell[info.i
2ddb0 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68  Overflow];..  wh
2ddc0 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20  ile( nPayload>0 
2ddd0 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65  ){.    if( space
2dde0 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64  Left==0 ){.#ifnd
2ddf0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2de00 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
2de10 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20  Pgno pgnoPtrmap 
2de20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f  = pgnoOvfl; /* O
2de30 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
2de40 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70  nter-map entry p
2de50 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  age */.      if(
2de60 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
2de70 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a   ){.        do{.
2de80 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76            pgnoOv
2de90 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20  fl++;.        } 
2dea0 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20  while( .        
2deb0 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28    PTRMAP_ISPAGE(
2dec0 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c  pBt, pgnoOvfl) |
2ded0 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44  | pgnoOvfl==PEND
2dee0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2def0 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  t) .        );. 
2df00 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2df10 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
2df20 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
2df30 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66  &pOvfl, &pgnoOvf
2df40 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b  l, pgnoOvfl, 0);
2df50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2df60 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2df70 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2df80 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
2df90 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61  s auto-vacuum, a
2dfa0 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72  nd the second or
2dfb0 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20   subsequent.    
2dfc0 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
2dfd0 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f  ge is being allo
2dfe0 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e  cated, add an en
2dff0 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74  try to the point
2e000 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20  er-map.      ** 
2e010 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f  for that page no
2e020 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  w. .      **.   
2e030 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
2e040 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
2e050 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77  low page, then w
2e060 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20 65  rite a partial e
2e070 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74  ntry .      ** t
2e080 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
2e090 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20 6e  p. If we write n
2e0a0 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70  othing to this p
2e0b0 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c  ointer-map slot,
2e0c0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  .      ** then t
2e0d0 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76  he optimistic ov
2e0e0 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f  erflow chain pro
2e0f0 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72  cessing in clear
2e100 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20  Cell().      ** 
2e110 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74  may misinterpret
2e120 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a   the uninitializ
2e130 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65  ed values and de
2e140 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a  lete the.      *
2e150 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72  * wrong pages fr
2e160 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
2e170 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2e180 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
2e190 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  uum && rc==SQLIT
2e1a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2e1b0 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f  u8 eType = (pgno
2e1c0 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56  Ptrmap?PTRMAP_OV
2e1d0 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f  ERFLOW2:PTRMAP_O
2e1e0 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20  VERFLOW1);.     
2e1f0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
2e200 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70  , pgnoOvfl, eTyp
2e210 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26  e, pgnoPtrmap, &
2e220 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rc);.        if(
2e230 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
2e240 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76   releasePage(pOv
2e250 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  fl);.        }. 
2e260 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2e270 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2e280 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2e290 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
2e2a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2e2b0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2e2c0 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
2e2d0 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
2e2e0 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73  an pPrior points
2e2f0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61   into the data a
2e300 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  rea.      ** of 
2e310 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
2e320 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
2e330 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
2e340 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61  able. */.      a
2e350 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73  ssert( pToReleas
2e360 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  e==0 || sqlite3P
2e370 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2e380 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50  pToRelease->pDbP
2e390 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f  age) );..      /
2e3a0 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20 70  * If pPrior is p
2e3b0 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
2e3c0 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74  area of pPage, t
2e3d0 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50  hen make sure pP
2e3e0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
2e3f0 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20  still writeable 
2e400 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
2e410 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61   pPrior<pPage->a
2e420 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d  Data || pPrior>=
2e430 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
2e440 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
2e450 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
2e460 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2e470 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
2e480 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75  ge) );..      pu
2e490 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70  t4byte(pPrior, p
2e4a0 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  gnoOvfl);.      
2e4b0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
2e4c0 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70  elease);.      p
2e4d0 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66  ToRelease = pOvf
2e4e0 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20  l;.      pPrior 
2e4f0 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a  = pOvfl->aData;.
2e500 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
2e510 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20  Prior, 0);.     
2e520 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76   pPayload = &pOv
2e530 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20  fl->aData[4];.  
2e540 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
2e550 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2e560 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  - 4;.    }.    n
2e570 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   = nPayload;.   
2e580 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74   if( n>spaceLeft
2e590 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74   ) n = spaceLeft
2e5a0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f  ;..    /* If pTo
2e5b0 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a  Release is not z
2e5c0 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61  ero than pPayloa
2e5d0 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68  d points into th
2e5e0 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20  e data area.    
2e5f0 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65  ** of pToRelease
2e600 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f  .  Make sure pTo
2e610 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c  Release is still
2e620 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20   writeable. */. 
2e630 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
2e640 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
2e650 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2e660 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
2e670 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
2e680 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20   /* If pPayload 
2e690 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
2e6a0 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
2e6b0 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
2e6c0 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69  e pPage.    ** i
2e6d0 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
2e6e0 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  e */.    assert(
2e6f0 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d   pPayload<pPage-
2e700 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f  >aData || pPaylo
2e710 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  ad>=&pPage->aDat
2e720 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
2e730 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
2e740 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2e750 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2e760 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
2e770 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20  if( nSrc>0 ){.  
2e780 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29      if( n>nSrc )
2e790 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20   n = nSrc;.     
2e7a0 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b   assert( pSrc );
2e7b0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50  .      memcpy(pP
2e7c0 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29  ayload, pSrc, n)
2e7d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2e7e0 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f     memset(pPaylo
2e7f0 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d  ad, 0, n);.    }
2e800 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d  .    nPayload -=
2e810 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64   n;.    pPayload
2e820 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20   += n;.    pSrc 
2e830 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d  += n;.    nSrc -
2e840 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65  = n;.    spaceLe
2e850 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28  ft -= n;.    if(
2e860 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20   nSrc==0 ){.    
2e870 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
2e880 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 44 61        pSrc = pDa
2e890 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ta;.    }.  }.  
2e8a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
2e8b0 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72  elease);.  retur
2e8c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2e8d0 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
2e8e0 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20   i-th cell from 
2e8f0 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75  pPage.  This rou
2e900 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61  tine effects pPa
2e910 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20  ge only..** The 
2e920 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20  cell content is 
2e930 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61  not freed or dea
2e940 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73  llocated.  It is
2e950 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
2e960 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
2e970 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65  t has been copie
2e980 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65  d someplace else
2e990 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2e9a0 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20  just.** removes 
2e9b0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  the reference to
2e9c0 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70   the cell from p
2e9d0 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22  Page..**.** "sz"
2e9e0 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d   must be the num
2e9f0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
2ea00 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  the cell..*/.sta
2ea10 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c  tic void dropCel
2ea20 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
2ea30 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73  , int idx, int s
2ea40 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  z, int *pRC){.  
2ea50 75 33 32 20 70 63 3b 20 20 20 20 20 20 20 20 20  u32 pc;         
2ea60 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c  /* Offset to cel
2ea70 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c  l content of cel
2ea80 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20  l being deleted 
2ea90 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
2eaa0 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61       /* pPage->a
2eab0 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74  Data */.  u8 *pt
2eac0 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  r;        /* Use
2ead0 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20  d to move bytes 
2eae0 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61  around within da
2eaf0 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ta[] */.  int rc
2eb00 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
2eb10 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
2eb20 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
2eb30 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f    /* Beginning o
2eb40 66 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 30  f the header.  0
2eb50 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31 30   most pages.  10
2eb60 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69  0 page 1 */..  i
2eb70 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
2eb80 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  ;..  assert( idx
2eb90 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67 65  >=0 && idx<pPage
2eba0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
2ebb0 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a  ert( sz==cellSiz
2ebc0 65 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b  e(pPage, idx) );
2ebd0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ebe0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2ebf0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2ec00 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
2ec10 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2ec20 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
2ec30 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20  utex) );.  data 
2ec40 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
2ec50 20 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e    ptr = &pPage->
2ec60 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b  aCellIdx[2*idx];
2ec70 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  .  pc = get2byte
2ec80 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70  (ptr);.  hdr = p
2ec90 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
2eca0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d  .  testcase( pc=
2ecb0 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
2ecc0 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73  hdr+5]) );.  tes
2ecd0 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50  tcase( pc+sz==pP
2ece0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
2ecf0 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63  Size );.  if( pc
2ed00 20 3c 20 28 75 33 32 29 67 65 74 32 62 79 74 65   < (u32)get2byte
2ed10 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c  (&data[hdr+5]) |
2ed20 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d  | pc+sz > pPage-
2ed30 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
2ed40 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53   ){.    *pRC = S
2ed50 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2ed60 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
2ed70 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53    }.  rc = freeS
2ed80 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20  pace(pPage, pc, 
2ed90 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  sz);.  if( rc ){
2eda0 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a  .    *pRC = rc;.
2edb0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
2edc0 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d    pPage->nCell--
2edd0 3b 0a 20 20 6d 65 6d 6d 6f 76 65 28 70 74 72 2c  ;.  memmove(ptr,
2ede0 20 70 74 72 2b 32 2c 20 32 2a 28 70 50 61 67 65   ptr+2, 2*(pPage
2edf0 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78 29 29 3b  ->nCell - idx));
2ee00 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
2ee10 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d  a[hdr+3], pPage-
2ee20 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65  >nCell);.  pPage
2ee30 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 7d 0a  ->nFree += 2;.}.
2ee40 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20  ./*.** Insert a 
2ee50 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67  new cell on pPag
2ee60 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20  e at cell index 
2ee70 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e  "i".  pCell poin
2ee80 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e  ts to the.** con
2ee90 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tent of the cell
2eea0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
2eeb0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c  ell content will
2eec0 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65   fit on the page
2eed0 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68  , then put it th
2eee0 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77  ere.  If it.** w
2eef0 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65  ill not fit, the
2ef00 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  n make a copy of
2ef10 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
2ef20 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a  t into pTemp if.
2ef30 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20  ** pTemp is not 
2ef40 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73  null.  Regardles
2ef50 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f  s of pTemp, allo
2ef60 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79  cate a new entry
2ef70 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 70  .** in pPage->ap
2ef80 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20  Ovfl[] and make 
2ef90 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  it point to the 
2efa0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69  cell content (ei
2efb0 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70  ther.** in pTemp
2efc0 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   or the original
2efd0 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f   pCell) and also
2efe0 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65   record its inde
2eff0 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e  x. .** Allocatin
2f000 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  g a new entry in
2f010 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20   pPage->aCell[] 
2f020 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a  implies that .**
2f030 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2f040 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  w is incremented
2f050 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70  ..**.** If nSkip
2f060 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
2f070 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74  en do not copy t
2f080 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62  he first nSkip b
2f090 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63  ytes of the.** c
2f0a0 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ell. The caller 
2f0b0 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74  will overwrite t
2f0c0 68 65 6d 20 61 66 74 65 72 20 74 68 69 73 20 66  hem after this f
2f0d0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
2f0e0 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20   If.** nSkip is 
2f0f0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70  non-zero, then p
2f100 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69  Cell may not poi
2f110 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  nt to an invalid
2f120 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
2f130 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b   .** (but pCell+
2f140 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20  nSkip is always 
2f150 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  valid)..*/.stati
2f160 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c  c void insertCel
2f170 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
2f180 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69  age,   /* Page i
2f190 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65  nto which we are
2f1a0 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e   copying */.  in
2f1b0 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  t i,            
2f1c0 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f  /* New cell beco
2f1d0 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c  mes the i-th cel
2f1e0 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  l of the page */
2f1f0 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
2f200 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
2f210 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20  of the new cell 
2f220 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20  */.  int sz,    
2f230 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
2f240 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43  of content in pC
2f250 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65  ell */.  u8 *pTe
2f260 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65  mp,        /* Te
2f270 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65  mp storage space
2f280 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e   for pCell, if n
2f290 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20  eeded */.  Pgno 
2f2a0 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20  iChild,      /* 
2f2b0 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70  If non-zero, rep
2f2c0 6c 61 63 65 20 66 69 72 73 74 20 34 20 62 79 74  lace first 4 byt
2f2d0 65 73 20 77 69 74 68 20 74 68 69 73 20 76 61 6c  es with this val
2f2e0 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43  ue */.  int *pRC
2f2f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
2f300 64 20 61 6e 64 20 77 72 69 74 65 20 72 65 74 75  d and write retu
2f310 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72  rn code from her
2f320 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64  e */.){.  int id
2f330 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57  x = 0;      /* W
2f340 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65  here to write ne
2f350 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  w cell content i
2f360 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
2f370 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
2f380 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
2f390 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20  */.  int end;   
2f3a0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
2f3b0 62 79 74 65 20 70 61 73 74 20 74 68 65 20 6c 61  byte past the la
2f3c0 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
2f3d0 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
2f3e0 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20  nt ins;         
2f3f0 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74   /* Index in dat
2f400 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65  a[] where new ce
2f410 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e  ll pointer is in
2f420 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  serted */.  int 
2f430 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a  cellOffset;   /*
2f440 20 41 64 64 72 65 73 73 20 6f 66 20 66 69 72 73   Address of firs
2f450 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  t cell pointer i
2f460 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38  n data[] */.  u8
2f470 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
2f480 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f  /* The content o
2f490 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65  f the whole page
2f4a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6b 69 70 20   */.  int nSkip 
2f4b0 3d 20 28 69 43 68 69 6c 64 20 3f 20 34 20 3a 20  = (iChild ? 4 : 
2f4c0 30 29 3b 0a 0a 20 20 69 66 28 20 2a 70 52 43 20  0);..  if( *pRC 
2f4d0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
2f4e0 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d  ert( i>=0 && i<=
2f4f0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61  pPage->nCell+pPa
2f500 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b  ge->nOverflow );
2f510 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2f520 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c  ->nCell<=MX_CELL
2f530 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20  (pPage->pBt) && 
2f540 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
2f550 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20  Bt)<=10921 );.  
2f560 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2f570 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53  Overflow<=ArrayS
2f580 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66  ize(pPage->apOvf
2f590 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
2f5a0 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d  ArraySize(pPage-
2f5b0 3e 61 70 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53  >apOvfl)==ArrayS
2f5c0 69 7a 65 28 70 50 61 67 65 2d 3e 61 69 4f 76 66  ize(pPage->aiOvf
2f5d0 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
2f5e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2f5f0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
2f600 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68  utex) );.  /* Th
2f610 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f  e cell should no
2f620 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65 64 20  rmally be sized 
2f630 63 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f 77 65  correctly.  Howe
2f640 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67  ver, when moving
2f650 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65   a.  ** malforme
2f660 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65  d cell from a le
2f670 61 66 20 70 61 67 65 20 74 6f 20 61 6e 20 69 6e  af page to an in
2f680 74 65 72 69 6f 72 20 70 61 67 65 2c 20 69 66 20  terior page, if 
2f690 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20  the cell size.  
2f6a0 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20 62 65 20  ** wanted to be 
2f6b0 6c 65 73 73 20 74 68 61 6e 20 34 20 62 75 74 20  less than 4 but 
2f6c0 67 6f 74 20 72 6f 75 6e 64 65 64 20 75 70 20 74  got rounded up t
2f6d0 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c  o 4 on the leaf,
2f6e0 20 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20   then size.  ** 
2f6f0 6d 69 67 68 74 20 62 65 20 6c 65 73 73 20 74 68  might be less th
2f700 61 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a 65 20  an 8 (leaf-size 
2f710 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68  + pointer) on th
2f720 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e  e interior node.
2f730 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65    Hence.  ** the
2f740 20 74 65 72 6d 20 61 66 74 65 72 20 74 68 65 20   term after the 
2f750 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  || in the follow
2f760 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 2a 2f  ing assert(). */
2f770 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63  .  assert( sz==c
2f780 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
2f790 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d  , pCell) || (sz=
2f7a0 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30 29 20  =8 && iChild>0) 
2f7b0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
2f7c0 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b  nOverflow || sz+
2f7d0 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  2>pPage->nFree )
2f7e0 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 20  {.    if( pTemp 
2f7f0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
2f800 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65  pTemp+nSkip, pCe
2f810 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b  ll+nSkip, sz-nSk
2f820 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  ip);.      pCell
2f830 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a   = pTemp;.    }.
2f840 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29      if( iChild )
2f850 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  {.      put4byte
2f860 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b  (pCell, iChild);
2f870 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70  .    }.    j = p
2f880 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b  Page->nOverflow+
2f890 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  +;.    assert( j
2f8a0 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50  <(int)(sizeof(pP
2f8b0 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2f 73 69 7a  age->apOvfl)/siz
2f8c0 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66  eof(pPage->apOvf
2f8d0 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50  l[0])) );.    pP
2f8e0 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d  age->apOvfl[j] =
2f8f0 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67   pCell;.    pPag
2f900 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28  e->aiOvfl[j] = (
2f910 75 31 36 29 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a  u16)i;.  }else{.
2f920 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
2f930 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2f940 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
2f950 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2f960 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a  TE_OK ){.      *
2f970 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  pRC = rc;.      
2f980 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
2f990 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2f9a0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2f9b0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2f9c0 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20  ) );.    data = 
2f9d0 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
2f9e0 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
2f9f0 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
2fa00 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c  ;.    end = cell
2fa10 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
2fa20 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 73  ->nCell;.    ins
2fa30 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
2fa40 32 2a 69 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c  2*i;.    rc = al
2fa50 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67  locateSpace(pPag
2fa60 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20  e, sz, &idx);.  
2fa70 20 20 69 66 28 20 72 63 20 29 7b 20 2a 70 52 43    if( rc ){ *pRC
2fa80 20 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d   = rc; return; }
2fa90 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f  .    /* The allo
2faa0 63 61 74 65 53 70 61 63 65 28 29 20 72 6f 75 74  cateSpace() rout
2fab0 69 6e 65 20 67 75 61 72 61 6e 74 65 65 73 20 74  ine guarantees t
2fac0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f  he following two
2fad0 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20 20   properties.    
2fae0 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e 73  ** if it returns
2faf0 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 20 20   success */.    
2fb00 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20 65  assert( idx >= e
2fb10 6e 64 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65  nd+2 );.    asse
2fb20 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20 28 69  rt( idx+sz <= (i
2fb30 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  nt)pPage->pBt->u
2fb40 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
2fb50 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b   pPage->nCell++;
2fb60 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
2fb70 65 20 2d 3d 20 28 75 31 36 29 28 32 20 2b 20 73  e -= (u16)(2 + s
2fb80 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  z);.    memcpy(&
2fb90 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c  data[idx+nSkip],
2fba0 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a   pCell+nSkip, sz
2fbb0 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 69 66 28  -nSkip);.    if(
2fbc0 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20   iChild ){.     
2fbd0 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
2fbe0 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20  idx], iChild);. 
2fbf0 20 20 20 7d 0a 20 20 20 20 6d 65 6d 6d 6f 76 65     }.    memmove
2fc00 28 26 64 61 74 61 5b 69 6e 73 2b 32 5d 2c 20 26  (&data[ins+2], &
2fc10 64 61 74 61 5b 69 6e 73 5d 2c 20 65 6e 64 2d 69  data[ins], end-i
2fc20 6e 73 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  ns);.    put2byt
2fc30 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64  e(&data[ins], id
2fc40 78 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  x);.    put2byte
2fc50 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  (&data[pPage->hd
2fc60 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50 61 67  rOffset+3], pPag
2fc70 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66 6e 64  e->nCell);.#ifnd
2fc80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2fc90 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
2fca0 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75  ( pPage->pBt->au
2fcb0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
2fcc0 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61    /* The cell ma
2fcd0 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e  y contain a poin
2fce0 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  ter to an overfl
2fcf0 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20  ow page. If so, 
2fd00 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74  write.      ** t
2fd10 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
2fd20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
2fd30 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
2fd40 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  map..      */.  
2fd50 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66      ptrmapPutOvf
2fd60 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
2fd70 6c 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d 0a 23  l, pRC);.    }.#
2fd80 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  endif.  }.}../*.
2fd90 2a 2a 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66  ** Add a list of
2fda0 20 63 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65   cells to a page
2fdb0 2e 20 20 54 68 65 20 70 61 67 65 20 73 68 6f 75  .  The page shou
2fdc0 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20  ld be initially 
2fdd0 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65  empty..** The ce
2fde0 6c 6c 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  lls are guarante
2fdf0 65 64 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65  ed to fit on the
2fe00 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
2fe10 20 76 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61   void assemblePa
2fe20 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge(.  MemPage *p
2fe30 50 61 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70  Page,   /* The p
2fe40 61 67 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62  age to be assemb
2fe50 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  lied */.  int nC
2fe60 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ell,        /* T
2fe70 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c  he number of cel
2fe80 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69  ls to add to thi
2fe90 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  s page */.  u8 *
2fea0 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a  *apCell,      /*
2feb0 20 50 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c   Pointers to cel
2fec0 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31  l bodies */.  u1
2fed0 36 20 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20  6 *aSize        
2fee0 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20  /* Sizes of the 
2fef0 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  cells */.){.  in
2ff00 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
2ff10 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
2ff20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74  */.  u8 *pCellpt
2ff30 72 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  r;     /* Addres
2ff40 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70  s of next cell p
2ff50 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ointer */.  int 
2ff60 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a  cellbody;     /*
2ff70 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74   Address of next
2ff80 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20   cell body */.  
2ff90 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20  u8 * const data 
2ffa0 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20  = pPage->aData; 
2ffb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2ffc0 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66  ointer to data f
2ffd0 6f 72 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f  or pPage */.  co
2ffe0 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
2fff0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20  age->hdrOffset; 
30000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
30010 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e  set of header on
30020 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73   pPage */.  cons
30030 74 20 69 6e 74 20 6e 55 73 61 62 6c 65 20 3d 20  t int nUsable = 
30040 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
30050 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c  leSize; /* Usabl
30060 65 20 73 69 7a 65 20 6f 66 20 70 61 67 65 20 2a  e size of page *
30070 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
30080 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
30090 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
300a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
300b0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
300c0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
300d0 20 6e 43 65 6c 6c 3e 3d 30 20 26 26 20 6e 43 65   nCell>=0 && nCe
300e0 6c 6c 3c 3d 28 69 6e 74 29 4d 58 5f 43 45 4c 4c  ll<=(int)MX_CELL
300f0 28 70 50 61 67 65 2d 3e 70 42 74 29 0a 20 20 20  (pPage->pBt).   
30100 20 20 20 20 20 20 20 20 20 26 26 20 28 69 6e 74           && (int
30110 29 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e  )MX_CELL(pPage->
30120 70 42 74 29 3c 3d 31 30 39 32 31 29 3b 0a 20 20  pBt)<=10921);.  
30130 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
30140 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
30150 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
30160 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
30170 68 61 74 20 74 68 65 20 70 61 67 65 20 68 61 73  hat the page has
30180 20 6a 75 73 74 20 62 65 65 6e 20 7a 65 72 6f 65   just been zeroe
30190 64 20 62 79 20 7a 65 72 6f 50 61 67 65 28 29 20  d by zeroPage() 
301a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
301b0 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
301c0 20 20 61 73 73 65 72 74 28 20 67 65 74 32 62 79    assert( get2by
301d0 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
301e0 68 64 72 2b 35 5d 29 3d 3d 6e 55 73 61 62 6c 65  hdr+5])==nUsable
301f0 20 29 3b 0a 0a 20 20 70 43 65 6c 6c 70 74 72 20   );..  pCellptr 
30200 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49  = &pPage->aCellI
30210 64 78 5b 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 63  dx[nCell*2];.  c
30220 65 6c 6c 62 6f 64 79 20 3d 20 6e 55 73 61 62 6c  ellbody = nUsabl
30230 65 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 65 6c 6c  e;.  for(i=nCell
30240 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
30250 20 20 20 20 75 31 36 20 73 7a 20 3d 20 61 53 69      u16 sz = aSi
30260 7a 65 5b 69 5d 3b 0a 20 20 20 20 70 43 65 6c 6c  ze[i];.    pCell
30270 70 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20 63 65  ptr -= 2;.    ce
30280 6c 6c 62 6f 64 79 20 2d 3d 20 73 7a 3b 0a 20 20  llbody -= sz;.  
30290 20 20 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c    put2byte(pCell
302a0 70 74 72 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a  ptr, cellbody);.
302b0 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
302c0 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65  [cellbody], apCe
302d0 6c 6c 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 7d 0a  ll[i], sz);.  }.
302e0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
302f0 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b  [hdr+3], nCell);
30300 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
30310 61 5b 68 64 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f  a[hdr+5], cellbo
30320 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  dy);.  pPage->nF
30330 72 65 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20  ree -= (nCell*2 
30340 2b 20 6e 55 73 61 62 6c 65 20 2d 20 63 65 6c 6c  + nUsable - cell
30350 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e  body);.  pPage->
30360 6e 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e 43 65  nCell = (u16)nCe
30370 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ll;.}../*.** The
30380 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d   following param
30390 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20  eters determine 
303a0 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e  how many adjacen
303b0 74 20 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f  t pages get invo
303c0 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c  lved.** in a bal
303d0 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ancing operation
303e0 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d  .  NN is the num
303f0 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73  ber of neighbors
30400 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a   on either side.
30410 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  ** of the page t
30420 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65 20  hat participate 
30430 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
30440 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20   operation.  NB 
30450 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20  is the.** total 
30460 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
30470 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65  that participate
30480 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
30490 74 61 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a  target page and.
304a0 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20  ** NN neighbors 
304b0 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a  on either side..
304c0 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75  **.** The minimu
304d0 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73  m value of NN is
304e0 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20   1 (of course). 
304f0 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61   Increasing NN a
30500 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20  bove 1.** (to 2 
30510 6f 72 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f  or 3) gives a mo
30520 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74  dest improvement
30530 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44   in SELECT and D
30540 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63  ELETE performanc
30550 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65  e.** in exchange
30560 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65   for a larger de
30570 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53  gradation in INS
30580 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 70  ERT and UPDATE p
30590 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54  erformance..** T
305a0 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61  he value of NN a
305b0 70 70 65 61 72 73 20 74 6f 20 67 69 76 65 20 74  ppears to give t
305c0 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 73 20  he best results 
305d0 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66  overall..*/.#def
305e0 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20  ine NN 1        
305f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
30600 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  f neighbors on e
30610 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50  ither side of pP
30620 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  age */.#define N
30630 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20  B (NN*2+1)      
30640 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69  /* Total pages i
30650 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62  nvolved in the b
30660 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e  alance */...#ifn
30670 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
30680 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a  QUICKBALANCE./*.
30690 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20  ** This version 
306a0 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e  of balance() han
306b0 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  dles the common 
306c0 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65  special case whe
306d0 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72  re.** a new entr
306e0 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72  y is being inser
306f0 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65  ted on the extre
30700 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20  me right-end of 
30710 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20  the.** tree, in 
30720 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65  other words, whe
30730 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  n the new entry 
30740 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
30750 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79  largest.** entry
30760 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a   in the tree..**
30770 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74  .** Instead of t
30780 72 79 69 6e 67 20 74 6f 20 62 61 6c 61 6e 63 65  rying to balance
30790 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73   the 3 right-mos
307a0 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75  t leaf pages, ju
307b0 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20  st add.** a new 
307c0 70 61 67 65 20 74 6f 20 74 68 65 20 72 69 67 68  page to the righ
307d0 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20  t-hand side and 
307e0 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20  put the one new 
307f0 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74  entry in.** that
30800 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61   page.  This lea
30810 76 65 73 20 74 68 65 20 72 69 67 68 74 20 73 69  ves the right si
30820 64 65 20 6f 66 20 74 68 65 20 74 72 65 65 20 73  de of the tree s
30830 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c  omewhat.** unbal
30840 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73  anced.  But odds
30850 20 61 72 65 20 74 68 61 74 20 77 65 20 77 69 6c   are that we wil
30860 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e  l be inserting n
30870 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74  ew entries.** at
30880 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66   the end soon af
30890 74 65 72 77 61 72 64 73 20 73 6f 20 74 68 65 20  terwards so the 
308a0 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67  nearly empty pag
308b0 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a  e will quickly.*
308c0 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61  * fill up.  On a
308d0 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50  verage..**.** pP
308e0 61 67 65 20 69 73 20 74 68 65 20 6c 65 61 66 20  age is the leaf 
308f0 70 61 67 65 20 77 68 69 63 68 20 69 73 20 74 68  page which is th
30900 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67  e right-most pag
30910 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a  e in the tree..*
30920 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69 74 73  * pParent is its
30930 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20   parent.  pPage 
30940 6d 75 73 74 20 68 61 76 65 20 61 20 73 69 6e 67  must have a sing
30950 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72  le overflow entr
30960 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c  y.** which is al
30970 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  so the right-mos
30980 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70  t entry on the p
30990 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  age..**.** The p
309a0 53 70 61 63 65 20 62 75 66 66 65 72 20 69 73 20  Space buffer is 
309b0 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20  used to store a 
309c0 74 65 6d 70 6f 72 61 72 79 20 63 6f 70 79 20 6f  temporary copy o
309d0 66 20 74 68 65 20 64 69 76 69 64 65 72 0a 2a 2a  f the divider.**
309e0 20 63 65 6c 6c 20 74 68 61 74 20 77 69 6c 6c 20   cell that will 
309f0 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  be inserted into
30a00 20 70 50 61 72 65 6e 74 2e 20 53 75 63 68 20 61   pParent. Such a
30a10 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
30a20 66 20 61 20 34 0a 2a 2a 20 62 79 74 65 20 70 61  f a 4.** byte pa
30a30 67 65 20 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f 77  ge number follow
30a40 65 64 20 62 79 20 61 20 76 61 72 69 61 62 6c 65  ed by a variable
30a50 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2e   length integer.
30a60 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72   In other.** wor
30a70 64 73 2c 20 61 74 20 6d 6f 73 74 20 31 33 20 62  ds, at most 13 b
30a80 79 74 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20  ytes. Hence the 
30a90 70 53 70 61 63 65 20 62 75 66 66 65 72 20 6d 75  pSpace buffer mu
30aa0 73 74 20 62 65 20 61 74 0a 2a 2a 20 6c 65 61 73  st be at.** leas
30ab0 74 20 31 33 20 62 79 74 65 73 20 69 6e 20 73 69  t 13 bytes in si
30ac0 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
30ad0 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  t balance_quick(
30ae0 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
30af0 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  , MemPage *pPage
30b00 2c 20 75 38 20 2a 70 53 70 61 63 65 29 7b 0a 20  , u8 *pSpace){. 
30b10 20 42 74 53 68 61 72 65 64 20 2a 63 6f 6e 73 74   BtShared *const
30b20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
30b30 74 3b 20 20 20 20 2f 2a 20 42 2d 54 72 65 65 20  t;    /* B-Tree 
30b40 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 4d 65  Database */.  Me
30b50 6d 50 61 67 65 20 2a 70 4e 65 77 3b 20 20 20 20  mPage *pNew;    
30b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b70 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f     /* Newly allo
30b80 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20  cated page */.  
30b90 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
30ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30bb0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
30bc0 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ode */.  Pgno pg
30bd0 6e 6f 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  noNew;          
30be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30bf0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
30c00 70 4e 65 77 20 2a 2f 0a 0a 20 20 61 73 73 65 72  pNew */..  asser
30c10 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
30c20 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
30c30 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
30c40 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
30c50 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
30c60 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20  arent->pDbPage) 
30c70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
30c80 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31  ge->nOverflow==1
30c90 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 65   );..  /* This e
30ca0 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 69  rror condition i
30cb0 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72 69  s now caught pri
30cc0 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20 74  or to reaching t
30cd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
30ce0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
30cf0 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ll==0 ) return S
30d00 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
30d10 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  PT;..  /* Alloca
30d20 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20 54  te a new page. T
30d30 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65  his page will be
30d40 63 6f 6d 65 20 74 68 65 20 72 69 67 68 74 2d 73  come the right-s
30d50 69 62 6c 69 6e 67 20 6f 66 20 0a 20 20 2a 2a 20  ibling of .  ** 
30d60 70 50 61 67 65 2e 20 4d 61 6b 65 20 74 68 65 20  pPage. Make the 
30d70 70 61 72 65 6e 74 20 70 61 67 65 20 77 72 69 74  parent page writ
30d80 61 62 6c 65 2c 20 73 6f 20 74 68 61 74 20 74 68  able, so that th
30d90 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65  e new divider ce
30da0 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69  ll.  ** may be i
30db0 6e 73 65 72 74 65 64 2e 20 49 66 20 62 6f 74 68  nserted. If both
30dc0 20 74 68 65 73 65 20 6f 70 65 72 61 74 69 6f 6e   these operation
30dd0 73 20 61 72 65 20 73 75 63 63 65 73 73 66 75 6c  s are successful
30de0 2c 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a  , proceed..  */.
30df0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
30e00 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
30e10 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30  New, &pgnoNew, 0
30e20 2c 20 30 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  , 0);..  if( rc=
30e30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20  =SQLITE_OK ){.. 
30e40 20 20 20 75 38 20 2a 70 4f 75 74 20 3d 20 26 70     u8 *pOut = &p
30e50 53 70 61 63 65 5b 34 5d 3b 0a 20 20 20 20 75 38  Space[4];.    u8
30e60 20 2a 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d   *pCell = pPage-
30e70 3e 61 70 4f 76 66 6c 5b 30 5d 3b 0a 20 20 20 20  >apOvfl[0];.    
30e80 75 31 36 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c  u16 szCell = cel
30e90 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
30ea0 70 43 65 6c 6c 29 3b 0a 20 20 20 20 75 38 20 2a  pCell);.    u8 *
30eb0 70 53 74 6f 70 3b 0a 0a 20 20 20 20 61 73 73 65  pStop;..    asse
30ec0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
30ed0 49 73 77 72 69 74 65 61 62 6c 65 28 70 4e 65 77  Iswriteable(pNew
30ee0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
30ef0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
30f00 3e 61 44 61 74 61 5b 30 5d 3d 3d 28 50 54 46 5f  >aData[0]==(PTF_
30f10 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44  INTKEY|PTF_LEAFD
30f20 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 20 29 3b  ATA|PTF_LEAF) );
30f30 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e  .    zeroPage(pN
30f40 65 77 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50  ew, PTF_INTKEY|P
30f50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f  TF_LEAFDATA|PTF_
30f60 4c 45 41 46 29 3b 0a 20 20 20 20 61 73 73 65 6d  LEAF);.    assem
30f70 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31 2c  blePage(pNew, 1,
30f80 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c   &pCell, &szCell
30f90 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
30fa0 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
30fb0 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75  cuum database, u
30fc0 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
30fd0 72 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69 74  r map.    ** wit
30fe0 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68  h entries for th
30ff0 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20  e new page, and 
31000 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d  any pointer from
31010 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c   the .    ** cel
31020 6c 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f  l on the page to
31030 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
31040 65 2e 20 49 66 20 65 69 74 68 65 72 20 6f 66 20  e. If either of 
31050 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 6f 70 65  these.    ** ope
31060 72 61 74 69 6f 6e 73 20 66 61 69 6c 73 2c 20 74  rations fails, t
31070 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69  he return code i
31080 73 20 73 65 74 2c 20 62 75 74 20 74 68 65 20 63  s set, but the c
31090 6f 6e 74 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f  ontents.    ** o
310a0 66 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  f the parent pag
310b0 65 20 61 72 65 20 73 74 69 6c 6c 20 6d 61 6e 69  e are still mani
310c0 70 75 6c 61 74 65 64 20 62 79 20 74 68 68 20 63  pulated by thh c
310d0 6f 64 65 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a  ode below..    *
310e0 2a 20 54 68 61 74 20 69 73 20 4f 6b 2c 20 61 74  * That is Ok, at
310f0 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
31100 70 61 72 65 6e 74 20 70 61 67 65 20 69 73 20 67  parent page is g
31110 75 61 72 61 6e 74 65 65 64 20 74 6f 0a 20 20 20  uaranteed to.   
31120 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73   ** be marked as
31130 20 64 69 72 74 79 2e 20 52 65 74 75 72 6e 69 6e   dirty. Returnin
31140 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  g an error code 
31150 77 69 6c 6c 20 63 61 75 73 65 20 61 0a 20 20 20  will cause a.   
31160 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e   ** rollback, un
31170 64 6f 69 6e 67 20 61 6e 79 20 63 68 61 6e 67 65  doing any change
31180 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20 70 61  s made to the pa
31190 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  rent page..    *
311a0 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f  /.    if( ISAUTO
311b0 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
311c0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
311d0 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42  gnoNew, PTRMAP_B
311e0 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70  TREE, pParent->p
311f0 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  gno, &rc);.     
31200 20 69 66 28 20 73 7a 43 65 6c 6c 3e 70 4e 65 77   if( szCell>pNew
31210 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->minLocal ){.  
31220 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f        ptrmapPutO
31230 76 66 6c 50 74 72 28 70 4e 65 77 2c 20 70 43 65  vflPtr(pNew, pCe
31240 6c 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  ll, &rc);.      
31250 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
31260 2a 20 43 72 65 61 74 65 20 61 20 64 69 76 69 64  * Create a divid
31270 65 72 20 63 65 6c 6c 20 74 6f 20 69 6e 73 65 72  er cell to inser
31280 74 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20  t into pParent. 
31290 54 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  The divider cell
312a0 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 73  .    ** consists
312b0 20 6f 66 20 61 20 34 2d 62 79 74 65 20 70 61 67   of a 4-byte pag
312c0 65 20 6e 75 6d 62 65 72 20 28 74 68 65 20 70 61  e number (the pa
312d0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 50 61  ge number of pPa
312e0 67 65 29 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61  ge) and.    ** a
312f0 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
31300 20 6b 65 79 20 76 61 6c 75 65 20 28 77 68 69 63   key value (whic
31310 68 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  h must be the sa
31320 6d 65 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a  me value as the.
31330 20 20 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b      ** largest k
31340 65 79 20 6f 6e 20 70 50 61 67 65 29 2e 0a 20 20  ey on pPage)..  
31350 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f 20 66    **.    ** To f
31360 69 6e 64 20 74 68 65 20 6c 61 72 67 65 73 74 20  ind the largest 
31370 6b 65 79 20 76 61 6c 75 65 20 6f 6e 20 70 50 61  key value on pPa
31380 67 65 2c 20 66 69 72 73 74 20 66 69 6e 64 20 74  ge, first find t
31390 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 0a 20  he right-most . 
313a0 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50     ** cell on pP
313b0 61 67 65 2e 20 54 68 65 20 66 69 72 73 74 20 74  age. The first t
313c0 77 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 69  wo fields of thi
313d0 73 20 63 65 6c 6c 20 61 72 65 20 74 68 65 20 0a  s cell are the .
313e0 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 2d 6c 65      ** record-le
313f0 6e 67 74 68 20 28 61 20 76 61 72 69 61 62 6c 65  ngth (a variable
31400 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20   length integer 
31410 61 74 20 6d 6f 73 74 20 33 32 2d 62 69 74 73 20  at most 32-bits 
31420 69 6e 20 73 69 7a 65 29 0a 20 20 20 20 2a 2a 20  in size).    ** 
31430 61 6e 64 20 74 68 65 20 6b 65 79 20 76 61 6c 75  and the key valu
31440 65 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65  e (a variable le
31450 6e 67 74 68 20 69 6e 74 65 67 65 72 2c 20 6d 61  ngth integer, ma
31460 79 20 68 61 76 65 20 61 6e 79 20 76 61 6c 75 65  y have any value
31470 29 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69  )..    ** The fi
31480 72 73 74 20 6f 66 20 74 68 65 20 77 68 69 6c 65  rst of the while
31490 28 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62 65 6c 6f  (...) loops belo
314a0 77 20 73 6b 69 70 73 20 6f 76 65 72 20 74 68 65  w skips over the
314b0 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 0a 20   record-length. 
314c0 20 20 20 2a 2a 20 66 69 65 6c 64 2e 20 54 68 65     ** field. The
314d0 20 73 65 63 6f 6e 64 20 77 68 69 6c 65 28 2e 2e   second while(..
314e0 2e 29 20 6c 6f 6f 70 20 63 6f 70 69 65 73 20 74  .) loop copies t
314f0 68 65 20 6b 65 79 20 76 61 6c 75 65 20 66 72 6f  he key value fro
31500 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 65 6c  m the.    ** cel
31510 6c 20 6f 6e 20 70 50 61 67 65 20 69 6e 74 6f 20  l on pPage into 
31520 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  the pSpace buffe
31530 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43  r..    */.    pC
31540 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
31550 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65  Page, pPage->nCe
31560 6c 6c 2d 31 29 3b 0a 20 20 20 20 70 53 74 6f 70  ll-1);.    pStop
31570 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20   = &pCell[9];.  
31580 20 20 77 68 69 6c 65 28 20 28 2a 28 70 43 65 6c    while( (*(pCel
31590 6c 2b 2b 29 26 30 78 38 30 29 20 26 26 20 70 43  l++)&0x80) && pC
315a0 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 20 20 20  ell<pStop );.   
315b0 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b   pStop = &pCell[
315c0 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
315d0 28 2a 28 70 4f 75 74 2b 2b 29 20 3d 20 2a 28 70  (*(pOut++) = *(p
315e0 43 65 6c 6c 2b 2b 29 29 26 30 78 38 30 29 20 26  Cell++))&0x80) &
315f0 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b  & pCell<pStop );
31600 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20  ..    /* Insert 
31610 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20  the new divider 
31620 63 65 6c 6c 20 69 6e 74 6f 20 70 50 61 72 65 6e  cell into pParen
31630 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 73 65 72 74  t. */.    insert
31640 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 50  Cell(pParent, pP
31650 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 20 70 53  arent->nCell, pS
31660 70 61 63 65 2c 20 28 69 6e 74 29 28 70 4f 75 74  pace, (int)(pOut
31670 2d 70 53 70 61 63 65 29 2c 0a 20 20 20 20 20 20  -pSpace),.      
31680 20 20 20 20 20 20 20 20 20 30 2c 20 70 50 61 67           0, pPag
31690 65 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 0a  e->pgno, &rc);..
316a0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 72      /* Set the r
316b0 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74  ight-child point
316c0 65 72 20 6f 66 20 70 50 61 72 65 6e 74 20 74 6f  er of pParent to
316d0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
316e0 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70  w page. */.    p
316f0 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  ut4byte(&pParent
31700 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
31710 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70  >hdrOffset+8], p
31720 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20  gnoNew);.  .    
31730 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 72  /* Release the r
31740 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
31750 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  new page. */.   
31760 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
31770 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  w);.  }..  retur
31780 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
31790 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  * SQLITE_OMIT_QU
317a0 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23  ICKBALANCE */..#
317b0 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if 0./*.** This 
317c0 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
317d0 74 20 63 6f 6e 74 72 69 62 75 74 65 20 61 6e 79  t contribute any
317e0 74 68 69 6e 67 20 74 6f 20 74 68 65 20 6f 70 65  thing to the ope
317f0 72 61 74 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65  ration of SQLite
31800 2e 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74  ..** it is somet
31810 69 6d 65 73 20 61 63 74 69 76 61 74 65 64 20 74  imes activated t
31820 65 6d 70 6f 72 61 72 69 6c 79 20 77 68 69 6c 65  emporarily while
31830 20 64 65 62 75 67 67 69 6e 67 20 63 6f 64 65 20   debugging code 
31840 72 65 73 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20  responsible .** 
31850 66 6f 72 20 73 65 74 74 69 6e 67 20 70 6f 69 6e  for setting poin
31860 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 2e  ter-map entries.
31870 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
31880 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28  trmapCheckPages(
31890 4d 65 6d 50 61 67 65 20 2a 2a 61 70 50 61 67 65  MemPage **apPage
318a0 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20  , int nPage){.  
318b0 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28  int i, j;.  for(
318c0 69 3d 30 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b  i=0; i<nPage; i+
318d0 2b 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0a  +){.    Pgno n;.
318e0 20 20 20 20 75 38 20 65 3b 0a 20 20 20 20 4d 65      u8 e;.    Me
318f0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 61  mPage *pPage = a
31900 70 50 61 67 65 5b 69 5d 3b 0a 20 20 20 20 42 74  pPage[i];.    Bt
31910 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
31920 61 67 65 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  age->pBt;.    as
31930 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
31940 6e 69 74 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28  nit );..    for(
31950 6a 3d 30 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43  j=0; j<pPage->nC
31960 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ell; j++){.     
31970 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
31980 20 20 20 20 20 20 75 38 20 2a 7a 3b 0a 20 20 20        u8 *z;.   
31990 20 20 0a 20 20 20 20 20 20 7a 20 3d 20 66 69 6e    .      z = fin
319a0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6a 29 3b  dCell(pPage, j);
319b0 0a 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73  .      btreePars
319c0 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
319d0 7a 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  z, &info);.     
319e0 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
319f0 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 50  low ){.        P
31a00 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62  gno ovfl = get4b
31a10 79 74 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65  yte(&z[info.iOve
31a20 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20  rflow]);.       
31a30 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
31a40 6f 76 66 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a 20  ovfl, &e, &n);. 
31a50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
31a60 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26  ==pPage->pgno &&
31a70 20 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46   e==PTRMAP_OVERF
31a80 4c 4f 57 31 20 29 3b 0a 20 20 20 20 20 20 7d 0a  LOW1 );.      }.
31a90 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
31aa0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
31ab0 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67    Pgno child = g
31ac0 65 74 34 62 79 74 65 28 7a 29 3b 0a 20 20 20 20  et4byte(z);.    
31ad0 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42      ptrmapGet(pB
31ae0 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e  t, child, &e, &n
31af0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
31b00 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  t( n==pPage->pgn
31b10 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42  o && e==PTRMAP_B
31b20 54 52 45 45 20 29 3b 0a 20 20 20 20 20 20 7d 0a  TREE );.      }.
31b30 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70      }.    if( !p
31b40 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
31b50 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d      Pgno child =
31b60 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
31b70 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
31b80 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
31b90 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42      ptrmapGet(pB
31ba0 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e  t, child, &e, &n
31bb0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
31bc0 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20   n==pPage->pgno 
31bd0 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  && e==PTRMAP_BTR
31be0 45 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  EE );.    }.  }.
31bf0 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
31c00 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
31c10 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
31c20 64 20 74 6f 20 63 6f 70 79 20 74 68 65 20 63 6f  d to copy the co
31c30 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 2d  ntents of the b-
31c40 74 72 65 65 20 6e 6f 64 65 20 73 74 6f 72 65 64  tree node stored
31c50 20 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 70 46 72   .** on page pFr
31c60 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20  om to page pTo. 
31c70 49 66 20 70 61 67 65 20 70 46 72 6f 6d 20 77 61  If page pFrom wa
31c80 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67  s not a leaf pag
31c90 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 70  e, then.** the p
31ca0 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
31cb0 65 73 20 66 6f 72 20 65 61 63 68 20 63 68 69 6c  es for each chil
31cc0 64 20 70 61 67 65 20 61 72 65 20 75 70 64 61 74  d page are updat
31cd0 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a  ed so that the.*
31ce0 2a 20 70 61 72 65 6e 74 20 70 61 67 65 20 73 74  * parent page st
31cf0 6f 72 65 64 20 69 6e 20 74 68 65 20 70 6f 69 6e  ored in the poin
31d00 74 65 72 20 6d 61 70 20 69 73 20 70 61 67 65 20  ter map is page 
31d10 70 54 6f 2e 20 49 66 20 70 46 72 6f 6d 20 63 6f  pTo. If pFrom co
31d20 6e 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 79 20 63  ntained.** any c
31d30 65 6c 6c 73 20 77 69 74 68 20 6f 76 65 72 66 6c  ells with overfl
31d40 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73  ow page pointers
31d50 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 72 72 65  , then the corre
31d60 73 70 6f 6e 64 69 6e 67 20 70 6f 69 6e 74 65 72  sponding pointer
31d70 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20  .** map entries 
31d80 61 72 65 20 61 6c 73 6f 20 75 70 64 61 74 65 64  are also updated
31d90 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 72   so that the par
31da0 65 6e 74 20 70 61 67 65 20 69 73 20 70 61 67 65  ent page is page
31db0 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70   pTo..**.** If p
31dc0 46 72 6f 6d 20 69 73 20 63 75 72 72 65 6e 74 6c  From is currentl
31dd0 79 20 63 61 72 72 79 69 6e 67 20 61 6e 79 20 6f  y carrying any o
31de0 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 28 65  verflow cells (e
31df0 6e 74 72 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a  ntries in the.**
31e00 20 4d 65 6d 50 61 67 65 2e 61 70 4f 76 66 6c 5b   MemPage.apOvfl[
31e10 5d 20 61 72 72 61 79 29 2c 20 74 68 65 79 20 61  ] array), they a
31e20 72 65 20 6e 6f 74 20 63 6f 70 69 65 64 20 74 6f  re not copied to
31e30 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66   pTo. .**.** Bef
31e40 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 70  ore returning, p
31e50 61 67 65 20 70 54 6f 20 69 73 20 72 65 69 6e 69  age pTo is reini
31e60 74 69 61 6c 69 7a 65 64 20 75 73 69 6e 67 20 62  tialized using b
31e70 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a  treeInitPage()..
31e80 2a 2a 0a 2a 2a 20 54 68 65 20 70 65 72 66 6f 72  **.** The perfor
31e90 6d 61 6e 63 65 20 6f 66 20 74 68 69 73 20 66 75  mance of this fu
31ea0 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 72  nction is not cr
31eb0 69 74 69 63 61 6c 2e 20 49 74 20 69 73 20 6f 6e  itical. It is on
31ec0 6c 79 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74  ly used by .** t
31ed0 68 65 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c  he balance_shall
31ee0 6f 77 65 72 28 29 20 61 6e 64 20 62 61 6c 61 6e  ower() and balan
31ef0 63 65 5f 64 65 65 70 65 72 28 29 20 70 72 6f 63  ce_deeper() proc
31f00 65 64 75 72 65 73 2c 20 6e 65 69 74 68 65 72 20  edures, neither 
31f10 6f 66 0a 2a 2a 20 77 68 69 63 68 20 61 72 65 20  of.** which are 
31f20 63 61 6c 6c 65 64 20 6f 66 74 65 6e 20 75 6e 64  called often und
31f30 65 72 20 6e 6f 72 6d 61 6c 20 63 69 72 63 75 6d  er normal circum
31f40 73 74 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61 74  stances..*/.stat
31f50 69 63 20 76 6f 69 64 20 63 6f 70 79 4e 6f 64 65  ic void copyNode
31f60 43 6f 6e 74 65 6e 74 28 4d 65 6d 50 61 67 65 20  Content(MemPage 
31f70 2a 70 46 72 6f 6d 2c 20 4d 65 6d 50 61 67 65 20  *pFrom, MemPage 
31f80 2a 70 54 6f 2c 20 69 6e 74 20 2a 70 52 43 29 7b  *pTo, int *pRC){
31f90 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53  .  if( (*pRC)==S
31fa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31fb0 42 74 53 68 61 72 65 64 20 2a 20 63 6f 6e 73 74  BtShared * const
31fc0 20 70 42 74 20 3d 20 70 46 72 6f 6d 2d 3e 70 42   pBt = pFrom->pB
31fd0 74 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73  t;.    u8 * cons
31fe0 74 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d  t aFrom = pFrom-
31ff0 3e 61 44 61 74 61 3b 0a 20 20 20 20 75 38 20 2a  >aData;.    u8 *
32000 20 63 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54 6f   const aTo = pTo
32010 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 6e 74  ->aData;.    int
32020 20 63 6f 6e 73 74 20 69 46 72 6f 6d 48 64 72 20   const iFromHdr 
32030 3d 20 70 46 72 6f 6d 2d 3e 68 64 72 4f 66 66 73  = pFrom->hdrOffs
32040 65 74 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73  et;.    int cons
32050 74 20 69 54 6f 48 64 72 20 3d 20 28 28 70 54 6f  t iToHdr = ((pTo
32060 2d 3e 70 67 6e 6f 3d 3d 31 29 20 3f 20 31 30 30  ->pgno==1) ? 100
32070 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 72   : 0);.    int r
32080 63 3b 0a 20 20 20 20 69 6e 74 20 69 44 61 74 61  c;.    int iData
32090 3b 0a 20 20 0a 20 20 0a 20 20 20 20 61 73 73 65  ;.  .  .    asse
320a0 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73 49 6e 69  rt( pFrom->isIni
320b0 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t );.    assert(
320c0 20 70 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e 3d 69   pFrom->nFree>=i
320d0 54 6f 48 64 72 20 29 3b 0a 20 20 20 20 61 73 73  ToHdr );.    ass
320e0 65 72 74 28 20 67 65 74 32 62 79 74 65 28 26 61  ert( get2byte(&a
320f0 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d  From[iFromHdr+5]
32100 29 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75  ) <= (int)pBt->u
32110 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 0a  sableSize );.  .
32120 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
32130 62 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e 74  b-tree node cont
32140 65 6e 74 20 66 72 6f 6d 20 70 61 67 65 20 70 46  ent from page pF
32150 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e  rom to page pTo.
32160 20 2a 2f 0a 20 20 20 20 69 44 61 74 61 20 3d 20   */.    iData = 
32170 67 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b  get2byte(&aFrom[
32180 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20 20  iFromHdr+5]);.  
32190 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 44    memcpy(&aTo[iD
321a0 61 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44 61  ata], &aFrom[iDa
321b0 74 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  ta], pBt->usable
321c0 53 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20 20  Size-iData);.   
321d0 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 54 6f   memcpy(&aTo[iTo
321e0 48 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69 46 72  Hdr], &aFrom[iFr
321f0 6f 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63  omHdr], pFrom->c
32200 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 46  ellOffset + 2*pF
32210 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 0a  rom->nCell);.  .
32220 20 20 20 20 2f 2a 20 52 65 69 6e 69 74 69 61 6c      /* Reinitial
32230 69 7a 65 20 70 61 67 65 20 70 54 6f 20 73 6f 20  ize page pTo so 
32240 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
32250 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
32260 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 2a   structure.    *
32270 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20  * match the new 
32280 64 61 74 61 2e 20 54 68 65 20 69 6e 69 74 69 61  data. The initia
32290 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f 20  lization of pTo 
322a0 63 61 6e 20 61 63 74 75 61 6c 6c 79 20 66 61 69  can actually fai
322b0 6c 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20 66  l under.    ** f
322c0 61 69 72 6c 79 20 6f 62 73 63 75 72 65 20 63 69  airly obscure ci
322d0 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 65 76 65  rcumstances, eve
322e0 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 61  n though it is a
322f0 20 63 6f 70 79 20 6f 66 20 69 6e 69 74 69 61 6c   copy of initial
32300 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 70 61 67  ized .    ** pag
32310 65 20 70 46 72 6f 6d 2e 0a 20 20 20 20 2a 2f 0a  e pFrom..    */.
32320 20 20 20 20 70 54 6f 2d 3e 69 73 49 6e 69 74 20      pTo->isInit 
32330 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  = 0;.    rc = bt
32340 72 65 65 49 6e 69 74 50 61 67 65 28 70 54 6f 29  reeInitPage(pTo)
32350 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
32360 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32370 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
32380 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
32390 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69    .    /* If thi
323a0 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
323b0 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70  uum database, up
323c0 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
323d0 2d 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20  -map entries.   
323e0 20 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74 72   ** for any b-tr
323f0 65 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70  ee or overflow p
32400 61 67 65 73 20 74 68 61 74 20 70 54 6f 20 6e 6f  ages that pTo no
32410 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  w contains the p
32420 6f 69 6e 74 65 72 73 20 74 6f 2e 0a 20 20 20 20  ointers to..    
32430 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54  */.    if( ISAUT
32440 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
32450 20 2a 70 52 43 20 3d 20 73 65 74 43 68 69 6c 64   *pRC = setChild
32460 50 74 72 6d 61 70 73 28 70 54 6f 29 3b 0a 20 20  Ptrmaps(pTo);.  
32470 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
32480 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
32490 64 69 73 74 72 69 62 75 74 65 73 20 63 65 6c 6c  distributes cell
324a0 73 20 6f 6e 20 74 68 65 20 69 50 61 72 65 6e 74  s on the iParent
324b0 49 64 78 27 74 68 20 63 68 69 6c 64 20 6f 66 20  Idx'th child of 
324c0 70 50 61 72 65 6e 74 0a 2a 2a 20 28 68 65 72 65  pParent.** (here
324d0 61 66 74 65 72 20 22 74 68 65 20 70 61 67 65 22  after "the page"
324e0 29 20 61 6e 64 20 75 70 20 74 6f 20 32 20 73 69  ) and up to 2 si
324f0 62 6c 69 6e 67 73 20 73 6f 20 74 68 61 74 20 61  blings so that a
32500 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 61 62  ll pages have ab
32510 6f 75 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  out the.** same 
32520 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73  amount of free s
32530 70 61 63 65 2e 20 55 73 75 61 6c 6c 79 20 61 20  pace. Usually a 
32540 73 69 6e 67 6c 65 20 73 69 62 6c 69 6e 67 20 6f  single sibling o
32550 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66  n either side of
32560 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 61 72 65   the.** page are
32570 20 75 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c   used in the bal
32580 61 6e 63 69 6e 67 2c 20 74 68 6f 75 67 68 20 62  ancing, though b
32590 6f 74 68 20 73 69 62 6c 69 6e 67 73 20 6d 69 67  oth siblings mig
325a0 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65  ht come from one
325b0 0a 2a 2a 20 73 69 64 65 20 69 66 20 74 68 65 20  .** side if the 
325c0 70 61 67 65 20 69 73 20 74 68 65 20 66 69 72 73  page is the firs
325d0 74 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20  t or last child 
325e0 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20 49  of its parent. I
325f0 66 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 68  f the page .** h
32600 61 73 20 66 65 77 65 72 20 74 68 61 6e 20 32 20  as fewer than 2 
32610 73 69 62 6c 69 6e 67 73 20 28 73 6f 6d 65 74 68  siblings (someth
32620 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e  ing which can on
32630 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65  ly happen if the
32640 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 20 72 6f   page.** is a ro
32650 6f 74 20 70 61 67 65 20 6f 72 20 61 20 63 68 69  ot page or a chi
32660 6c 64 20 6f 66 20 61 20 72 6f 6f 74 20 70 61 67  ld of a root pag
32670 65 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69  e) then all avai
32680 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 0a 2a  lable siblings.*
32690 2a 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e  * participate in
326a0 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a   the balancing..
326b0 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72  **.** The number
326c0 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20   of siblings of 
326d0 74 68 65 20 70 61 67 65 20 6d 69 67 68 74 20 62  the page might b
326e0 65 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64  e increased or d
326f0 65 63 72 65 61 73 65 64 20 62 79 20 0a 2a 2a 20  ecreased by .** 
32700 6f 6e 65 20 6f 72 20 74 77 6f 20 69 6e 20 61 6e  one or two in an
32710 20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20   effort to keep 
32720 70 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c  pages nearly ful
32730 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66  l but not over f
32740 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ull. .**.** Note
32750 20 74 68 61 74 20 77 68 65 6e 20 74 68 69 73 20   that when this 
32760 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
32770 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63  d, some of the c
32780 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ells on the page
32790 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63  .** might not ac
327a0 74 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64  tually be stored
327b0 20 69 6e 20 4d 65 6d 50 61 67 65 2e 61 44 61 74   in MemPage.aDat
327c0 61 5b 5d 2e 20 54 68 69 73 20 63 61 6e 20 68 61  a[]. This can ha
327d0 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70  ppen.** if the p
327e0 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e  age is overfull.
327f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
32800 73 75 72 65 73 20 74 68 61 74 20 61 6c 6c 20 63  sures that all c
32810 65 6c 6c 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  ells allocated.*
32820 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 61 6e  * to the page an
32830 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73 20 66  d its siblings f
32840 69 74 20 69 6e 74 6f 20 4d 65 6d 50 61 67 65 2e  it into MemPage.
32850 61 44 61 74 61 5b 5d 20 62 65 66 6f 72 65 20 72  aData[] before r
32860 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
32870 49 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66  In the course of
32880 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 70   balancing the p
32890 61 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c  age and its sibl
328a0 69 6e 67 73 2c 20 63 65 6c 6c 73 20 6d 61 79 20  ings, cells may 
328b0 62 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69  be.** inserted i
328c0 6e 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66  nto or removed f
328d0 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70  rom the parent p
328e0 61 67 65 20 28 70 50 61 72 65 6e 74 29 2e 20 44  age (pParent). D
328f0 6f 69 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79 20 63  oing so.** may c
32900 61 75 73 65 20 74 68 65 20 70 61 72 65 6e 74 20  ause the parent 
32910 70 61 67 65 20 74 6f 20 62 65 63 6f 6d 65 20 6f  page to become o
32920 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72  verfull or under
32930 66 75 6c 6c 2e 20 49 66 20 74 68 69 73 0a 2a 2a  full. If this.**
32940 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 20   happens, it is 
32950 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
32960 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
32970 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 63   to invoke the c
32980 6f 72 72 65 63 74 0a 2a 2a 20 62 61 6c 61 6e 63  orrect.** balanc
32990 69 6e 67 20 72 6f 75 74 69 6e 65 20 74 6f 20 66  ing routine to f
329a0 69 78 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20  ix this problem 
329b0 28 73 65 65 20 74 68 65 20 62 61 6c 61 6e 63 65  (see the balance
329c0 28 29 20 72 6f 75 74 69 6e 65 29 2e 20 0a 2a 2a  () routine). .**
329d0 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74  .** If this rout
329e0 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e  ine fails for an
329f0 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67  y reason, it mig
32a00 68 74 20 6c 65 61 76 65 20 74 68 65 20 64 61 74  ht leave the dat
32a10 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f  abase.** in a co
32a20 72 72 75 70 74 65 64 20 73 74 61 74 65 2e 20 53  rrupted state. S
32a30 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  o if this routin
32a40 65 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74  e fails, the dat
32a50 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20  abase should.** 
32a60 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
32a70 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72 64 20  **.** The third 
32a80 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
32a90 20 66 75 6e 63 74 69 6f 6e 2c 20 61 4f 76 66 6c   function, aOvfl
32aa0 53 70 61 63 65 2c 20 69 73 20 61 20 70 6f 69 6e  Space, is a poin
32ab0 74 65 72 20 74 6f 20 61 0a 2a 2a 20 62 75 66 66  ter to a.** buff
32ac0 65 72 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  er big enough to
32ad0 20 68 6f 6c 64 20 6f 6e 65 20 70 61 67 65 2e 20   hold one page. 
32ae0 49 66 20 77 68 69 6c 65 20 69 6e 73 65 72 74 69  If while inserti
32af0 6e 67 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68  ng cells into th
32b00 65 20 70 61 72 65 6e 74 0a 2a 2a 20 70 61 67 65  e parent.** page
32b10 20 28 70 50 61 72 65 6e 74 29 20 74 68 65 20 70   (pParent) the p
32b20 61 72 65 6e 74 20 70 61 67 65 20 62 65 63 6f 6d  arent page becom
32b30 65 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68 69  es overfull, thi
32b40 73 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 75  s buffer is.** u
32b50 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
32b60 20 70 61 72 65 6e 74 27 73 20 6f 76 65 72 66 6c   parent's overfl
32b70 6f 77 20 63 65 6c 6c 73 2e 20 42 65 63 61 75 73  ow cells. Becaus
32b80 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
32b90 69 6e 73 65 72 74 73 0a 2a 2a 20 61 20 6d 61 78  inserts.** a max
32ba0 69 6d 75 6d 20 6f 66 20 66 6f 75 72 20 64 69 76  imum of four div
32bb0 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20  ider cells into 
32bc0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c  the parent page,
32bd0 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d   and the maximum
32be0 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 61 20 63 65  .** size of a ce
32bf0 6c 6c 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e  ll stored within
32c00 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64   an internal nod
32c10 65 20 69 73 20 61 6c 77 61 79 73 20 6c 65 73 73  e is always less
32c20 20 74 68 61 6e 20 31 2f 34 0a 2a 2a 20 6f 66 20   than 1/4.** of 
32c30 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74  the page-size, t
32c40 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20  he aOvflSpace[] 
32c50 62 75 66 66 65 72 20 69 73 20 67 75 61 72 61 6e  buffer is guaran
32c60 74 65 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65  teed to be large
32c70 0a 2a 2a 20 65 6e 6f 75 67 68 20 66 6f 72 20 61  .** enough for a
32c80 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ll overflow cell
32c90 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 4f 76 66  s..**.** If aOvf
32ca0 6c 53 70 61 63 65 20 69 73 20 73 65 74 20 74 6f  lSpace is set to
32cb0 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2c   a null pointer,
32cc0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
32cd0 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54  eturns .** SQLIT
32ce0 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 23 69 66 20  E_NOMEM..*/.#if 
32cf0 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52  defined(_MSC_VER
32d00 29 20 26 26 20 5f 4d 53 43 5f 56 45 52 20 3e 3d  ) && _MSC_VER >=
32d10 20 31 37 30 30 20 26 26 20 64 65 66 69 6e 65 64   1700 && defined
32d20 28 5f 4d 5f 41 52 4d 29 0a 23 70 72 61 67 6d 61  (_M_ARM).#pragma
32d30 20 6f 70 74 69 6d 69 7a 65 28 22 22 2c 20 6f 66   optimize("", of
32d40 66 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63  f).#endif.static
32d50 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e   int balance_non
32d60 72 6f 6f 74 28 0a 20 20 4d 65 6d 50 61 67 65 20  root(.  MemPage 
32d70 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20  *pParent,       
32d80 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e          /* Paren
32d90 74 20 70 61 67 65 20 6f 66 20 73 69 62 6c 69 6e  t page of siblin
32da0 67 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65  gs being balance
32db0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65  d */.  int iPare
32dc0 6e 74 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  ntIdx,          
32dd0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
32de0 6f 66 20 22 74 68 65 20 70 61 67 65 22 20 69 6e  of "the page" in
32df0 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 75 38   pParent */.  u8
32e00 20 2a 61 4f 76 66 6c 53 70 61 63 65 2c 20 20 20   *aOvflSpace,   
32e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32e20 20 70 61 67 65 2d 73 69 7a 65 20 62 79 74 65 73   page-size bytes
32e30 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 70 61   of space for pa
32e40 72 65 6e 74 20 6f 76 66 6c 20 2a 2f 0a 20 20 69  rent ovfl */.  i
32e50 6e 74 20 69 73 52 6f 6f 74 2c 20 20 20 20 20 20  nt isRoot,      
32e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32e70 2a 20 54 72 75 65 20 69 66 20 70 50 61 72 65 6e  * True if pParen
32e80 74 20 69 73 20 61 20 72 6f 6f 74 2d 70 61 67 65  t is a root-page
32e90 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75 6c 6b 20   */.  int bBulk 
32ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32eb0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
32ec0 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 70 61   this call is pa
32ed0 72 74 20 6f 66 20 61 20 62 75 6c 6b 20 6c 6f 61  rt of a bulk loa
32ee0 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  d */.){.  BtShar
32ef0 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
32f00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68         /* The wh
32f10 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ole database */.
32f20 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b    int nCell = 0;
32f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32f40 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
32f50 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f  s in apCell[] */
32f60 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73  .  int nMaxCells
32f70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
32f80 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a  /* Allocated siz
32f90 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43  e of apCell, szC
32fa0 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20  ell, aFrom. */. 
32fb0 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b 20 20   int nNew = 0;  
32fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32fd0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
32fe0 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20   in apNew[] */. 
32ff0 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20   int nOld;      
33000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33010 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
33020 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20   in apOld[] */. 
33030 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20   int i, j, k;   
33040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33050 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
33060 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20  /.  int nxDiv;  
33070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33080 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72   /* Next divider
33090 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74   slot in pParent
330a0 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69  ->aCell[] */.  i
330b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
330c0 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  K;          /* T
330d0 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
330e0 2f 0a 20 20 75 31 36 20 6c 65 61 66 43 6f 72 72  /.  u16 leafCorr
330f0 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  ection;         
33100 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20 69   /* 4 if pPage i
33110 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20  s a leaf.  0 if 
33120 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61  not */.  int lea
33130 66 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  fData;          
33140 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
33150 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
33160 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20 74   of a LEAFDATA t
33170 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ree */.  int usa
33180 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20 20  bleSpace;       
33190 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69        /* Bytes i
331a0 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74  n pPage beyond t
331b0 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  he header */.  i
331c0 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20  nt pageFlags;   
331d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
331e0 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61  alue of pPage->a
331f0 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74  Data[0] */.  int
33200 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20   subtotal;      
33210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
33220 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69  total of bytes i
33230 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70  n cells on one p
33240 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70  age */.  int iSp
33250 61 63 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20  ace1 = 0;       
33260 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75        /* First u
33270 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 53  nused byte of aS
33280 70 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74  pace1[] */.  int
33290 20 69 4f 76 66 6c 53 70 61 63 65 20 3d 20 30 3b   iOvflSpace = 0;
332a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
332b0 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f  st unused byte o
332c0 66 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20 2a  f aOvflSpace[] *
332d0 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72 61 74 63  /.  int szScratc
332e0 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
332f0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63 72 61   /* Size of scra
33300 74 63 68 20 6d 65 6d 6f 72 79 20 72 65 71 75 65  tch memory reque
33310 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  sted */.  MemPag
33320 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20  e *apOld[NB];   
33330 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20         /* pPage 
33340 61 6e 64 20 75 70 20 74 6f 20 74 77 6f 20 73 69  and up to two si
33350 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 4d 65 6d 50  blings */.  MemP
33360 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b  age *apCopy[NB];
33370 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76           /* Priv
33380 61 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70  ate copies of ap
33390 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20  Old[] pages */. 
333a0 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b   MemPage *apNew[
333b0 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a  NB+2];        /*
333c0 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
333d0 20 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74   NB siblings aft
333e0 65 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a  er balancing */.
333f0 20 20 75 38 20 2a 70 52 69 67 68 74 3b 20 20 20    u8 *pRight;   
33400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33410 2a 20 4c 6f 63 61 74 69 6f 6e 20 69 6e 20 70 61  * Location in pa
33420 72 65 6e 74 20 6f 66 20 72 69 67 68 74 2d 73 69  rent of right-si
33430 62 6c 69 6e 67 20 70 6f 69 6e 74 65 72 20 2a 2f  bling pointer */
33440 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 2d  .  u8 *apDiv[NB-
33450 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  1];             
33460 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73  /* Divider cells
33470 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20   in pParent */. 
33480 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32   int cntNew[NB+2
33490 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ];            /*
334a0 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b   Index in aCell[
334b0 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20  ] of cell after 
334c0 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69  i-th page */.  i
334d0 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20  nt szNew[NB+2]; 
334e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
334f0 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20  ombined size of 
33500 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69  cells place on i
33510 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  -th page */.  u8
33520 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20   **apCell = 0;  
33530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
33540 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61  l cells begin ba
33550 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20  lanced */.  u16 
33560 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  *szCell;        
33570 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
33580 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  l size of all ce
33590 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
335a0 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65 31  */.  u8 *aSpace1
335b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
335c0 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 63    /* Space for c
335d0 6f 70 69 65 73 20 6f 66 20 64 69 76 69 64 65 72  opies of divider
335e0 73 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 50 67 6e  s cells */.  Pgn
335f0 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  o pgno;         
33600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
33610 70 20 76 61 72 20 74 6f 20 73 74 6f 72 65 20 61  p var to store a
33620 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20   page number in 
33630 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 72  */..  pBt = pPar
33640 65 6e 74 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  ent->pBt;.  asse
33650 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
33660 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
33670 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
33680 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
33690 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d  iteable(pParent-
336a0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 23 69  >pDbPage) );..#i
336b0 66 20 30 0a 20 20 54 52 41 43 45 28 28 22 42 41  f 0.  TRACE(("BA
336c0 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61 67  LANCE: begin pag
336d0 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25 64  e %d child of %d
336e0 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  \n", pPage->pgno
336f0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29  , pParent->pgno)
33700 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
33710 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70 50  At this point pP
33720 61 72 65 6e 74 20 6d 61 79 20 68 61 76 65 20 61  arent may have a
33730 74 20 6d 6f 73 74 20 6f 6e 65 20 6f 76 65 72 66  t most one overf
33740 6c 6f 77 20 63 65 6c 6c 2e 20 41 6e 64 20 69 66  low cell. And if
33750 0a 20 20 2a 2a 20 74 68 69 73 20 6f 76 65 72 66  .  ** this overf
33760 6c 6f 77 20 63 65 6c 6c 20 69 73 20 70 72 65 73  low cell is pres
33770 65 6e 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20  ent, it must be 
33780 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20 0a 20  the cell with . 
33790 20 2a 2a 20 69 6e 64 65 78 20 69 50 61 72 65 6e   ** index iParen
337a0 74 49 64 78 2e 20 54 68 69 73 20 73 63 65 6e 61  tIdx. This scena
337b0 72 69 6f 20 63 6f 6d 65 73 20 61 62 6f 75 74 20  rio comes about 
337c0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
337d0 6f 6e 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65  on.  ** is calle
337e0 64 20 28 69 6e 64 69 72 65 63 74 6c 79 29 20 66  d (indirectly) f
337f0 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65  rom sqlite3Btree
33800 44 65 6c 65 74 65 28 29 2e 0a 20 20 2a 2f 0a 20  Delete()..  */. 
33810 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
33820 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c  ->nOverflow==0 |
33830 7c 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  | pParent->nOver
33840 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 61 73 73  flow==1 );.  ass
33850 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f  ert( pParent->nO
33860 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50  verflow==0 || pP
33870 61 72 65 6e 74 2d 3e 61 69 4f 76 66 6c 5b 30 5d  arent->aiOvfl[0]
33880 3d 3d 69 50 61 72 65 6e 74 49 64 78 20 29 3b 0a  ==iParentIdx );.
33890 0a 20 20 69 66 28 20 21 61 4f 76 66 6c 53 70 61  .  if( !aOvflSpa
338a0 63 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ce ){.    return
338b0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
338c0 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68   }..  /* Find th
338d0 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
338e0 74 6f 20 62 61 6c 61 6e 63 65 2e 20 41 6c 73 6f  to balance. Also
338f0 20 6c 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c   locate the cell
33900 73 20 69 6e 20 70 50 61 72 65 6e 74 20 0a 20 20  s in pParent .  
33910 2a 2a 20 74 68 61 74 20 64 69 76 69 64 65 20 74  ** that divide t
33920 68 65 20 73 69 62 6c 69 6e 67 73 2e 20 41 6e 20  he siblings. An 
33930 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
33940 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69  to find NN sibli
33950 6e 67 73 20 6f 6e 20 0a 20 20 2a 2a 20 65 69 74  ngs on .  ** eit
33960 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67  her side of pPag
33970 65 2e 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73  e. More siblings
33980 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20   are taken from 
33990 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65  one side, howeve
339a0 72 2c 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 72  r, .  ** if ther
339b0 65 20 61 72 65 20 66 65 77 65 72 20 74 68 61 6e  e are fewer than
339c0 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20   NN siblings on 
339d0 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20  the other side. 
339e0 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20  If pParent.  ** 
339f0 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20  has NB or fewer 
33a00 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c  children then al
33a10 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50  l children of pP
33a20 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e  arent are taken.
33a30 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69    .  **.  ** Thi
33a40 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 64 72 6f 70  s loop also drop
33a50 73 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  s the divider ce
33a60 6c 6c 73 20 66 72 6f 6d 20 74 68 65 20 70 61 72  lls from the par
33a70 65 6e 74 20 70 61 67 65 2e 20 54 68 69 73 0a 20  ent page. This. 
33a80 20 2a 2a 20 77 61 79 2c 20 74 68 65 20 72 65 6d   ** way, the rem
33a90 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 66 75  ainder of the fu
33aa0 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
33ab0 68 61 76 65 20 74 6f 20 64 65 61 6c 20 77 69 74  have to deal wit
33ac0 68 20 61 6e 79 0a 20 20 2a 2a 20 6f 76 65 72 66  h any.  ** overf
33ad0 6c 6f 77 20 63 65 6c 6c 73 20 69 6e 20 74 68 65  low cells in the
33ae0 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20 73 69   parent page, si
33af0 6e 63 65 20 69 66 20 61 6e 79 20 65 78 69 73 74  nce if any exist
33b00 65 64 20 74 68 65 79 20 77 69 6c 6c 0a 20 20 2a  ed they will.  *
33b10 2a 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  * have already b
33b20 65 65 6e 20 72 65 6d 6f 76 65 64 2e 0a 20 20 2a  een removed..  *
33b30 2f 0a 20 20 69 20 3d 20 70 50 61 72 65 6e 74 2d  /.  i = pParent-
33b40 3e 6e 4f 76 65 72 66 6c 6f 77 20 2b 20 70 50 61  >nOverflow + pPa
33b50 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69  rent->nCell;.  i
33b60 66 28 20 69 3c 32 20 29 7b 0a 20 20 20 20 6e 78  f( i<2 ){.    nx
33b70 44 69 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Div = 0;.  }else
33b80 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 42  {.    assert( bB
33b90 75 6c 6b 3d 3d 30 20 7c 7c 20 62 42 75 6c 6b 3d  ulk==0 || bBulk=
33ba0 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 69 50  =1 );.    if( iP
33bb0 61 72 65 6e 74 49 64 78 3d 3d 30 20 29 7b 20 20  arentIdx==0 ){  
33bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
33bd0 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b        nxDiv = 0;
33be0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69  .    }else if( i
33bf0 50 61 72 65 6e 74 49 64 78 3d 3d 69 20 29 7b 0a  ParentIdx==i ){.
33c00 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20 69 2d        nxDiv = i-
33c10 32 2b 62 42 75 6c 6b 3b 0a 20 20 20 20 7d 65 6c  2+bBulk;.    }el
33c20 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
33c30 28 20 62 42 75 6c 6b 3d 3d 30 20 29 3b 0a 20 20  ( bBulk==0 );.  
33c40 20 20 20 20 6e 78 44 69 76 20 3d 20 69 50 61 72      nxDiv = iPar
33c50 65 6e 74 49 64 78 2d 31 3b 0a 20 20 20 20 7d 0a  entIdx-1;.    }.
33c60 20 20 20 20 69 20 3d 20 32 2d 62 42 75 6c 6b 3b      i = 2-bBulk;
33c70 0a 20 20 7d 0a 20 20 6e 4f 6c 64 20 3d 20 69 2b  .  }.  nOld = i+
33c80 31 3b 0a 20 20 69 66 28 20 28 69 2b 6e 78 44 69  1;.  if( (i+nxDi
33c90 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  v-pParent->nOver
33ca0 66 6c 6f 77 29 3d 3d 70 50 61 72 65 6e 74 2d 3e  flow)==pParent->
33cb0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 52 69  nCell ){.    pRi
33cc0 67 68 74 20 3d 20 26 70 50 61 72 65 6e 74 2d 3e  ght = &pParent->
33cd0 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
33ce0 64 72 4f 66 66 73 65 74 2b 38 5d 3b 0a 20 20 7d  drOffset+8];.  }
33cf0 65 6c 73 65 7b 0a 20 20 20 20 70 52 69 67 68 74  else{.    pRight
33d00 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72   = findCell(pPar
33d10 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61  ent, i+nxDiv-pPa
33d20 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29  rent->nOverflow)
33d30 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f 20 3d 20 67  ;.  }.  pgno = g
33d40 65 74 34 62 79 74 65 28 70 52 69 67 68 74 29 3b  et4byte(pRight);
33d50 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
33d60 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e     rc = getAndIn
33d70 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  itPage(pBt, pgno
33d80 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c 20 30 29 3b  , &apOld[i], 0);
33d90 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
33da0 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c       memset(apOl
33db0 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65  d, 0, (i+1)*size
33dc0 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20  of(MemPage*));. 
33dd0 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63       goto balanc
33de0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  e_cleanup;.    }
33df0 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b  .    nMaxCells +
33e00 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43  = 1+apOld[i]->nC
33e10 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f  ell+apOld[i]->nO
33e20 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28  verflow;.    if(
33e30 20 28 69 2d 2d 29 3d 3d 30 20 29 20 62 72 65 61   (i--)==0 ) brea
33e40 6b 3b 0a 0a 20 20 20 20 69 66 28 20 69 2b 6e 78  k;..    if( i+nx
33e50 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 61 69  Div==pParent->ai
33e60 4f 76 66 6c 5b 30 5d 20 26 26 20 70 50 61 72 65  Ovfl[0] && pPare
33e70 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b  nt->nOverflow ){
33e80 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20  .      apDiv[i] 
33e90 3d 20 70 50 61 72 65 6e 74 2d 3e 61 70 4f 76 66  = pParent->apOvf
33ea0 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f  l[0];.      pgno
33eb0 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69   = get4byte(apDi
33ec0 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e  v[i]);.      szN
33ed0 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  ew[i] = cellSize
33ee0 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44  Ptr(pParent, apD
33ef0 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 50  iv[i]);.      pP
33f00 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
33f10 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
33f20 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20  .      apDiv[i] 
33f30 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  = findCell(pPare
33f40 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72  nt, i+nxDiv-pPar
33f50 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b  ent->nOverflow);
33f60 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  .      pgno = ge
33f70 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29  t4byte(apDiv[i])
33f80 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d  ;.      szNew[i]
33f90 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
33fa0 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d  Parent, apDiv[i]
33fb0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 72 6f  );..      /* Dro
33fc0 70 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20  p the cell from 
33fd0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
33fe0 20 61 70 44 69 76 5b 69 5d 20 73 74 69 6c 6c 20   apDiv[i] still 
33ff0 70 6f 69 6e 74 73 20 74 6f 0a 20 20 20 20 20 20  points to.      
34000 2a 2a 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68  ** the cell with
34010 69 6e 20 74 68 65 20 70 61 72 65 6e 74 2c 20 65  in the parent, e
34020 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 68 61  ven though it ha
34030 73 20 62 65 65 6e 20 64 72 6f 70 70 65 64 2e 0a  s been dropped..
34040 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
34050 20 73 61 66 65 20 62 65 63 61 75 73 65 20 64 72   safe because dr
34060 6f 70 70 69 6e 67 20 61 20 63 65 6c 6c 20 6f 6e  opping a cell on
34070 6c 79 20 6f 76 65 72 77 72 69 74 65 73 20 74 68  ly overwrites th
34080 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a  e first.      **
34090 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69   four bytes of i
340a0 74 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  t, and this func
340b0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65  tion does not ne
340c0 65 64 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  ed the first.   
340d0 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73     ** four bytes
340e0 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
340f0 63 65 6c 6c 2e 20 53 6f 20 74 68 65 20 70 6f 69  cell. So the poi
34100 6e 74 65 72 20 69 73 20 73 61 66 65 20 74 6f 20  nter is safe to 
34110 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 74  use.      ** lat
34120 65 72 20 6f 6e 2e 20 20 0a 20 20 20 20 20 20 2a  er on.  .      *
34130 2a 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e  *.      ** But n
34140 6f 74 20 69 66 20 77 65 20 61 72 65 20 69 6e 20  ot if we are in 
34150 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f  secure-delete mo
34160 64 65 2e 20 49 6e 20 73 65 63 75 72 65 2d 64 65  de. In secure-de
34170 6c 65 74 65 20 6d 6f 64 65 2c 0a 20 20 20 20 20  lete mode,.     
34180 20 2a 2a 20 74 68 65 20 64 72 6f 70 43 65 6c 6c   ** the dropCell
34190 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  () routine will 
341a0 6f 76 65 72 77 72 69 74 65 20 74 68 65 20 65 6e  overwrite the en
341b0 74 69 72 65 20 63 65 6c 6c 20 77 69 74 68 20 7a  tire cell with z
341c0 65 72 6f 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20  eroes..      ** 
341d0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 65  In this case, te
341e0 6d 70 6f 72 61 72 69 6c 79 20 63 6f 70 79 20 74  mporarily copy t
341f0 68 65 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65  he cell into the
34200 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 0a 20 20   aOvflSpace[].  
34210 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e 20 49      ** buffer. I
34220 74 20 77 69 6c 6c 20 62 65 20 63 6f 70 69 65 64  t will be copied
34230 20 6f 75 74 20 61 67 61 69 6e 20 61 73 20 73 6f   out again as so
34240 6f 6e 20 61 73 20 74 68 65 20 61 53 70 61 63 65  on as the aSpace
34250 5b 5d 20 62 75 66 66 65 72 0a 20 20 20 20 20 20  [] buffer.      
34260 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e  ** is allocated.
34270 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
34280 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
34290 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
342a0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
342b0 69 4f 66 66 3b 0a 0a 20 20 20 20 20 20 20 20 69  iOff;..        i
342c0 4f 66 66 20 3d 20 53 51 4c 49 54 45 5f 50 54 52  Off = SQLITE_PTR
342d0 5f 54 4f 5f 49 4e 54 28 61 70 44 69 76 5b 69 5d  _TO_INT(apDiv[i]
342e0 29 20 2d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54  ) - SQLITE_PTR_T
342f0 4f 5f 49 4e 54 28 70 50 61 72 65 6e 74 2d 3e 61  O_INT(pParent->a
34300 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69  Data);.        i
34310 66 28 20 28 69 4f 66 66 2b 73 7a 4e 65 77 5b 69  f( (iOff+szNew[i
34320 5d 29 3e 28 69 6e 74 29 70 42 74 2d 3e 75 73 61  ])>(int)pBt->usa
34330 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
34340 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
34350 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
34360 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
34370 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a  apOld, 0, (i+1)*
34380 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29  sizeof(MemPage*)
34390 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
343a0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
343b0 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  p;.        }else
343c0 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
343d0 70 79 28 26 61 4f 76 66 6c 53 70 61 63 65 5b 69  py(&aOvflSpace[i
343e0 4f 66 66 5d 2c 20 61 70 44 69 76 5b 69 5d 2c 20  Off], apDiv[i], 
343f0 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 20  szNew[i]);.     
34400 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20       apDiv[i] = 
34410 26 61 4f 76 66 6c 53 70 61 63 65 5b 61 70 44 69  &aOvflSpace[apDi
34420 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44  v[i]-pParent->aD
34430 61 74 61 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ata];.        }.
34440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 72        }.      dr
34450 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  opCell(pParent, 
34460 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d  i+nxDiv-pParent-
34470 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20 73 7a 4e 65  >nOverflow, szNe
34480 77 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20  w[i], &rc);.    
34490 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  }.  }..  /* Make
344a0 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c   nMaxCells a mul
344b0 74 69 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72  tiple of 4 in or
344c0 64 65 72 20 74 6f 20 70 72 65 73 65 72 76 65 20  der to preserve 
344d0 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67  8-byte.  ** alig
344e0 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43  nment */.  nMaxC
344f0 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c  ells = (nMaxCell
34500 73 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a  s + 3)&~3;..  /*
34510 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  ** Allocate s
34520 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20  pace for memory 
34530 73 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a  structures.  */.
34540 20 20 6b 20 3d 20 70 42 74 2d 3e 70 61 67 65 53    k = pBt->pageS
34550 69 7a 65 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a  ize + ROUND8(siz
34560 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20  eof(MemPage));. 
34570 20 73 7a 53 63 72 61 74 63 68 20 3d 0a 20 20 20   szScratch =.   
34580 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69      nMaxCells*si
34590 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20  zeof(u8*)       
345a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
345b0 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20  /* apCell */.   
345c0 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69    + nMaxCells*si
345d0 7a 65 6f 66 28 75 31 36 29 20 20 20 20 20 20 20  zeof(u16)       
345e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
345f0 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20  /* szCell */.   
34600 20 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a    + pBt->pageSiz
34610 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
34620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34630 2f 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a 20 20  /* aSpace1 */.  
34640 20 20 20 2b 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20     + k*nOld;    
34650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34670 20 2f 2a 20 50 61 67 65 20 63 6f 70 69 65 73 20   /* Page copies 
34680 28 61 70 43 6f 70 79 29 20 2a 2f 0a 20 20 61 70  (apCopy) */.  ap
34690 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 63  Cell = sqlite3Sc
346a0 72 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53  ratchMalloc( szS
346b0 63 72 61 74 63 68 20 29 3b 20 0a 20 20 69 66 28  cratch ); .  if(
346c0 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20   apCell==0 ){.  
346d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
346e0 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61  MEM;.    goto ba
346f0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
34700 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75   }.  szCell = (u
34710 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78  16*)&apCell[nMax
34720 43 65 6c 6c 73 5d 3b 0a 20 20 61 53 70 61 63 65  Cells];.  aSpace
34730 31 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c  1 = (u8*)&szCell
34740 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61  [nMaxCells];.  a
34750 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
34760 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 61 53 70 61  E_ALIGNMENT(aSpa
34770 63 65 31 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20  ce1) );..  /*.  
34780 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73  ** Load pointers
34790 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e   to all cells on
347a0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61   sibling pages a
347b0 6e 64 20 74 68 65 20 64 69 76 69 64 65 72 20 63  nd the divider c
347c0 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74  ells.  ** into t
347d0 68 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b  he local apCell[
347e0 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63  ] array.  Make c
347f0 6f 70 69 65 73 20 6f 66 20 74 68 65 20 64 69 76  opies of the div
34800 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  ider cells.  ** 
34810 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69  into space obtai
34820 6e 65 64 20 66 72 6f 6d 20 61 53 70 61 63 65 31  ned from aSpace1
34830 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20 74 68  [] and remove th
34840 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
34850 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e    ** from pParen
34860 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  t..  **.  ** If 
34870 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  the siblings are
34880 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20   on leaf pages, 
34890 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70  then the child p
348a0 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20  ointers of the. 
348b0 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c   ** divider cell
348c0 73 20 61 72 65 20 73 74 72 69 70 70 65 64 20 66  s are stripped f
348d0 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65  rom the cells be
348e0 66 6f 72 65 20 74 68 65 79 20 61 72 65 20 63 6f  fore they are co
348f0 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61  pied.  ** into a
34900 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68  Space1[].  In th
34910 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c  is way, all cell
34920 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72  s in apCell[] ar
34930 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63  e without.  ** c
34940 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20  hild pointers.  
34950 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  If siblings are 
34960 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e  not leaves, then
34970 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a   all cell in.  *
34980 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75  * apCell[] inclu
34990 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  de child pointer
349a0 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20  s.  Either way, 
349b0 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  all cells in apC
349c0 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61  ell[].  ** are a
349d0 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  like..  **.  ** 
349e0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20  leafCorrection: 
349f0 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61   4 if pPage is a
34a00 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50 61   leaf.  0 if pPa
34a10 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66  ge is not a leaf
34a20 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65 61  ..  **       lea
34a30 66 44 61 74 61 3a 20 20 31 20 69 66 20 70 50 61  fData:  1 if pPa
34a40 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74  ge holds key+dat
34a50 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68 6f  a and pParent ho
34a60 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20  lds only keys.. 
34a70 20 2a 2f 0a 20 20 6c 65 61 66 43 6f 72 72 65 63   */.  leafCorrec
34a80 74 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d  tion = apOld[0]-
34a90 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44  >leaf*4;.  leafD
34aa0 61 74 61 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e  ata = apOld[0]->
34ab0 68 61 73 44 61 74 61 3b 0a 20 20 66 6f 72 28 69  hasData;.  for(i
34ac0 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29  =0; i<nOld; i++)
34ad0 7b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 3b  {.    int limit;
34ae0 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 42 65 66  .    .    /* Bef
34af0 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  ore doing anythi
34b00 6e 67 20 65 6c 73 65 2c 20 74 61 6b 65 20 61 20  ng else, take a 
34b10 63 6f 70 79 20 6f 66 20 74 68 65 20 69 27 74 68  copy of the i'th
34b20 20 6f 72 69 67 69 6e 61 6c 20 73 69 62 6c 69 6e   original siblin
34b30 67 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73  g.    ** The res
34b40 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  t of this functi
34b50 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61  on will use data
34b60 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73   from the copies
34b70 20 72 61 74 68 65 72 0a 20 20 20 20 2a 2a 20 74   rather.    ** t
34b80 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
34b90 20 70 61 67 65 73 20 73 69 6e 63 65 20 74 68 65   pages since the
34ba0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
34bb0 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20  will be in the. 
34bc0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66     ** process of
34bd0 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
34be0 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  en.  */.    MemP
34bf0 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f  age *pOld = apCo
34c00 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65  py[i] = (MemPage
34c10 2a 29 26 61 53 70 61 63 65 31 5b 70 42 74 2d 3e  *)&aSpace1[pBt->
34c20 70 61 67 65 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b  pageSize + k*i];
34c30 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64  .    memcpy(pOld
34c40 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65  , apOld[i], size
34c50 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20  of(MemPage));.  
34c60 20 20 70 4f 6c 64 2d 3e 61 44 61 74 61 20 3d 20    pOld->aData = 
34c70 28 76 6f 69 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b  (void*)&pOld[1];
34c80 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64  .    memcpy(pOld
34c90 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69  ->aData, apOld[i
34ca0 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70  ]->aData, pBt->p
34cb0 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 6c  ageSize);..    l
34cc0 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65  imit = pOld->nCe
34cd0 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c  ll+pOld->nOverfl
34ce0 6f 77 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  ow;.    if( pOld
34cf0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b  ->nOverflow>0 ){
34d00 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
34d10 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20  j<limit; j++){. 
34d20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
34d30 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  Cell<nMaxCells )
34d40 3b 0a 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c  ;.        apCell
34d50 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76  [nCell] = findOv
34d60 65 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c  erflowCell(pOld,
34d70 20 6a 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43   j);.        szC
34d80 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c  ell[nCell] = cel
34d90 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61  lSizePtr(pOld, a
34da0 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20  pCell[nCell]);. 
34db0 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a         nCell++;.
34dc0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
34dd0 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 44 61  e{.      u8 *aDa
34de0 74 61 20 3d 20 70 4f 6c 64 2d 3e 61 44 61 74 61  ta = pOld->aData
34df0 3b 0a 20 20 20 20 20 20 75 31 36 20 6d 61 73 6b  ;.      u16 mask
34e00 50 61 67 65 20 3d 20 70 4f 6c 64 2d 3e 6d 61 73  Page = pOld->mas
34e10 6b 50 61 67 65 3b 0a 20 20 20 20 20 20 75 31 36  kPage;.      u16
34e20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 4f   cellOffset = pO
34e30 6c 64 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a  ld->cellOffset;.
34e40 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
34e50 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20  <limit; j++){.  
34e60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
34e70 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
34e80 0a 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b  .        apCell[
34e90 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 43 65 6c  nCell] = findCel
34ea0 6c 76 32 28 61 44 61 74 61 2c 20 6d 61 73 6b 50  lv2(aData, maskP
34eb0 61 67 65 2c 20 63 65 6c 6c 4f 66 66 73 65 74 2c  age, cellOffset,
34ec0 20 6a 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43   j);.        szC
34ed0 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c  ell[nCell] = cel
34ee0 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61  lSizePtr(pOld, a
34ef0 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20  pCell[nCell]);. 
34f00 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a         nCell++;.
34f10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 20 20        }.    }   
34f20 20 20 20 20 0a 20 20 20 20 69 66 28 20 69 3c 6e      .    if( i<n
34f30 4f 6c 64 2d 31 20 26 26 20 21 6c 65 61 66 44 61  Old-1 && !leafDa
34f40 74 61 29 7b 0a 20 20 20 20 20 20 75 31 36 20 73  ta){.      u16 s
34f50 7a 20 3d 20 28 75 31 36 29 73 7a 4e 65 77 5b 69  z = (u16)szNew[i
34f60 5d 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65  ];.      u8 *pTe
34f70 6d 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  mp;.      assert
34f80 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c  ( nCell<nMaxCell
34f90 73 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c  s );.      szCel
34fa0 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20  l[nCell] = sz;. 
34fb0 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53       pTemp = &aS
34fc0 70 61 63 65 31 5b 69 53 70 61 63 65 31 5d 3b 0a  pace1[iSpace1];.
34fd0 20 20 20 20 20 20 69 53 70 61 63 65 31 20 2b 3d        iSpace1 +=
34fe0 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72   sz;.      asser
34ff0 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 6d 61 78 4c  t( sz<=pBt->maxL
35000 6f 63 61 6c 2b 32 33 20 29 3b 0a 20 20 20 20 20  ocal+23 );.     
35010 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65 31   assert( iSpace1
35020 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 70 61   <= (int)pBt->pa
35030 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
35040 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70  memcpy(pTemp, ap
35050 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20  Div[i], sz);.   
35060 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     apCell[nCell]
35070 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72   = pTemp+leafCor
35080 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 61  rection;.      a
35090 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65  ssert( leafCorre
350a0 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66  ction==0 || leaf
350b0 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b  Correction==4 );
350c0 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43  .      szCell[nC
350d0 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c 6c 5b 6e 43  ell] = szCell[nC
350e0 65 6c 6c 5d 20 2d 20 6c 65 61 66 43 6f 72 72 65  ell] - leafCorre
350f0 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28  ction;.      if(
35100 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a   !pOld->leaf ){.
35110 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
35120 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
35130 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
35140 65 72 74 28 20 70 4f 6c 64 2d 3e 68 64 72 4f 66  ert( pOld->hdrOf
35150 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  fset==0 );.     
35160 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20     /* The right 
35170 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63  pointer of the c
35180 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 20 62  hild page pOld b
35190 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 0a  ecomes the left.
351a0 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74          ** point
351b0 65 72 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  er of the divide
351c0 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20  r cell */.      
351d0 20 20 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b    memcpy(apCell[
351e0 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61  nCell], &pOld->a
351f0 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 20  Data[8], 4);.   
35200 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35210 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f    assert( leafCo
35220 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20  rrection==4 );. 
35230 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c         if( szCel
35240 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20  l[nCell]<4 ){.  
35250 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
35260 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c  t allow any cell
35270 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34  s smaller than 4
35280 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20   bytes. */.     
35290 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
352a0 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  l] = 4;.        
352b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
352c0 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nCell++;.    }. 
352d0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
352e0 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d  gure out the num
352f0 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65  ber of pages nee
35300 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20  ded to hold all 
35310 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a  nCell cells..  *
35320 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d  * Store this num
35330 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73  ber in "k".  Als
35340 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b  o compute szNew[
35350 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20 74  ] which is the t
35360 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  otal.  ** size o
35370 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74  f all cells on t
35380 68 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64  he i-th page and
35390 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20   cntNew[] which 
353a0 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  is the index.  *
353b0 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66  * in apCell[] of
353c0 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64   the cell that d
353d0 69 76 69 64 65 73 20 70 61 67 65 20 69 20 66 72  ivides page i fr
353e0 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20  om page i+1.  . 
353f0 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68   ** cntNew[k] sh
35400 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c  ould equal nCell
35410 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75  ..  **.  ** Valu
35420 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74  es computed by t
35430 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a  his block:.  **.
35440 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b    **           k
35450 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  : The total numb
35460 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61  er of sibling pa
35470 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65  ges.  **    szNe
35480 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65  w[i]: Spaced use
35490 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69  d on the i-th si
354a0 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a  bling page..  **
354b0 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e     cntNew[i]: In
354c0 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  dex in apCell[] 
354d0 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72  and szCell[] for
354e0 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
354f0 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  to.  **         
35500 20 20 20 20 20 74 68 65 20 72 69 67 68 74 20 6f       the right o
35510 66 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69  f the i-th sibli
35520 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73  ng page..  ** us
35530 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65  ableSpace: Numbe
35540 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
35550 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  ace available on
35560 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20   each sibling.. 
35570 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62   ** .  */.  usab
35580 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75  leSpace = pBt->u
35590 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b  sableSize - 12 +
355a0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
355b0 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d  .  for(subtotal=
355c0 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  k=i=0; i<nCell; 
355d0 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
355e0 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( i<nMaxCells );
355f0 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d  .    subtotal +=
35600 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a   szCell[i] + 2;.
35610 20 20 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c      if( subtotal
35620 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20 29   > usableSpace )
35630 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d  {.      szNew[k]
35640 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a   = subtotal - sz
35650 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63  Cell[i];.      c
35660 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20  ntNew[k] = i;.  
35670 20 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61      if( leafData
35680 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ i--; }.     
35690 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20   subtotal = 0;. 
356a0 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 20 20       k++;.      
356b0 69 66 28 20 6b 3e 4e 42 2b 31 20 29 7b 20 72 63  if( k>NB+1 ){ rc
356c0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
356d0 54 5f 42 4b 50 54 3b 20 67 6f 74 6f 20 62 61 6c  T_BKPT; goto bal
356e0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a  ance_cleanup; }.
356f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65      }.  }.  szNe
35700 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b  w[k] = subtotal;
35710 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e  .  cntNew[k] = n
35720 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20  Cell;.  k++;..  
35730 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b  /*.  ** The pack
35740 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20  ing computed by 
35750 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f  the previous blo
35760 63 6b 20 69 73 20 62 69 61 73 65 64 20 74 6f 77  ck is biased tow
35770 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73  ard the siblings
35780 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66  .  ** on the lef
35790 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66  t side.  The lef
357a0 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61  t siblings are a
357b0 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c  lways nearly ful
357c0 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a  l, while the.  *
357d0 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  * right-most sib
357e0 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65  ling might be ne
357f0 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69  arly empty.  Thi
35800 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  s block of code 
35810 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f  attempts.  ** to
35820 20 61 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b   adjust the pack
35830 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20  ing of siblings 
35840 74 6f 20 67 65 74 20 61 20 62 65 74 74 65 72 20  to get a better 
35850 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20  balance..  **.  
35860 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65  ** This adjustme
35870 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20  nt is more than 
35880 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
35890 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62    The packing ab
358a0 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62  ove might.  ** b
358b0 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61  e so out of bala
358c0 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c  nce as to be ill
358d0 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70  egal.  For examp
358e0 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  le, the right-mo
358f0 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20  st.  ** sibling 
35900 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74  might be complet
35910 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73  ely empty.  This
35920 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e   adjustment is n
35930 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a  ot optional..  *
35940 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69  /.  for(i=k-1; i
35950 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e  >0; i--){.    in
35960 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65  t szRight = szNe
35970 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f  w[i];  /* Size o
35980 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65  f sibling on the
35990 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e   right */.    in
359a0 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77  t szLeft = szNew
359b0 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f  [i-1]; /* Size o
359c0 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65  f sibling on the
359d0 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74   left */.    int
359e0 20 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   r;             
359f0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67   /* Index of rig
35a00 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20  ht-most cell in 
35a10 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a  left sibling */.
35a20 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20      int d;      
35a30 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
35a40 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74   of first cell t
35a50 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69  o the left of ri
35a60 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a  ght sibling */..
35a70 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69      r = cntNew[i
35a80 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d  -1] - 1;.    d =
35a90 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74   r + 1 - leafDat
35aa0 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  a;.    assert( d
35ab0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
35ac0 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78    assert( r<nMax
35ad0 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69  Cells );.    whi
35ae0 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 0a  le( szRight==0 .
35af0 20 20 20 20 20 20 20 7c 7c 20 28 21 62 42 75 6c         || (!bBul
35b00 6b 20 26 26 20 73 7a 52 69 67 68 74 2b 73 7a 43  k && szRight+szC
35b10 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74  ell[d]+2<=szLeft
35b20 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 29 20  -(szCell[r]+2)) 
35b30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 7a  .    ){.      sz
35b40 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b  Right += szCell[
35b50 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a  d] + 2;.      sz
35b60 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72  Left -= szCell[r
35b70 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e 74  ] + 2;.      cnt
35b80 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20  New[i-1]--;.    
35b90 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31    r = cntNew[i-1
35ba0 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64 20 3d  ] - 1;.      d =
35bb0 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74   r + 1 - leafDat
35bc0 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e  a;.    }.    szN
35bd0 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b  ew[i] = szRight;
35be0 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20  .    szNew[i-1] 
35bf0 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20  = szLeft;.  }.. 
35c00 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20 66 6f   /* Either we fo
35c10 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  und one or more 
35c20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d  cells (cntnew[0]
35c30 29 3e 30 29 20 6f 72 20 70 50 61 67 65 20 69 73  )>0) or pPage is
35c40 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20  .  ** a virtual 
35c50 72 6f 6f 74 20 70 61 67 65 2e 20 20 41 20 76 69  root page.  A vi
35c60 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
35c70 69 73 20 77 68 65 6e 20 74 68 65 20 72 65 61 6c  is when the real
35c80 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20   root.  ** page 
35c90 69 73 20 70 61 67 65 20 31 20 61 6e 64 20 77 65  is page 1 and we
35ca0 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 63 68   are the only ch
35cb0 69 6c 64 20 6f 66 20 74 68 61 74 20 70 61 67 65  ild of that page
35cc0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 50 44 41  ..  **.  ** UPDA
35cd0 54 45 3a 20 20 54 68 65 20 61 73 73 65 72 74 28  TE:  The assert(
35ce0 29 20 62 65 6c 6f 77 20 69 73 20 6e 6f 74 20 6e  ) below is not n
35cf0 65 63 65 73 73 61 72 69 6c 79 20 74 72 75 65 20  ecessarily true 
35d00 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  if the database.
35d10 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 63 6f 72    ** file is cor
35d20 72 75 70 74 2e 20 20 54 68 65 20 63 6f 72 72 75  rupt.  The corru
35d30 70 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 65  ption will be de
35d40 74 65 63 74 65 64 20 61 6e 64 20 72 65 70 6f 72  tected and repor
35d50 74 65 64 20 6c 61 74 65 72 0a 20 20 2a 2a 20 69  ted later.  ** i
35d60 6e 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  n this procedure
35d70 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20   so there is no 
35d80 6e 65 65 64 20 74 6f 20 61 63 74 20 75 70 6f 6e  need to act upon
35d90 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 23 69   it now..  */.#i
35da0 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 63 6e  f 0.  assert( cn
35db0 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50  tNew[0]>0 || (pP
35dc0 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26  arent->pgno==1 &
35dd0 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  & pParent->nCell
35de0 3d 3d 30 29 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  ==0) );.#endif..
35df0 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
35e00 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64  E: old: %d %d %d
35e10 20 20 22 2c 0a 20 20 20 20 61 70 4f 6c 64 5b 30    ",.    apOld[0
35e20 5d 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 6e 4f  ]->pgno, .    nO
35e30 6c 64 3e 3d 32 20 3f 20 61 70 4f 6c 64 5b 31 5d  ld>=2 ? apOld[1]
35e40 2d 3e 70 67 6e 6f 20 3a 20 30 2c 0a 20 20 20 20  ->pgno : 0,.    
35e50 6e 4f 6c 64 3e 3d 33 20 3f 20 61 70 4f 6c 64 5b  nOld>=3 ? apOld[
35e60 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 0a 20 20 29  2]->pgno : 0.  )
35e70 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c  );..  /*.  ** Al
35e80 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70 61 67  locate k new pag
35e90 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64 20 70  es.  Reuse old p
35ea0 61 67 65 73 20 77 68 65 72 65 20 70 6f 73 73 69  ages where possi
35eb0 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
35ec0 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d  apOld[0]->pgno<=
35ed0 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  1 ){.    rc = SQ
35ee0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
35ef0 54 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61  T;.    goto bala
35f00 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
35f10 0a 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20 61  .  pageFlags = a
35f20 70 4f 6c 64 5b 30 5d 2d 3e 61 44 61 74 61 5b 30  pOld[0]->aData[0
35f30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
35f40 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d  k; i++){.    Mem
35f50 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Page *pNew;.    
35f60 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20  if( i<nOld ){.  
35f70 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77      pNew = apNew
35f80 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a  [i] = apOld[i];.
35f90 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d        apOld[i] =
35fa0 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
35fb0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
35fc0 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 3b  (pNew->pDbPage);
35fd0 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20  .      nNew++;. 
35fe0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
35ff0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
36000 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  up;.    }else{. 
36010 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30       assert( i>0
36020 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   );.      rc = a
36030 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
36040 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67  (pBt, &pNew, &pg
36050 6e 6f 2c 20 28 62 42 75 6c 6b 20 3f 20 31 20 3a  no, (bBulk ? 1 :
36060 20 70 67 6e 6f 29 2c 20 30 29 3b 0a 20 20 20 20   pgno), 0);.    
36070 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
36080 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
36090 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20  .      apNew[i] 
360a0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e  = pNew;.      nN
360b0 65 77 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ew++;..      /* 
360c0 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  Set the pointer-
360d0 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 74 68  map entry for th
360e0 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61  e new sibling pa
360f0 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ge. */.      if(
36100 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
36110 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50  .        ptrmapP
36120 75 74 28 70 42 74 2c 20 70 4e 65 77 2d 3e 70 67  ut(pBt, pNew->pg
36130 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
36140 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c  , pParent->pgno,
36150 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69   &rc);.        i
36160 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
36170 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
36180 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
36190 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  up;.        }.  
361a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
361b0 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f  .  /* Free any o
361c0 6c 64 20 70 61 67 65 73 20 74 68 61 74 20 77 65  ld pages that we
361d0 72 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73  re not reused as
361e0 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f   new pages..  */
361f0 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64  .  while( i<nOld
36200 20 29 7b 0a 20 20 20 20 66 72 65 65 50 61 67 65   ){.    freePage
36210 28 61 70 4f 6c 64 5b 69 5d 2c 20 26 72 63 29 3b  (apOld[i], &rc);
36220 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
36230 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
36240 75 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  up;.    releaseP
36250 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  age(apOld[i]);. 
36260 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b     apOld[i] = 0;
36270 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20  .    i++;.  }.. 
36280 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65   /*.  ** Put the
36290 20 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61 63   new pages in ac
362a0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20  cending order.  
362b0 54 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20  This helps to.  
362c0 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20  ** keep entries 
362d0 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  in the disk file
362e0 20 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61   in order so tha
362f0 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66  t a scan.  ** of
36300 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 20   the table is a 
36310 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f  linear scan thro
36320 75 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54  ugh the file.  T
36330 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e  hat.  ** in turn
36340 20 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61   helps the opera
36350 74 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64  ting system to d
36360 65 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a  eliver pages.  *
36370 2a 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20  * from the disk 
36380 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20  more rapidly..  
36390 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32  **.  ** An O(n^2
363a0 29 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74  ) insertion sort
363b0 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73   algorithm is us
363c0 65 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20  ed, but since.  
363d0 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f  ** n is never mo
363e0 72 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d  re than NB (a sm
363f0 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74  all constant), t
36400 68 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20  hat should.  ** 
36410 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d  not be a problem
36420 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
36430 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65   NB==3, this one
36440 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61   optimization ma
36450 6b 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  kes the database
36460 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20  .  ** about 25% 
36470 66 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65  faster for large
36480 20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20   insertions and 
36490 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  deletions..  */.
364a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31    for(i=0; i<k-1
364b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
364c0 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 69 5d 2d  minV = apNew[i]-
364d0 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 6e 74 20 6d  >pgno;.    int m
364e0 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72  inI = i;.    for
364f0 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b  (j=i+1; j<k; j++
36500 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 4e  ){.      if( apN
36510 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3c 28 75 6e 73  ew[j]->pgno<(uns
36520 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20  igned)minV ){.  
36530 20 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a        minI = j;.
36540 20 20 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 61          minV = a
36550 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20  pNew[j]->pgno;. 
36560 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
36570 20 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20   if( minI>i ){. 
36580 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54       MemPage *pT
36590 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e  ;.      pT = apN
365a0 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4e  ew[i];.      apN
365b0 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69  ew[i] = apNew[mi
365c0 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  nI];.      apNew
365d0 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20  [minI] = pT;.   
365e0 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28   }.  }.  TRACE((
365f0 22 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64 28  "new: %d(%d) %d(
36600 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
36610 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20  ) %d(%d)\n",.   
36620 20 61 70 4e 65 77 5b 30 5d 2d 3e 70 67 6e 6f 2c   apNew[0]->pgno,
36630 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e   szNew[0],.    n
36640 4e 65 77 3e 3d 32 20 3f 20 61 70 4e 65 77 5b 31  New>=2 ? apNew[1
36650 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65  ]->pgno : 0, nNe
36660 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20  w>=2 ? szNew[1] 
36670 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33  : 0,.    nNew>=3
36680 20 3f 20 61 70 4e 65 77 5b 32 5d 2d 3e 70 67 6e   ? apNew[2]->pgn
36690 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f  o : 0, nNew>=3 ?
366a0 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20   szNew[2] : 0,. 
366b0 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 61 70 4e     nNew>=4 ? apN
366c0 65 77 5b 33 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c  ew[3]->pgno : 0,
366d0 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77   nNew>=4 ? szNew
366e0 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [3] : 0,.    nNe
366f0 77 3e 3d 35 20 3f 20 61 70 4e 65 77 5b 34 5d 2d  w>=5 ? apNew[4]-
36700 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e  >pgno : 0, nNew>
36710 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20  =5 ? szNew[4] : 
36720 30 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  0));..  assert( 
36730 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
36740 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d  iteable(pParent-
36750 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 70  >pDbPage) );.  p
36760 75 74 34 62 79 74 65 28 70 52 69 67 68 74 2c 20  ut4byte(pRight, 
36770 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70  apNew[nNew-1]->p
36780 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  gno);..  /*.  **
36790 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69 62 75   Evenly distribu
367a0 74 65 20 74 68 65 20 64 61 74 61 20 69 6e 20 61  te the data in a
367b0 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74  pCell[] across t
367c0 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20  he new pages..  
367d0 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69 64 65  ** Insert divide
367e0 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61  r cells into pPa
367f0 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73 61 72  rent as necessar
36800 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b  y..  */.  j = 0;
36810 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e  .  for(i=0; i<nN
36820 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a  ew; i++){.    /*
36830 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20 6e 65   Assemble the ne
36840 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20  w sibling page. 
36850 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
36860 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b  pNew = apNew[i];
36870 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e  .    assert( j<n
36880 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
36890 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70  zeroPage(pNew, p
368a0 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 20 20 61  ageFlags);.    a
368b0 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77  ssemblePage(pNew
368c0 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26  , cntNew[i]-j, &
368d0 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65  apCell[j], &szCe
368e0 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65  ll[j]);.    asse
368f0 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e  rt( pNew->nCell>
36900 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26  0 || (nNew==1 &&
36910 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29   cntNew[0]==0) )
36920 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
36930 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ew->nOverflow==0
36940 20 29 3b 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74   );..    j = cnt
36950 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20  New[i];..    /* 
36960 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  If the sibling p
36970 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62  age assembled ab
36980 6f 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20  ove was not the 
36990 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  right-most sibli
369a0 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72  ng,.    ** inser
369b0 74 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  t a divider cell
369c0 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
369d0 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
369e0 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4e 65 77    assert( i<nNew
369f0 2d 31 20 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c 20 29  -1 || j==nCell )
36a00 3b 0a 20 20 20 20 69 66 28 20 6a 3c 6e 43 65 6c  ;.    if( j<nCel
36a10 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70  l ){.      u8 *p
36a20 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a  Cell;.      u8 *
36a30 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74  pTemp;.      int
36a40 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65   sz;..      asse
36a50 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( j<nMaxCells 
36a60 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  );.      pCell =
36a70 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20   apCell[j];.    
36a80 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d    sz = szCell[j]
36a90 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   + leafCorrectio
36aa0 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d  n;.      pTemp =
36ab0 20 26 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f 76   &aOvflSpace[iOv
36ac0 66 6c 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20  flSpace];.      
36ad0 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20  if( !pNew->leaf 
36ae0 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
36af0 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38  y(&pNew->aData[8
36b00 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20  ], pCell, 4);.  
36b10 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65      }else if( le
36b20 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  afData ){.      
36b30 20 20 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65    /* If the tree
36b40 20 69 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20   is a leaf-data 
36b50 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69  tree, and the si
36b60 62 6c 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65  blings are leave
36b70 73 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  s, .        ** t
36b80 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
36b90 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20  divider cell in 
36ba0 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61  apCell[]. Instea
36bb0 64 2c 20 74 68 65 20 64 69 76 69 64 65 72 20 0a  d, the divider .
36bc0 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20          ** cell 
36bd0 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20  consists of the 
36be0 69 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20  integer key for 
36bf0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  the right-most c
36c00 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20  ell of .        
36c10 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70  ** the sibling-p
36c20 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62  age assembled ab
36c30 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20  ove only..      
36c40 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c    */.        Cel
36c50 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
36c60 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20      j--;.       
36c70 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
36c80 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b  tr(pNew, apCell[
36c90 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  j], &info);.    
36ca0 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d      pCell = pTem
36cb0 70 3b 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20  p;.        sz = 
36cc0 34 20 2b 20 70 75 74 56 61 72 69 6e 74 28 26 70  4 + putVarint(&p
36cd0 43 65 6c 6c 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b  Cell[4], info.nK
36ce0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65  ey);.        pTe
36cf0 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  mp = 0;.      }e
36d00 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65  lse{.        pCe
36d10 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20  ll -= 4;.       
36d20 20 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65   /* Obscure case
36d30 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61   for non-leaf-da
36d40 74 61 20 74 72 65 65 73 3a 20 49 66 20 74 68 65  ta trees: If the
36d50 20 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77   cell at pCell w
36d60 61 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  as.        ** pr
36d70 65 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20  eviously stored 
36d80 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20  on a leaf node, 
36d90 61 6e 64 20 69 74 73 20 72 65 70 6f 72 74 65 64  and its reported
36da0 20 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20   size was 4.    
36db0 20 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68      ** bytes, th
36dc0 65 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c  en it may actual
36dd0 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68  ly be smaller th
36de0 61 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  an this .       
36df0 20 2a 2a 20 28 73 65 65 20 62 74 72 65 65 50 61   ** (see btreePa
36e00 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20  rseCellPtr(), 4 
36e10 62 79 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e  bytes is the min
36e20 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20  imum size of.   
36e30 20 20 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c       ** any cell
36e40 29 2e 20 42 75 74 20 69 74 20 69 73 20 69 6d 70  ). But it is imp
36e50 6f 72 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74  ortant to pass t
36e60 68 65 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20  he correct size 
36e70 74 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  to .        ** i
36e80 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20  nsertCell(), so 
36e90 72 65 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c  reparse the cell
36ea0 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a   now..        **
36eb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  .        ** Note
36ec0 20 74 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e   that this can n
36ed0 65 76 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61  ever happen in a
36ee0 6e 20 53 51 4c 69 74 65 20 64 61 74 61 20 66 69  n SQLite data fi
36ef0 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20  le, as all.     
36f00 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20     ** cells are 
36f10 61 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73  at least 4 bytes
36f20 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e  . It only happen
36f30 73 20 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65  s in b-trees use
36f40 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  d.        ** to 
36f50 65 76 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45  evaluate "IN (SE
36f60 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73  LECT ...)" and s
36f70 69 6d 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a  imilar clauses..
36f80 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
36f90 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d     if( szCell[j]
36fa0 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==4 ){.         
36fb0 20 61 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72   assert(leafCorr
36fc0 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20  ection==4);.    
36fd0 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53        sz = cellS
36fe0 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20  izePtr(pParent, 
36ff0 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  pCell);.        
37000 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
37010 69 4f 76 66 6c 53 70 61 63 65 20 2b 3d 20 73 7a  iOvflSpace += sz
37020 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
37030 73 7a 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  sz<=pBt->maxLoca
37040 6c 2b 32 33 20 29 3b 0a 20 20 20 20 20 20 61 73  l+23 );.      as
37050 73 65 72 74 28 20 69 4f 76 66 6c 53 70 61 63 65  sert( iOvflSpace
37060 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 70 61   <= (int)pBt->pa
37070 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
37080 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65  insertCell(pPare
37090 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c  nt, nxDiv, pCell
370a0 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20 70 4e 65  , sz, pTemp, pNe
370b0 77 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  w->pgno, &rc);. 
370c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
370d0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61  ITE_OK ) goto ba
370e0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
370f0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
37100 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
37110 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  able(pParent->pD
37120 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
37130 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69   j++;.      nxDi
37140 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  v++;.    }.  }. 
37150 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c   assert( j==nCel
37160 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  l );.  assert( n
37170 4f 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  Old>0 );.  asser
37180 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 69  t( nNew>0 );.  i
37190 66 28 20 28 70 61 67 65 46 6c 61 67 73 20 26 20  f( (pageFlags & 
371a0 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a  PTF_LEAF)==0 ){.
371b0 20 20 20 20 75 38 20 2a 7a 43 68 69 6c 64 20 3d      u8 *zChild =
371c0 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d   &apCopy[nOld-1]
371d0 2d 3e 61 44 61 74 61 5b 38 5d 3b 0a 20 20 20 20  ->aData[8];.    
371e0 6d 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e  memcpy(&apNew[nN
371f0 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c  ew-1]->aData[8],
37200 20 7a 43 68 69 6c 64 2c 20 34 29 3b 0a 20 20 7d   zChild, 4);.  }
37210 0a 0a 20 20 69 66 28 20 69 73 52 6f 6f 74 20 26  ..  if( isRoot &
37220 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  & pParent->nCell
37230 3d 3d 30 20 26 26 20 70 50 61 72 65 6e 74 2d 3e  ==0 && pParent->
37240 68 64 72 4f 66 66 73 65 74 3c 3d 61 70 4e 65 77  hdrOffset<=apNew
37250 5b 30 5d 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  [0]->nFree ){.  
37260 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61    /* The root pa
37270 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ge of the b-tree
37280 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 6e 6f   now contains no
37290 20 63 65 6c 6c 73 2e 20 54 68 65 20 6f 6e 6c 79   cells. The only
372a0 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20   sibling.    ** 
372b0 70 61 67 65 20 69 73 20 74 68 65 20 72 69 67 68  page is the righ
372c0 74 2d 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70  t-child of the p
372d0 61 72 65 6e 74 2e 20 43 6f 70 79 20 74 68 65 20  arent. Copy the 
372e0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
372f0 20 20 20 20 2a 2a 20 63 68 69 6c 64 20 70 61 67      ** child pag
37300 65 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  e into the paren
37310 74 2c 20 64 65 63 72 65 61 73 69 6e 67 20 74 68  t, decreasing th
37320 65 20 6f 76 65 72 61 6c 6c 20 68 65 69 67 68 74  e overall height
37330 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 62   of the.    ** b
37340 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
37350 62 79 20 6f 6e 65 2e 20 54 68 69 73 20 69 73 20  by one. This is 
37360 64 65 73 63 72 69 62 65 64 20 61 73 20 74 68 65  described as the
37370 20 22 62 61 6c 61 6e 63 65 2d 73 68 61 6c 6c 6f   "balance-shallo
37380 77 65 72 22 0a 20 20 20 20 2a 2a 20 73 75 62 2d  wer".    ** sub-
37390 61 6c 67 6f 72 69 74 68 6d 20 69 6e 20 73 6f 6d  algorithm in som
373a0 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2e  e documentation.
373b0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
373c0 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
373d0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
373e0 65 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63  e, the call to c
373f0 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 29  opyNodeContent()
37400 20 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 61 6c   .    ** sets al
37410 6c 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  l pointer-map en
37420 74 72 69 65 73 20 63 6f 72 72 65 73 70 6f 6e 64  tries correspond
37430 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20  ing to database 
37440 69 6d 61 67 65 20 70 61 67 65 73 20 0a 20 20 20  image pages .   
37450 20 2a 2a 20 66 6f 72 20 77 68 69 63 68 20 74 68   ** for which th
37460 65 20 70 6f 69 6e 74 65 72 20 69 73 20 73 74 6f  e pointer is sto
37470 72 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63  red within the c
37480 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 63 6f 70  ontent being cop
37490 69 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ied..    **.    
374a0 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 73  ** The second as
374b0 73 65 72 74 20 62 65 6c 6f 77 20 76 65 72 69 66  sert below verif
374c0 69 65 73 20 74 68 61 74 20 74 68 65 20 63 68 69  ies that the chi
374d0 6c 64 20 70 61 67 65 20 69 73 20 64 65 66 72 61  ld page is defra
374e0 67 6d 65 6e 74 65 64 0a 20 20 20 20 2a 2a 20 28  gmented.    ** (
374f0 69 74 20 6d 75 73 74 20 62 65 2c 20 61 73 20 69  it must be, as i
37500 74 20 77 61 73 20 6a 75 73 74 20 72 65 63 6f 6e  t was just recon
37510 73 74 72 75 63 74 65 64 20 75 73 69 6e 67 20 61  structed using a
37520 73 73 65 6d 62 6c 65 50 61 67 65 28 29 29 2e 20  ssemblePage()). 
37530 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 69  This.    ** is i
37540 6d 70 6f 72 74 61 6e 74 20 69 66 20 74 68 65 20  mportant if the 
37550 70 61 72 65 6e 74 20 70 61 67 65 20 68 61 70 70  parent page happ
37560 65 6e 73 20 74 6f 20 62 65 20 70 61 67 65 20 31  ens to be page 1
37570 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
37580 0a 20 20 20 20 2a 2a 20 69 6d 61 67 65 2e 20 20  .    ** image.  
37590 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  */.    assert( n
375a0 4e 65 77 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73  New==1 );.    as
375b0 73 65 72 74 28 20 61 70 4e 65 77 5b 30 5d 2d 3e  sert( apNew[0]->
375c0 6e 46 72 65 65 20 3d 3d 20 0a 20 20 20 20 20 20  nFree == .      
375d0 20 20 28 67 65 74 32 62 79 74 65 28 26 61 70 4e    (get2byte(&apN
375e0 65 77 5b 30 5d 2d 3e 61 44 61 74 61 5b 35 5d 29  ew[0]->aData[5])
375f0 2d 61 70 4e 65 77 5b 30 5d 2d 3e 63 65 6c 6c 4f  -apNew[0]->cellO
37600 66 66 73 65 74 2d 61 70 4e 65 77 5b 30 5d 2d 3e  ffset-apNew[0]->
37610 6e 43 65 6c 6c 2a 32 29 20 0a 20 20 20 20 29 3b  nCell*2) .    );
37620 0a 20 20 20 20 63 6f 70 79 4e 6f 64 65 43 6f 6e  .    copyNodeCon
37630 74 65 6e 74 28 61 70 4e 65 77 5b 30 5d 2c 20 70  tent(apNew[0], p
37640 50 61 72 65 6e 74 2c 20 26 72 63 29 3b 0a 20 20  Parent, &rc);.  
37650 20 20 66 72 65 65 50 61 67 65 28 61 70 4e 65 77    freePage(apNew
37660 5b 30 5d 2c 20 26 72 63 29 3b 0a 20 20 7d 65 6c  [0], &rc);.  }el
37670 73 65 20 69 66 28 20 49 53 41 55 54 4f 56 41 43  se if( ISAUTOVAC
37680 55 55 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69  UUM ){.    /* Fi
37690 78 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  x the pointer-ma
376a0 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
376b0 6c 20 74 68 65 20 63 65 6c 6c 73 20 74 68 61 74  l the cells that
376c0 20 77 65 72 65 20 73 68 69 66 74 65 64 20 61 72   were shifted ar
376d0 6f 75 6e 64 2e 20 0a 20 20 20 20 2a 2a 20 54 68  ound. .    ** Th
376e0 65 72 65 20 61 72 65 20 73 65 76 65 72 61 6c 20  ere are several 
376f0 64 69 66 66 65 72 65 6e 74 20 74 79 70 65 73 20  different types 
37700 6f 66 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  of pointer-map e
37710 6e 74 72 69 65 73 20 74 68 61 74 20 6e 65 65 64  ntries that need
37720 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 64 65   to.    ** be de
37730 61 6c 74 20 77 69 74 68 20 62 79 20 74 68 69 73  alt with by this
37740 20 72 6f 75 74 69 6e 65 2e 20 53 6f 6d 65 20 6f   routine. Some o
37750 66 20 74 68 65 73 65 20 68 61 76 65 20 62 65 65  f these have bee
37760 6e 20 73 65 74 20 61 6c 72 65 61 64 79 2c 20 62  n set already, b
37770 75 74 0a 20 20 20 20 2a 2a 20 6d 61 6e 79 20 68  ut.    ** many h
37780 61 76 65 20 6e 6f 74 2e 20 54 68 65 20 66 6f 6c  ave not. The fol
37790 6c 6f 77 69 6e 67 20 69 73 20 61 20 73 75 6d 6d  lowing is a summ
377a0 61 72 79 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ary:.    **.    
377b0 2a 2a 20 20 20 31 29 20 54 68 65 20 65 6e 74 72  **   1) The entr
377c0 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ies associated w
377d0 69 74 68 20 6e 65 77 20 73 69 62 6c 69 6e 67 20  ith new sibling 
377e0 70 61 67 65 73 20 74 68 61 74 20 77 65 72 65 20  pages that were 
377f0 6e 6f 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  not.    **      
37800 73 69 62 6c 69 6e 67 73 20 77 68 65 6e 20 74 68  siblings when th
37810 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  is function was 
37820 63 61 6c 6c 65 64 2e 20 54 68 65 73 65 20 68 61  called. These ha
37830 76 65 20 61 6c 72 65 61 64 79 0a 20 20 20 20 2a  ve already.    *
37840 2a 20 20 20 20 20 20 62 65 65 6e 20 73 65 74 2e  *      been set.
37850 20 57 65 20 64 6f 6e 27 74 20 6e 65 65 64 20 74   We don't need t
37860 6f 20 77 6f 72 72 79 20 61 62 6f 75 74 20 6f 6c  o worry about ol
37870 64 20 73 69 62 6c 69 6e 67 73 20 74 68 61 74 20  d siblings that 
37880 77 65 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  were.    **     
37890 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72   moved to the fr
378a0 65 65 2d 6c 69 73 74 20 2d 20 74 68 65 20 66 72  ee-list - the fr
378b0 65 65 50 61 67 65 28 29 20 63 6f 64 65 20 68 61  eePage() code ha
378c0 73 20 74 61 6b 65 6e 20 63 61 72 65 0a 20 20 20  s taken care.   
378d0 20 2a 2a 20 20 20 20 20 20 6f 66 20 74 68 6f 73   **      of thos
378e0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
378f0 20 20 20 32 29 20 54 68 65 20 70 6f 69 6e 74 65     2) The pointe
37900 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 61 73  r-map entries as
37910 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
37920 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
37930 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 70 61 67  .    **      pag
37940 65 20 69 6e 20 61 6e 79 20 6f 76 65 72 66 6c 6f  e in any overflo
37950 77 20 63 68 61 69 6e 73 20 75 73 65 64 20 62 79  w chains used by
37960 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
37970 6c 73 2e 20 54 68 65 73 65 20 0a 20 20 20 20 2a  ls. These .    *
37980 2a 20 20 20 20 20 20 68 61 76 65 20 61 6c 73 6f  *      have also
37990 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 74 61   already been ta
379a0 6b 65 6e 20 63 61 72 65 20 6f 66 20 62 79 20 74  ken care of by t
379b0 68 65 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 20  he insertCell() 
379c0 63 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  code..    **.   
379d0 20 2a 2a 20 20 20 33 29 20 49 66 20 74 68 65 20   **   3) If the 
379e0 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72  sibling pages ar
379f0 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68  e not leaves, th
37a00 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  en the child pag
37a10 65 73 20 6f 66 0a 20 20 20 20 2a 2a 20 20 20 20  es of.    **    
37a20 20 20 63 65 6c 6c 73 20 73 74 6f 72 65 64 20 6f    cells stored o
37a30 6e 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  n the sibling pa
37a40 67 65 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20  ges may need to 
37a50 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20  be updated..    
37a60 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 34 29 20 49  **.    **   4) I
37a70 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  f the sibling pa
37a80 67 65 73 20 61 72 65 20 6e 6f 74 20 69 6e 74 65  ges are not inte
37a90 72 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65  rnal intkey node
37aa0 73 2c 20 74 68 65 6e 20 61 6e 79 0a 20 20 20 20  s, then any.    
37ab0 2a 2a 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77  **      overflow
37ac0 20 70 61 67 65 73 20 75 73 65 64 20 62 79 20 74   pages used by t
37ad0 68 65 73 65 20 63 65 6c 6c 73 20 6d 61 79 20 6e  hese cells may n
37ae0 65 65 64 20 74 6f 20 62 65 20 75 70 64 61 74 65  eed to be update
37af0 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 28 69  d.    **      (i
37b00 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20 6e  nternal intkey n
37b10 6f 64 65 73 20 6e 65 76 65 72 20 63 6f 6e 74 61  odes never conta
37b20 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6f  in pointers to o
37b30 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29 2e 0a  verflow pages)..
37b40 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
37b50 35 29 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  5) If the siblin
37b60 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20  g pages are not 
37b70 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65  leaves, then the
37b80 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
37b90 20 2a 2a 20 20 20 20 20 20 65 6e 74 72 69 65 73   **      entries
37ba0 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 63   for the right-c
37bb0 68 69 6c 64 20 70 61 67 65 73 20 6f 66 20 65 61  hild pages of ea
37bc0 63 68 20 73 69 62 6c 69 6e 67 20 6d 61 79 20 6e  ch sibling may n
37bd0 65 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  eed.    **      
37be0 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20  to be updated.. 
37bf0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 61 73     **.    ** Cas
37c00 65 73 20 31 20 61 6e 64 20 32 20 61 72 65 20 64  es 1 and 2 are d
37c10 65 61 6c 74 20 77 69 74 68 20 61 62 6f 76 65 20  ealt with above 
37c20 62 79 20 6f 74 68 65 72 20 63 6f 64 65 2e 20 54  by other code. T
37c30 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62  he next.    ** b
37c40 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20  lock deals with 
37c50 63 61 73 65 73 20 33 20 61 6e 64 20 34 20 61 6e  cases 3 and 4 an
37c60 64 20 74 68 65 20 6f 6e 65 20 61 66 74 65 72 20  d the one after 
37c70 74 68 61 74 2c 20 63 61 73 65 20 35 2e 20 53 69  that, case 5. Si
37c80 6e 63 65 0a 20 20 20 20 2a 2a 20 73 65 74 74 69  nce.    ** setti
37c90 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70  ng a pointer map
37ca0 20 65 6e 74 72 79 20 69 73 20 61 20 72 65 6c 61   entry is a rela
37cb0 74 69 76 65 6c 79 20 65 78 70 65 6e 73 69 76 65  tively expensive
37cc0 20 6f 70 65 72 61 74 69 6f 6e 2c 20 74 68 69 73   operation, this
37cd0 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 6f 6e 6c  .    ** code onl
37ce0 79 20 73 65 74 73 20 70 6f 69 6e 74 65 72 20 6d  y sets pointer m
37cf0 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 63  ap entries for c
37d00 68 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f 77  hild or overflow
37d10 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
37d20 0a 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79  .    ** actually
37d30 20 6d 6f 76 65 64 20 62 65 74 77 65 65 6e 20 70   moved between p
37d40 61 67 65 73 2e 20 20 2a 2f 0a 20 20 20 20 4d 65  ages.  */.    Me
37d50 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70  mPage *pNew = ap
37d60 4e 65 77 5b 30 5d 3b 0a 20 20 20 20 4d 65 6d 50  New[0];.    MemP
37d70 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f  age *pOld = apCo
37d80 70 79 5b 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e  py[0];.    int n
37d90 4f 76 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d  Overflow = pOld-
37da0 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20  >nOverflow;.    
37db0 69 6e 74 20 69 4e 65 78 74 4f 6c 64 20 3d 20 70  int iNextOld = p
37dc0 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 6e 4f 76  Old->nCell + nOv
37dd0 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20  erflow;.    int 
37de0 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 6e 4f 76  iOverflow = (nOv
37df0 65 72 66 6c 6f 77 20 3f 20 70 4f 6c 64 2d 3e 61  erflow ? pOld->a
37e00 69 4f 76 66 6c 5b 30 5d 20 3a 20 2d 31 29 3b 0a  iOvfl[0] : -1);.
37e10 20 20 20 20 6a 20 3d 20 30 3b 20 20 20 20 20 20      j = 0;      
37e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37e30 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
37e40 74 20 27 6f 6c 64 27 20 73 69 62 6c 69 6e 67 20  t 'old' sibling 
37e50 70 61 67 65 20 2a 2f 0a 20 20 20 20 6b 20 3d 20  page */.    k = 
37e60 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
37e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37e80 2a 20 43 75 72 72 65 6e 74 20 27 6e 65 77 27 20  * Current 'new' 
37e90 73 69 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a  sibling page */.
37ea0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
37eb0 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
37ec0 20 20 69 6e 74 20 69 73 44 69 76 69 64 65 72 20    int isDivider 
37ed0 3d 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  = 0;.      while
37ee0 28 20 69 3d 3d 69 4e 65 78 74 4f 6c 64 20 29 7b  ( i==iNextOld ){
37ef0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c  .        /* Cell
37f00 20 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20 69   i is the cell i
37f10 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
37f20 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 63 65  wing the last ce
37f30 6c 6c 20 6f 6e 20 6f 6c 64 0a 20 20 20 20 20 20  ll on old.      
37f40 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61 67    ** sibling pag
37f50 65 20 6a 2e 20 49 66 20 74 68 65 20 73 69 62 6c  e j. If the sibl
37f60 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ings are not lea
37f70 66 20 70 61 67 65 73 20 6f 66 20 61 6e 0a 20 20  f pages of an.  
37f80 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20        ** intkey 
37f90 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 63 65 6c  b-tree, then cel
37fa0 6c 20 69 20 77 61 73 20 61 20 64 69 76 69 64 65  l i was a divide
37fb0 72 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20  r cell. */.     
37fc0 20 20 20 61 73 73 65 72 74 28 20 6a 2b 31 20 3c     assert( j+1 <
37fd0 20 41 72 72 61 79 53 69 7a 65 28 61 70 43 6f 70   ArraySize(apCop
37fe0 79 29 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  y) );.        as
37ff0 73 65 72 74 28 20 6a 2b 31 20 3c 20 6e 4f 6c 64  sert( j+1 < nOld
38000 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 6c 64   );.        pOld
38010 20 3d 20 61 70 43 6f 70 79 5b 2b 2b 6a 5d 3b 0a   = apCopy[++j];.
38020 20 20 20 20 20 20 20 20 69 4e 65 78 74 4f 6c 64          iNextOld
38030 20 3d 20 69 20 2b 20 21 6c 65 61 66 44 61 74 61   = i + !leafData
38040 20 2b 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b   + pOld->nCell +
38050 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pOld->nOverflow
38060 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
38070 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b  ld->nOverflow ){
38080 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 76 65 72  .          nOver
38090 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76  flow = pOld->nOv
380a0 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20  erflow;.        
380b0 20 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20 69 20    iOverflow = i 
380c0 2b 20 21 6c 65 61 66 44 61 74 61 20 2b 20 70 4f  + !leafData + pO
380d0 6c 64 2d 3e 61 69 4f 76 66 6c 5b 30 5d 3b 0a 20  ld->aiOvfl[0];. 
380e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
380f0 20 69 73 44 69 76 69 64 65 72 20 3d 20 21 6c 65   isDivider = !le
38100 61 66 44 61 74 61 3b 20 20 0a 20 20 20 20 20 20  afData;  .      
38110 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
38120 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 69  nOverflow>0 || i
38130 4f 76 65 72 66 6c 6f 77 3c 69 20 29 3b 0a 20 20  Overflow<i );.  
38140 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72      assert(nOver
38150 66 6c 6f 77 3c 32 20 7c 7c 20 70 4f 6c 64 2d 3e  flow<2 || pOld->
38160 61 69 4f 76 66 6c 5b 30 5d 3d 3d 70 4f 6c 64 2d  aiOvfl[0]==pOld-
38170 3e 61 69 4f 76 66 6c 5b 31 5d 2d 31 29 3b 0a 20  >aiOvfl[1]-1);. 
38180 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65       assert(nOve
38190 72 66 6c 6f 77 3c 33 20 7c 7c 20 70 4f 6c 64 2d  rflow<3 || pOld-
381a0 3e 61 69 4f 76 66 6c 5b 31 5d 3d 3d 70 4f 6c 64  >aiOvfl[1]==pOld
381b0 2d 3e 61 69 4f 76 66 6c 5b 32 5d 2d 31 29 3b 0a  ->aiOvfl[2]-1);.
381c0 20 20 20 20 20 20 69 66 28 20 69 3d 3d 69 4f 76        if( i==iOv
381d0 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
381e0 20 20 69 73 44 69 76 69 64 65 72 20 3d 20 31 3b    isDivider = 1;
381f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 2d 2d  .        if( (--
38200 6e 4f 76 65 72 66 6c 6f 77 29 3e 30 20 29 7b 0a  nOverflow)>0 ){.
38210 20 20 20 20 20 20 20 20 20 20 69 4f 76 65 72 66            iOverf
38220 6c 6f 77 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  low++;.        }
38230 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
38240 69 66 28 20 69 3d 3d 63 6e 74 4e 65 77 5b 6b 5d  if( i==cntNew[k]
38250 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
38260 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63 65 6c  ell i is the cel
38270 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  l immediately fo
38280 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74  llowing the last
38290 20 63 65 6c 6c 20 6f 6e 20 6e 65 77 0a 20 20 20   cell on new.   
382a0 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20       ** sibling 
382b0 70 61 67 65 20 6b 2e 20 49 66 20 74 68 65 20 73  page k. If the s
382c0 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20  iblings are not 
382d0 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20 61 6e  leaf pages of an
382e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b  .        ** intk
382f0 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20  ey b-tree, then 
38300 63 65 6c 6c 20 69 20 69 73 20 61 20 64 69 76 69  cell i is a divi
38310 64 65 72 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20  der cell.  */.  
38320 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e        pNew = apN
38330 65 77 5b 2b 2b 6b 5d 3b 0a 20 20 20 20 20 20 20  ew[++k];.       
38340 20 69 66 28 20 21 6c 65 61 66 44 61 74 61 20 29   if( !leafData )
38350 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
38360 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
38370 20 6a 3c 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 20   j<nOld );.     
38380 20 61 73 73 65 72 74 28 20 6b 3c 6e 4e 65 77 20   assert( k<nNew 
38390 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
383a0 74 68 65 20 63 65 6c 6c 20 77 61 73 20 6f 72 69  the cell was ori
383b0 67 69 6e 61 6c 6c 79 20 64 69 76 69 64 65 72 20  ginally divider 
383c0 63 65 6c 6c 20 28 61 6e 64 20 69 73 20 6e 6f 74  cell (and is not
383d0 20 6e 6f 77 29 20 6f 72 0a 20 20 20 20 20 20 2a   now) or.      *
383e0 2a 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  * an overflow ce
383f0 6c 6c 2c 20 6f 72 20 69 66 20 74 68 65 20 63 65  ll, or if the ce
38400 6c 6c 20 77 61 73 20 6c 6f 63 61 74 65 64 20 6f  ll was located o
38410 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 69  n a different si
38420 62 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70  bling.      ** p
38430 61 67 65 20 62 65 66 6f 72 65 20 74 68 65 20 62  age before the b
38440 61 6c 61 6e 63 69 6e 67 2c 20 74 68 65 6e 20 74  alancing, then t
38450 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
38460 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65  ntries associate
38470 64 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20  d.      ** with 
38480 61 6e 79 20 63 68 69 6c 64 20 6f 72 20 6f 76 65  any child or ove
38490 72 66 6c 6f 77 20 70 61 67 65 73 20 6e 65 65 64  rflow pages need
384a0 20 7