/ Hex Artifact Content
Login

Artifact 33338d61b912b5219fc5b466db8e0d7385c0b18b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a  xffff)+1)../*.**
05c0: 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20 61   Values passed a
05d0: 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d 65  s the 5th argume
05e0: 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42 74  nt to allocateBt
05f0: 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64 65  reePage().*/.#de
0600: 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  fine BTALLOC_ANY
0610: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 2f     0           /
0620: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20 70  * Allocate any p
0630: 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 42  age */.#define B
0640: 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20 20  TALLOC_EXACT 1  
0650: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
0660: 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65 20  cate exact page 
0670: 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 23  if possible */.#
0680: 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 4c  define BTALLOC_L
0690: 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20  E    2          
06a0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79   /* Allocate any
06b0: 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61 72   page <= the par
06c0: 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ameter */../*.**
06d0: 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69 74   Macro IfNotOmit
06e0: 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28 78  AV(x) returns (x
06f0: 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ) if SQLITE_OMIT
0700: 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 6e  _AUTOVACUUM is n
0710: 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c 20  ot .** defined, 
0720: 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20 46  or 0 if it is. F
0730: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
0740: 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d 20  *   bIncrVacuum 
0750: 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  = IfNotOmitAV(pB
0760: 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61 63  tShared->incrVac
0770: 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65 66  uum);.*/.#ifndef
0780: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
0790: 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65 20  OVACUUM.#define 
07a0: 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70 72  IfNotOmitAV(expr
07b0: 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a 23  ) (expr).#else.#
07c0: 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69 74  define IfNotOmit
07d0: 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64 69  AV(expr) 0.#endi
07e0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
07f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0800: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74  CHE./*.** A list
0810: 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62 6a   of BtShared obj
0820: 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6c  ects that are el
0830: 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74 69  igible for parti
0840: 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 73  cipation.** in s
0850: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
0860: 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73 20  is variable has 
0870: 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69 6e  file scope durin
0880: 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2c  g normal builds,
0890: 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73 74  .** but the test
08a0: 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20 74   harness needs t
08b0: 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20 77  o access it so w
08c0: 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61 6c  e make it global
08d0: 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62 75   for .** test bu
08e0: 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63 65  ilds..**.** Acce
08f0: 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69 61  ss to this varia
0900: 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65 64  ble is protected
0910: 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45 58   by SQLITE_MUTEX
0920: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e 0a  _STATIC_MASTER..
0930: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
0940: 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20 2a  _TEST.BtShared *
0950: 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74  SQLITE_WSD sqlit
0960: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
0970: 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61  t = 0;.#else.sta
0980: 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53 51  tic BtShared *SQ
0990: 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65 33  LITE_WSD sqlite3
09a0: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20  SharedCacheList 
09b0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64  = 0;.#endif.#end
09c0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
09d0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
09e0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
09f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0a00: 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  CHE./*.** Enable
0a10: 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
0a20: 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e 64  shared pager and
0a30: 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65 73   schema features
0a40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
0a50: 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66 65  tine has no effe
0a60: 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20 64  ct on existing d
0a70: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
0a80: 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72  ons..** The shar
0a90: 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e 67  ed cache setting
0aa0: 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66 75   effects only fu
0ab0: 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  ture calls to.**
0ac0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2c   sqlite3_open(),
0ad0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
0ae0: 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70  ), or sqlite3_op
0af0: 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20  en_v2()..*/.int 
0b00: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
0b10: 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74 20  hared_cache(int 
0b20: 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69 74  enable){.  sqlit
0b30: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
0b40: 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
0b50: 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65  d = enable;.  re
0b60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0b70: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66 64  }.#endif....#ifd
0b80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
0b90: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
0ba0: 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  .  ** The functi
0bb0: 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64 43  ons querySharedC
0bc0: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 2c  acheTableLock(),
0bd0: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
0be0: 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a 2a  ableLock(),.  **
0bf0: 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68 61   and clearAllSha
0c00: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c10: 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75  ks().  ** manipu
0c20: 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  late entries in 
0c30: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
0c40: 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75  ck linked list u
0c50: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a  sed to store.  *
0c60: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
0c70: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73  able level locks
0c80: 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79  . If the library
0c90: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
0ca0: 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65  h the.  ** share
0cb0: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
0cc0: 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
0cd0: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
0ce0: 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20  r one user.  ** 
0cf0: 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64  of each BtShared
0d00: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73   structure and s
0d10: 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69  o this locking i
0d20: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
0d30: 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65   .  ** So define
0d40: 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65   the lock relate
0d50: 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e  d functions as n
0d60: 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64  o-ops..  */.  #d
0d70: 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72 65  efine queryShare
0d80: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0d90: 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b  a,b,c) SQLITE_OK
0da0: 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53 68  .  #define setSh
0db0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0dc0: 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45  ck(a,b,c) SQLITE
0dd0: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63 6c  _OK.  #define cl
0de0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0df0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e00: 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72 61   #define downgra
0e10: 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
0e20: 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20 20  TableLocks(a).  
0e30: 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72 65  #define hasShare
0e40: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0e50: 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64 65  a,b,c,d) 1.  #de
0e60: 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e 66  fine hasReadConf
0e70: 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23 65  licts(a, b) 0.#e
0e80: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0e90: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0ea0: 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20 53  _CACHE..#ifdef S
0eb0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
0ec0: 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  *** This functio
0ed0: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
0ee0: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73  s part of an ass
0ef0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2e  ert() statement.
0f00: 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b   ***.**.** Check
0f10: 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72 65   to see if pBtre
0f20: 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71 75  e holds the requ
0f30: 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72 65  ired locks to re
0f40: 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74  ad or write to t
0f50: 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69 74  he .** table wit
0f60: 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f  h root page iRoo
0f70: 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69 66  t.   Return 1 if
0f80: 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20 69   it does and 0 i
0f90: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  f not..**.** For
0fa0: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 77   example, when w
0fb0: 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c  riting to a tabl
0fc0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
0fd0: 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20 42   iRoot via .** B
0fe0: 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  tree connection 
0ff0: 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  pBtree:.**.**   
1000: 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
1010: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1020: 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c 20  (pBtree, iRoot, 
1030: 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 29  0, WRITE_LOCK) )
1040: 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72 69  ;.**.** When wri
1050: 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78  ting to an index
1060: 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69 6e   that resides in
1070: 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74 61   a sharable data
1080: 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63 61  base, the .** ca
1090: 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65  ller should have
10a0: 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64 20   first obtained 
10b0: 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69 6e  a lock specifyin
10c0: 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  g the root page 
10d0: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73  of.** the corres
10e0: 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20 54  ponding table. T
10f0: 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67 73  his makes things
1100: 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d 70   a bit more comp
1110: 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20 74  licated,.** as t
1120: 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61 74  his module treat
1130: 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73 20  s each table as 
1140: 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75 63  a separate struc
1150: 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d 69  ture. To determi
1160: 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  ne.** the table 
1170: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
1180: 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
1190: 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a 2a   written, this.*
11a0: 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74  * function has t
11b0: 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67 68  o search through
11c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
11d0: 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  hema..**.** Inst
11e0: 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f 6e  ead of a lock on
11f0: 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
1200: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1210: 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c 65  iRoot, the calle
1220: 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61 20  r may.** hold a 
1230: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
1240: 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20 28  e schema table (
1250: 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54 68  root page 1). Th
1260: 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61 63  is is also.** ac
1270: 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ceptable..*/.sta
1280: 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72 65  tic int hasShare
1290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
12a0: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
12b0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e  ,         /* Han
12c0: 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68 6f  dle that must ho
12d0: 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67 6e  ld lock */.  Pgn
12e0: 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20  o iRoot,        
12f0: 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
1300: 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20   of b-tree */.  
1310: 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20 20  int isIndex,    
1320: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1330: 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20 72  f iRoot is the r
1340: 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  oot of an index 
1350: 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  b-tree */.  int 
1360: 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20 20  eLockType       
1370: 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6c     /* Required l
1380: 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f 4c  ock type (READ_L
1390: 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43  OCK or WRITE_LOC
13a0: 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65 6d  K) */.){.  Schem
13b0: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53 63  a *pSchema = (Sc
13c0: 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e 70  hema *)pBtree->p
13d0: 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 50  Bt->pSchema;.  P
13e0: 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20 20  gno iTab = 0;.  
13f0: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a  BtLock *pLock;..
1400: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
1410: 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68 61  abase is not sha
1420: 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74 68  reable, or if th
1430: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1440: 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61 73  ing.  ** and has
1450: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
1460: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20  itted flag set, 
1470: 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73 20  then no lock is 
1480: 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a 20  required. .  ** 
1490: 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d 65  Return true imme
14a0: 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  diately..  */.  
14b0: 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68 61  if( (pBtree->sha
14c0: 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c 20  rable==0).   || 
14d0: 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41 44  (eLockType==READ
14e0: 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65 65  _LOCK && (pBtree
14f0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1500: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1510: 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20 20  tted)).  ){.    
1520: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
1530: 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65 6e   /* If the clien
1540: 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f 72  t is reading  or
1550: 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64 65   writing an inde
1560: 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61  x and the schema
1570: 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f 61   is.  ** not loa
1580: 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ded, then it is 
1590: 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74 6f  too difficult to
15a0: 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b 20   actually check 
15b0: 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20 74  to see if.  ** t
15c0: 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 73  he correct locks
15d0: 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20 64   are held.  So d
15e0: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20 6a  o not bother - j
15f0: 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e  ust return true.
1600: 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65 20  .  ** This case 
1610: 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75 70  does not come up
1620: 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79 68   very often anyh
1630: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ow..  */.  if( i
1640: 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63 68  sIndex && (!pSch
1650: 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61 2d  ema || (pSchema-
1660: 3e 66 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61  >flags&DB_Schema
1670: 4c 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20  Loaded)==0) ){. 
1680: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1690: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
16a0: 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  t the root-page 
16b0: 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68  that the lock sh
16c0: 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e  ould be held on.
16d0: 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20   For table.  ** 
16e0: 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73  b-trees, this is
16f0: 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70   just the root p
1700: 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
1710: 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a  e being read or.
1720: 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f    ** written. Fo
1730: 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c  r index b-trees,
1740: 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
1750: 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f  page of the asso
1760: 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c  ciated.  ** tabl
1770: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49  e.  */.  if( isI
1780: 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68  ndex ){.    Hash
1790: 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72  Elem *p;.    for
17a0: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
17b0: 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78  st(&pSchema->idx
17c0: 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69  Hash); p; p=sqli
17d0: 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a  teHashNext(p)){.
17e0: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
17f0: 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c  x = (Index *)sql
1800: 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a  iteHashData(p);.
1810: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
1820: 74 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74  tnum==(int)iRoot
1830: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 61 62   ){.        iTab
1840: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
1850: 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  >tnum;.      }. 
1860: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1870: 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a    iTab = iRoot;.
1880: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68    }..  /* Search
1890: 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65   for the require
18a0: 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61  d lock. Either a
18b0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72   write-lock on r
18c0: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61  oot-page iTab, a
18d0: 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63   .  ** write-loc
18e0: 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20  k on the schema 
18f0: 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68  table, or (if th
1900: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1910: 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64  ing) a.  ** read
1920: 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69  -lock on iTab wi
1930: 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75  ll suffice. Retu
1940: 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74  rn 1 if any of t
1950: 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20  hese are found. 
1960: 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d   */.  for(pLock=
1970: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f  pBtree->pBt->pLo
1980: 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  ck; pLock; pLock
1990: 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a  =pLock->pNext){.
19a0: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70      if( pLock->p
19b0: 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20  Btree==pBtree . 
19c0: 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69      && (pLock->i
19d0: 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28  Table==iTab || (
19e0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pLock->eLock==WR
19f0: 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63  ITE_LOCK && pLoc
1a00: 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20  k->iTable==1)). 
1a10: 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c      && pLock->eL
1a20: 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a  ock>=eLockType .
1a30: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1a40: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1a50: 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f  ..  /* Failed to
1a60: 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72   find the requir
1a70: 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65  ed lock. */.  re
1a80: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1a90: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
1aa0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
1ab0: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a  TE_DEBUG./*.****
1ac0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
1ad0: 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61  ay be used as pa
1ae0: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  rt of assert() s
1af0: 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20  tatements only. 
1b00: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ****.**.** Retur
1b10: 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75  n true if it wou
1b20: 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f  ld be illegal fo
1b30: 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74  r pBtree to writ
1b40: 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61  e into the.** ta
1b50: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f  ble or index roo
1b60: 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63  ted at iRoot bec
1b70: 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65  ause other share
1b80: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  d connections ar
1b90: 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75  e.** simultaneou
1ba0: 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74  sly reading that
1bb0: 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69   same table or i
1bc0: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ndex..**.** It i
1bd0: 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42  s illegal for pB
1be0: 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66  tree to write if
1bf0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65   some other Btre
1c00: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  e object that.**
1c10: 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65   shares the same
1c20: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
1c30: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65   is currently re
1c40: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1c50: 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61  .** the iRoot ta
1c60: 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66  ble.  Except, if
1c70: 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65   the other Btree
1c80: 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a   object has the.
1c90: 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  ** read-uncommit
1ca0: 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68  ted flag set, th
1cb0: 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20  en it is OK for 
1cc0: 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74  the other object
1cd0: 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65   to.** have a re
1ce0: 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  ad cursor..**.**
1cf0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65   For example, be
1d00: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
1d10: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1d20: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a  table or index.*
1d30: 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  * rooted at page
1d40: 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75   iRoot, one shou
1d50: 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20  ld call:.**.**  
1d60: 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65    assert( !hasRe
1d70: 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72  adConflicts(pBtr
1d80: 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f  ee, iRoot) );.*/
1d90: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52  .static int hasR
1da0: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72  eadConflicts(Btr
1db0: 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f  ee *pBtree, Pgno
1dc0: 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72   iRoot){.  BtCur
1dd0: 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  sor *p;.  for(p=
1de0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
1df0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
1e00: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  ext){.    if( p-
1e10: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
1e20: 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74   .     && p->pBt
1e30: 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20  ree!=pBtree.    
1e40: 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65   && 0==(p->pBtre
1e50: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1e60: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1e70: 69 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20  itted).    ){.  
1e80: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1e90: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1ea0: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20   0;.}.#endif    
1eb0: 2f 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  /* #ifdef SQLITE
1ec0: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
1ed0: 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66   Query to see if
1ee0: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20   Btree handle p 
1ef0: 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63  may obtain a loc
1f00: 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20  k of type eLock 
1f10: 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f  .** (READ_LOCK o
1f20: 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e  r WRITE_LOCK) on
1f30: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
1f40: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20  root-page iTab. 
1f50: 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  Return.** SQLITE
1f60: 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  _OK if the lock 
1f70: 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20  may be obtained 
1f80: 28 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  (by calling.** s
1f90: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
1fa0: 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51  leLock()), or SQ
1fb0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e  LITE_LOCKED if n
1fc0: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
1fd0: 74 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  t querySharedCac
1fe0: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65  heTableLock(Btre
1ff0: 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c  e *p, Pgno iTab,
2000: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2010: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2020: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2030: 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  pIter;..  assert
2040: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2050: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2060: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2070: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  READ_LOCK || eLo
2080: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  ck==WRITE_LOCK )
2090: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
20a0: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
20b0: 28 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  ( !(p->db->flags
20c0: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
20d0: 6d 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d  mmitted)||eLock=
20e0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61  =WRITE_LOCK||iTa
20f0: 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  b==1 );.  .  /* 
2100: 49 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  If requesting a 
2110: 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e  write-lock, then
2120: 20 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20   the Btree must 
2130: 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
2140: 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  te.  ** transact
2150: 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ion on this file
2160: 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79  . And, obviously
2170: 2c 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65  , for this to be
2180: 20 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20   so there .  ** 
2190: 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20  must be an open 
21a0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
21b0: 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74  n on the file it
21c0: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  self..  */.  ass
21d0: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
21e0: 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74  _LOCK || (p==pBt
21f0: 2d 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e  ->pWriter && p->
2200: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
2210: 52 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72  RITE) );.  asser
2220: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2230: 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  OCK || pBt->inTr
2240: 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
2250: 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f  _WRITE );.  .  /
2260: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2270: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
2280: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73   shared-cache is
2290: 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   not enabled */.
22a0: 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
22b0: 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  le ){.    return
22c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
22d0: 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74  .  /* If some ot
22e0: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  her connection i
22f0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63  s holding an exc
2300: 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65  lusive lock, the
2310: 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20  .  ** requested 
2320: 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20  lock may not be 
2330: 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20  obtained..  */. 
2340: 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65   if( pBt->pWrite
2350: 72 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74  r!=p && (pBt->bt
2360: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43  sFlags & BTS_EXC
2370: 4c 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20  LUSIVE)!=0 ){.  
2380: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2390: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
23a0: 2c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  , pBt->pWriter->
23b0: 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  db);.    return 
23c0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
23d0: 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a  AREDCACHE;.  }..
23e0: 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
23f0: 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
2400: 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
2410: 74 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  t){.    /* The c
2420: 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d  ondition (pIter-
2430: 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69  >eLock!=eLock) i
2440: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
2450: 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20  if(...) .    ** 
2460: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73  statement is a s
2470: 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66  implification of
2480: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
2490: 20 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f    (eLock==WRITE_
24a0: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
24b0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
24c0: 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
24d0: 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68  since we know th
24e0: 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49  at if eLock==WRI
24f0: 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f  TE_LOCK, then no
2500: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
2510: 6e 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c  n.    ** may hol
2520: 64 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f  d a WRITE_LOCK o
2530: 6e 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74  n any table in t
2540: 68 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20  his file (since 
2550: 74 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a  there can.    **
2560: 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c   only be a singl
2570: 65 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a  e writer)..    *
2580: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  /.    assert( pI
2590: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44  ter->eLock==READ
25a0: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  _LOCK || pIter->
25b0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
25c0: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
25d0: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
25e0: 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72  K || pIter->pBtr
25f0: 65 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e  ee==p || pIter->
2600: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2610: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
2620: 2d 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70  ->pBtree!=p && p
2630: 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Iter->iTable==iT
2640: 61 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f  ab && pIter->eLo
2650: 63 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck!=eLock ){.   
2660: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
2670: 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
2680: 62 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  b, pIter->pBtree
2690: 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ->db);.      if(
26a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
26b0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  CK ){.        as
26c0: 73 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57  sert( p==pBt->pW
26d0: 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20  riter );.       
26e0: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
26f0: 3d 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20  = BTS_PENDING;. 
2700: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2710: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
2720: 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
2730: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2740: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
2750: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
2760: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2770: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
2780: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
2790: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64  D_CACHE./*.** Ad
27a0: 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  d a lock on the 
27b0: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
27c0: 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74  page iTable to t
27d0: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  he shared-btree 
27e0: 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65  used.** by Btree
27f0: 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d   handle p. Param
2800: 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20  eter eLock must 
2810: 62 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c  be either READ_L
2820: 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45  OCK or .** WRITE
2830: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  _LOCK..**.** Thi
2840: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
2850: 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
2860: 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68  :.**.**   (a) Th
2870: 65 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65  e specified Btre
2880: 65 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f  e object p is co
2890: 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61  nnected to a sha
28a0: 72 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64  rable.**       d
28b0: 61 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74  atabase (one wit
28c0: 68 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73  h the BtShared.s
28d0: 68 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74  harable flag set
28e0: 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28  ), and.**.**   (
28f0: 62 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65  b) No other Btre
2900: 65 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61  e objects hold a
2910: 20 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c   lock that confl
2920: 69 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69  icts.**       wi
2930: 74 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64  th the requested
2940: 20 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72   lock (i.e. quer
2950: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
2960: 65 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20  eLock() has.**  
2970: 20 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65       already bee
2980: 6e 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74  n called and ret
2990: 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29  urned SQLITE_OK)
29a0: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
29b0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
29c0: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64   the lock is add
29d0: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
29e0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a   SQLITE_NOMEM .*
29f0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
2a00: 20 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70   a malloc attemp
2a10: 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  t fails..*/.stat
2a20: 69 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64  ic int setShared
2a30: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42  CacheTableLock(B
2a40: 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54  tree *p, Pgno iT
2a50: 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b  able, u8 eLock){
2a60: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2a70: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
2a80: 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a  ock *pLock = 0;.
2a90: 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
2aa0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2ab0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
2ac0: 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
2ad0: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2ae0: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  OCK || eLock==WR
2af0: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ITE_LOCK );.  as
2b00: 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29  sert( p->db!=0 )
2b10: 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63  ;..  /* A connec
2b20: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65  tion with the re
2b30: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
2b40: 6c 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76  lag set will nev
2b50: 65 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f  er try to.  ** o
2b60: 62 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63  btain a read-loc
2b70: 6b 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e  k using this fun
2b80: 63 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20  ction. The only 
2b90: 72 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e  read-lock obtain
2ba0: 65 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e  ed.  ** by a con
2bb0: 6e 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d  nection in read-
2bc0: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65  uncommitted mode
2bd0: 20 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74   is on the sqlit
2be0: 65 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74  e_master .  ** t
2bf0: 61 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c  able, and that l
2c00: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
2c10: 69 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61  in BtreeBeginTra
2c20: 6e 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ns().  */.  asse
2c30: 72 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66  rt( 0==(p->db->f
2c40: 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64  lags&SQLITE_Read
2c50: 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20  Uncommitted) || 
2c60: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
2c70: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  K );..  /* This 
2c80: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
2c90: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f  only be called o
2ca0: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74  n a sharable b-t
2cb0: 72 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20  ree after it .  
2cc0: 2a 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65  ** has been dete
2cd0: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f  rmined that no o
2ce0: 74 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64  ther b-tree hold
2cf0: 73 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20  s a conflicting 
2d00: 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65  lock.  */.  asse
2d10: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
2d20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
2d30: 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61  ITE_OK==querySha
2d40: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2d50: 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f  k(p, iTable, eLo
2d60: 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72  ck) );..  /* Fir
2d70: 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69  st search the li
2d80: 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  st for an existi
2d90: 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20  ng lock on this 
2da0: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28  table. */.  for(
2db0: 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
2dc0: 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
2dd0: 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
2de0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61    if( pIter->iTa
2df0: 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
2e00: 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Iter->pBtree==p 
2e10: 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d  ){.      pLock =
2e20: 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72   pIter;.      br
2e30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
2e40: 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76    /* If the abov
2e50: 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74  e search did not
2e60: 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73   find a BtLock s
2e70: 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e  truct associatin
2e80: 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77  g Btree p.  ** w
2e90: 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65  ith table iTable
2ea0: 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61  , allocate one a
2eb0: 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20  nd link it into 
2ec0: 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  the list..  */. 
2ed0: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
2ee0: 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f     pLock = (BtLo
2ef0: 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  ck *)sqlite3Mall
2f00: 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
2f10: 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20  Lock));.    if( 
2f20: 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  !pLock ){.      
2f30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2f40: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
2f50: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Lock->iTable = i
2f60: 54 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b  Table;.    pLock
2f70: 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
2f80: 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d    pLock->pNext =
2f90: 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
2fa0: 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c   pBt->pLock = pL
2fb0: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ock;.  }..  /* S
2fc0: 65 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c  et the BtLock.eL
2fd0: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
2fe0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74  the maximum of t
2ff0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a  he current lock.
3000: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71    ** and the req
3010: 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69  uested lock. Thi
3020: 73 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69  s means if a wri
3030: 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65  te-lock was alre
3040: 61 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e  ady held.  ** an
3050: 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65  d a read-lock re
3060: 71 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27  quested, we don'
3070: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f  t incorrectly do
3080: 77 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b  wngrade the lock
3090: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
30a0: 20 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44   WRITE_LOCK>READ
30b0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65  _LOCK );.  if( e
30c0: 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  Lock>pLock->eLoc
30d0: 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  k ){.    pLock->
30e0: 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20  eLock = eLock;. 
30f0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
3100: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
3110: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
3120: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
3130: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3140: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3150: 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  HE./*.** Release
3160: 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c   all the table l
3170: 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61  ocks (locks obta
3180: 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74  ined via calls t
3190: 6f 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72  o.** the setShar
31a0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
31b0: 28 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65  () procedure) he
31c0: 6c 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65  ld by Btree obje
31d0: 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ct p..**.** This
31e0: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
31f0: 73 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68  s that Btree p h
3200: 61 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20  as an open read 
3210: 6f 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61  or write .** tra
3220: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20  nsaction. If it 
3230: 64 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74  does not, then t
3240: 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66  he BTS_PENDING f
3250: 6c 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e  lag.** may be in
3260: 63 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65  correctly cleare
3270: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
3280: 64 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64  d clearAllShared
3290: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
32a0: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
32b0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
32c0: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a  pBt;.  BtLock **
32d0: 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70  ppIter = &pBt->p
32e0: 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lock;..  assert(
32f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
3300: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
3310: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
3320: 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ble || 0==*ppIte
3330: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
3340: 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a  ->inTrans>0 );..
3350: 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72    while( *ppIter
3360: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
3370: 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b  pLock = *ppIter;
3380: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
3390: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
33a0: 53 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20  S_EXCLUSIVE)==0 
33b0: 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d  || pBt->pWriter=
33c0: 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29  =pLock->pBtree )
33d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
33e0: 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54  ock->pBtree->inT
33f0: 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f  rans>=pLock->eLo
3400: 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ck );.    if( pL
3410: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ock->pBtree==p )
3420: 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20  {.      *ppIter 
3430: 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLock->pNext;.
3440: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
3450: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c  ock->iTable!=1 |
3460: 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63  | pLock==&p->loc
3470: 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  k );.      if( p
3480: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20  Lock->iTable!=1 
3490: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
34a0: 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  e3_free(pLock);.
34b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
34c0: 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20  e{.      ppIter 
34d0: 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b  = &pLock->pNext;
34e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
34f0: 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46  sert( (pBt->btsF
3500: 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49  lags & BTS_PENDI
3510: 4e 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  NG)==0 || pBt->p
3520: 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20  Writer );.  if( 
3530: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20  pBt->pWriter==p 
3540: 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69  ){.    pBt->pWri
3550: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ter = 0;.    pBt
3560: 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28  ->btsFlags &= ~(
3570: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54  BTS_EXCLUSIVE|BT
3580: 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65  S_PENDING);.  }e
3590: 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72  lse if( pBt->nTr
35a0: 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a  ansaction==2 ){.
35b0: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
35c0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
35d0: 68 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63  hen Btree p is c
35e0: 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20  oncluding its . 
35f0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
3600: 6e 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72  n. If there curr
3610: 65 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77  ently exists a w
3620: 72 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20  riter, and p is 
3630: 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  not.    ** that 
3640: 77 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65  writer, then the
3650: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   number of locks
3660: 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
3670: 69 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a  ions other.    *
3680: 2a 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65  * than the write
3690: 72 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20  r must be about 
36a0: 74 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e  to drop to zero.
36b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20   In this case.  
36c0: 20 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53    ** set the BTS
36d0: 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f  _PENDING flag to
36e0: 20 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   0..    **.    *
36f0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
3700: 74 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72  t currently a wr
3710: 69 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50  iter, then BTS_P
3720: 45 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20  ENDING must.    
3730: 2a 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61  ** be zero alrea
3740: 64 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74  dy. So this next
3750: 20 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73   line is harmles
3760: 73 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a  s in that case..
3770: 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e      */.    pBt->
3780: 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
3790: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a  _PENDING;.  }.}.
37a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
37b0: 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c  tion changes all
37c0: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c   write-locks hel
37d0: 64 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74  d by Btree p int
37e0: 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f  o read-locks..*/
37f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77  .static void dow
3800: 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
3810: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3820: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
3830: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
3840: 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  Bt;.  if( pBt->p
3850: 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20  Writer==p ){.   
3860: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
3870: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3880: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3890: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
38a0: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
38b0: 45 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72  ENDING);.    for
38c0: 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63  (pLock=pBt->pLoc
38d0: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
38e0: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
38f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3900: 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  ck->eLock==READ_
3910: 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70  LOCK || pLock->p
3920: 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20  Btree==p );.    
3930: 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d    pLock->eLock =
3940: 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20   READ_LOCK;.    
3950: 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20  }.  }.}..#endif 
3960: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
3970: 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a  HARED_CACHE */..
3980: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
3990: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
39a0: 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72  *pPage);  /* For
39b0: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
39c0: 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73  /../*.***** This
39d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
39e0: 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72   inside of asser
39f0: 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a  t() only ****.**
3a00: 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  .** Verify that 
3a10: 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73  the cursor holds
3a20: 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74   the mutex on it
3a30: 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69  s BtShared.*/.#i
3a40: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
3a50: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72  G.static int cur
3a60: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74  sorHoldsMutex(Bt
3a70: 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65  Cursor *p){.  re
3a80: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
3a90: 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
3aa0: 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66  mutex);.}.#endif
3ab0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61  ../*.** Invalida
3ac0: 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
3ad0: 63 61 63 68 65 20 6f 66 20 74 68 65 20 63 75 72  cache of the cur
3ae0: 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  sor passed as th
3af0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
3b00: 2e 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72  ..** on the shar
3b10: 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75  ed btree structu
3b20: 72 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69  re pBt..*/.#defi
3b30: 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65  ne invalidateOve
3b40: 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
3b50: 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
3b60: 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f   &= ~BTCF_ValidO
3b70: 76 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61  vfl)../*.** Inva
3b80: 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66  lidate the overf
3b90: 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
3ba0: 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73  che for all curs
3bb0: 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e  ors opened.** on
3bc0: 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65   the shared btre
3bd0: 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e  e structure pBt.
3be0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3bf0: 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
3c00: 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61  rflowCache(BtSha
3c10: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43  red *pBt){.  BtC
3c20: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65  ursor *p;.  asse
3c30: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
3c40: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
3c50: 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  x) );.  for(p=pB
3c60: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
3c70: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
3c80: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
3c90: 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a  owCache(p);.  }.
3ca0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
3cb0: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
3cc0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
3cd0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65  ion is called be
3ce0: 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74  fore modifying t
3cf0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  he contents of a
3d00: 20 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76   table.** to inv
3d10: 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72  alidate any incr
3d20: 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61  blob cursors tha
3d30: 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68  t are open on th
3d40: 65 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20  e.** row or one 
3d50: 6f 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e  of the rows bein
3d60: 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  g modified..**.*
3d70: 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73  * If argument is
3d80: 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72  ClearTable is tr
3d90: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74  ue, then the ent
3da0: 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
3db0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20  the.** table is 
3dc0: 61 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65  about to be dele
3dd0: 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ted. In this cas
3de0: 65 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  e invalidate all
3df0: 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72   incrblob.** cur
3e00: 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79  sors open on any
3e10: 20 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20   row within the 
3e20: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
3e30: 70 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a  page pgnoRoot..*
3e40: 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
3e50: 69 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c  if argument isCl
3e60: 65 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73  earTable is fals
3e70: 65 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20  e, then the row 
3e80: 77 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52  with.** rowid iR
3e90: 6f 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c  ow is being repl
3ea0: 61 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e  aced or deleted.
3eb0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e   In this case in
3ec0: 76 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79  validate.** only
3ed0: 20 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20   those incrblob 
3ee0: 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
3ef0: 74 68 61 74 20 73 70 65 63 69 66 69 63 20 72 6f  that specific ro
3f00: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  w..*/.static voi
3f10: 64 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72  d invalidateIncr
3f20: 62 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42  blobCursors(.  B
3f30: 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20  tree *pBtree,   
3f40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
3f50: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63  tabase file to c
3f60: 68 65 63 6b 20 2a 2f 0a 20 20 69 36 34 20 69 52  heck */.  i64 iR
3f70: 6f 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ow,             
3f80: 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74    /* The rowid t
3f90: 68 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61  hat might be cha
3fa0: 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  nging */.  int i
3fb0: 73 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20  sClearTable     
3fc0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c     /* True if al
3fd0: 6c 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67  l rows are being
3fe0: 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20   deleted */.){. 
3ff0: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
4000: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
4010: 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 61  pBtree->pBt;.  a
4020: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
4030: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42  reeHoldsMutex(pB
4040: 74 72 65 65 29 20 29 3b 0a 20 20 66 6f 72 28 70  tree) );.  for(p
4050: 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
4060: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
4070: 20 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46 6c     if( (p->curFl
4080: 61 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72 62  ags & BTCF_Incrb
4090: 6c 6f 62 29 21 3d 30 20 26 26 20 28 69 73 43 6c  lob)!=0 && (isCl
40a0: 65 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69  earTable || p->i
40b0: 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20  nfo.nKey==iRow) 
40c0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61  ){.      p->eSta
40d0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
40e0: 4c 49 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  LID;.    }.  }.}
40f0: 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75  ..#else.  /* Stu
4100: 62 20 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e 20  b function when 
4110: 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74  INCRBLOB is omit
4120: 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ted */.  #define
4130: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
4140: 6c 6f 62 43 75 72 73 6f 72 73 28 78 2c 79 2c 7a  lobCursors(x,y,z
4150: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
4160: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
4170: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62   */../*.** Set b
4180: 69 74 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 42  it pgno of the B
4190: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
41a0: 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73  ent bitvec. This
41b0: 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77   is called .** w
41c0: 68 65 6e 20 61 20 70 61 67 65 20 74 68 61 74 20  hen a page that 
41d0: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61  previously conta
41e0: 69 6e 65 64 20 64 61 74 61 20 62 65 63 6f 6d 65  ined data become
41f0: 73 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  s a free-list le
4200: 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a  af .** page..**.
4210: 2a 2a 20 54 68 65 20 42 74 53 68 61 72 65 64 2e  ** The BtShared.
4220: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
4230: 65 63 20 65 78 69 73 74 73 20 74 6f 20 77 6f 72  ec exists to wor
4240: 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63  k around an obsc
4250: 75 72 65 0a 2a 2a 20 62 75 67 20 63 61 75 73 65  ure.** bug cause
4260: 64 20 62 79 20 74 68 65 20 69 6e 74 65 72 61 63  d by the interac
4270: 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75 73 65 66  tion of two usef
4280: 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69  ul IO optimizati
4290: 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a  ons surrounding.
42a0: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  ** free-list lea
42b0: 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  f pages:.**.**  
42c0: 20 31 29 20 57 68 65 6e 20 61 6c 6c 20 64 61 74   1) When all dat
42d0: 61 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  a is deleted fro
42e0: 6d 20 61 20 70 61 67 65 20 61 6e 64 20 74 68 65  m a page and the
42f0: 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a   page becomes.**
4300: 20 20 20 20 20 20 61 20 66 72 65 65 2d 6c 69 73        a free-lis
4310: 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  t leaf page, the
4320: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 77 72 69   page is not wri
4330: 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
4340: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 28 61 73  base.**      (as
4350: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4360: 70 61 67 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f  pages contain no
4370: 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64 61 74 61   meaningful data
4380: 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  ). Sometimes.** 
4390: 20 20 20 20 20 73 75 63 68 20 61 20 70 61 67 65       such a page
43a0: 20 69 73 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75   is not even jou
43b0: 72 6e 61 6c 6c 65 64 20 28 61 73 20 69 74 20 77  rnalled (as it w
43c0: 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66  ill not be modif
43d0: 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79  ied,.**      why
43e0: 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c   bother journall
43f0: 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20  ing it?)..**.** 
4400: 20 20 32 29 20 57 68 65 6e 20 61 20 66 72 65 65    2) When a free
4410: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
4420: 69 73 20 72 65 75 73 65 64 2c 20 69 74 73 20 63  is reused, its c
4430: 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 72 65  ontent is not re
4440: 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ad.**      from 
4450: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
4460: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
4470: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 77 68 79  ournal file (why
4480: 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20   should it.**   
4490: 20 20 20 62 65 2c 20 69 66 20 69 74 20 69 73 20     be, if it is 
44a0: 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69  not at all meani
44b0: 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42  ngful?)..**.** B
44c0: 79 20 74 68 65 6d 73 65 6c 76 65 73 2c 20 74 68  y themselves, th
44d0: 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ese optimization
44e0: 73 20 77 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20  s work fine and 
44f0: 70 72 6f 76 69 64 65 20 61 20 68 61 6e 64 79 0a  provide a handy.
4500: 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62  ** performance b
4510: 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c  oost to bulk del
4520: 65 74 65 20 6f 72 20 69 6e 73 65 72 74 20 6f 70  ete or insert op
4530: 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65  erations. Howeve
4540: 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61 67 65 20  r, if.** a page 
4550: 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  is moved to the 
4560: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 74 68  free-list and th
4570: 65 6e 20 72 65 75 73 65 64 20 77 69 74 68 69 6e  en reused within
4580: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61   the same.** tra
4590: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62  nsaction, a prob
45a0: 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e 20 49 66  lem comes up. If
45b0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
45c0: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
45d0: 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76 65 64 20  .** it is moved 
45e0: 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  to the free-list
45f0: 20 61 6e 64 20 69 74 20 69 73 20 61 6c 73 6f 20   and it is also 
4600: 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77  not journalled w
4610: 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 65 78 74  hen it.** is ext
4620: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
4630: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 72 65  free-list and re
4640: 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6f  used, then the o
4650: 72 69 67 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20  riginal data.** 
4660: 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20  may be lost. In 
4670: 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72  the event of a r
4680: 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d 61 79 20  ollback, it may 
4690: 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a  not be possible.
46a0: 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ** to restore th
46b0: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
46c0: 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69  s original confi
46d0: 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  guration..**.** 
46e0: 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20  The solution is 
46f0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4700: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4710: 20 57 68 65 6e 65 76 65 72 20 61 20 70 61 67 65   Whenever a page
4720: 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f   is .** moved to
4730: 20 62 65 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c   become a free-l
4740: 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74  ist leaf page, t
4750: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
4760: 20 62 69 74 20 69 73 0a 2a 2a 20 73 65 74 20 69   bit is.** set i
4770: 6e 20 74 68 65 20 62 69 74 76 65 63 2e 20 57 68  n the bitvec. Wh
4780: 65 6e 65 76 65 72 20 61 20 6c 65 61 66 20 70 61  enever a leaf pa
4790: 67 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ge is extracted 
47a0: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
47b0: 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74  st,.** optimizat
47c0: 69 6f 6e 20 32 20 61 62 6f 76 65 20 69 73 20 6f  ion 2 above is o
47d0: 6d 69 74 74 65 64 20 69 66 20 74 68 65 20 63 6f  mitted if the co
47e0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
47f0: 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65  is already.** se
4800: 74 20 69 6e 20 42 74 53 68 61 72 65 64 2e 70 48  t in BtShared.pH
4810: 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63  asContent. The c
4820: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62  ontents of the b
4830: 69 74 76 65 63 20 61 72 65 20 63 6c 65 61 72 65  itvec are cleare
4840: 64 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  d.** at the end 
4850: 6f 66 20 65 76 65 72 79 20 74 72 61 6e 73 61 63  of every transac
4860: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
4870: 69 6e 74 20 62 74 72 65 65 53 65 74 48 61 73 43  int btreeSetHasC
4880: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
4890: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
48a0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
48b0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70  ITE_OK;.  if( !p
48c0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
48d0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
48e0: 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20  gno<=pBt->nPage 
48f0: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 48 61 73  );.    pBt->pHas
4900: 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74 65  Content = sqlite
4910: 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 42  3BitvecCreate(pB
4920: 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 69  t->nPage);.    i
4930: 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e  f( !pBt->pHasCon
4940: 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63  tent ){.      rc
4950: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
4960: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
4970: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
4980: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
4990: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
49a0: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
49b0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
49c0: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
49d0: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
49e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
49f0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
4a00: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
4a10: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
4a20: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
4a30: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
4a40: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
4a50: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4a60: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
4a70: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
4a80: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
4a90: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
4aa0: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
4ab0: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
4ac0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
4ad0: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
4ae0: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
4af0: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
4b00: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
4b10: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
4b20: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
4b30: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
4b40: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
4b50: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
4b60: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
4b70: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
4b80: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
4b90: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
4ba0: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
4bb0: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
4bc0: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
4bd0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4be0: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
4bf0: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
4c00: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
4c10: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
4c20: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
4c30: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
4c40: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
4c50: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
4c60: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
4c70: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
4c80: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
4c90: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
4ca0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
4cb0: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
4cc0: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
4cd0: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
4ce0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
4cf0: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
4d00: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
4d10: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
4d20: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
4d30: 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
4d40: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
4d50: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
4d60: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  ;.    pCur->apPa
4d70: 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  ge[i] = 0;.  }. 
4d80: 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
4d90: 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  1;.}.../*.** Sav
4da0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  e the current cu
4db0: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e  rsor position in
4dc0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 73 20 42   the variables B
4dd0: 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a  tCursor.nKey .**
4de0: 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b   and BtCursor.pK
4df0: 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73  ey. The cursor's
4e00: 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
4e10: 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
4e20: 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  EEK..**.** The c
4e30: 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
4e40: 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
4e50: 72 20 69 73 20 76 61 6c 69 64 20 28 68 61 73 20  r is valid (has 
4e60: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
4e70: 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72 20 74  ALID).** prior t
4e80: 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
4e90: 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61  outine.  .*/.sta
4ea0: 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73  tic int saveCurs
4eb0: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
4ec0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
4ed0: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
4ee0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
4ef0: 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20  Cur->eState );. 
4f00: 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72   assert( 0==pCur
4f10: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ->pKey );.  asse
4f20: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
4f30: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
4f40: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
4f50: 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
4f60: 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20  &pCur->nKey);.  
4f70: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
4f80: 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b 65 79  TE_OK );  /* Key
4f90: 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20 66 61  Size() cannot fa
4fa0: 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  il */..  /* If t
4fb0: 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65 79  his is an intKey
4fc0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65   table, then the
4fd0: 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42   above call to B
4fe0: 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20 20  treeKeySize().  
4ff0: 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e  ** stores the in
5000: 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43 75  teger key in pCu
5010: 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73  r->nKey. In this
5020: 20 63 61 73 65 20 74 68 69 73 20 76 61 6c 75 65   case this value
5030: 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61   is.  ** all tha
5040: 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 4f  t is required. O
5050: 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 75  therwise, if pCu
5060: 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e  r is not open on
5070: 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20   an intKey.  ** 
5080: 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c  table, then mall
5090: 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  oc space for and
50a0: 20 73 74 6f 72 65 20 74 68 65 20 70 43 75 72 2d   store the pCur-
50b0: 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b  >nKey bytes of k
50c0: 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20  ey .  ** data.. 
50d0: 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70 43 75   */.  if( 0==pCu
50e0: 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
50f0: 74 4b 65 79 20 29 7b 0a 20 20 20 20 76 6f 69 64  tKey ){.    void
5100: 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33   *pKey = sqlite3
5110: 4d 61 6c 6c 6f 63 28 20 28 69 6e 74 29 70 43 75  Malloc( (int)pCu
5120: 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20 69  r->nKey );.    i
5130: 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 20  f( pKey ){.     
5140: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
5150: 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 28  eeKey(pCur, 0, (
5160: 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20  int)pCur->nKey, 
5170: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28  pKey);.      if(
5180: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
5190: 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
51a0: 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20  pKey = pKey;.   
51b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
51c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
51d0: 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Key);.      }.  
51e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
51f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
5200: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
5210: 73 65 72 74 28 20 21 70 43 75 72 2d 3e 61 70 50  sert( !pCur->apP
5220: 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c  age[0]->intKey |
5230: 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b  | !pCur->pKey );
5240: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
5250: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72  TE_OK ){.    btr
5260: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
5270: 6f 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20  orPages(pCur);. 
5280: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
5290: 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  = CURSOR_REQUIRE
52a0: 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76  SEEK;.  }..  inv
52b0: 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
52c0: 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 72 65  ache(pCur);.  re
52d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
52e0: 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74  * Save the posit
52f0: 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73  ions of all curs
5300: 6f 72 73 20 28 65 78 63 65 70 74 20 70 45 78 63  ors (except pExc
5310: 65 70 74 29 20 74 68 61 74 20 61 72 65 20 6f 70  ept) that are op
5320: 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62  en on.** the tab
5330: 6c 65 20 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  le  with root-pa
5340: 67 65 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c  ge iRoot. Usuall
5350: 79 2c 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  y, this is calle
5360: 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75  d just before cu
5370: 72 73 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20  rsor.** pExcept 
5380: 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66  is used to modif
5390: 79 20 74 68 65 20 74 61 62 6c 65 20 28 42 74 72  y the table (Btr
53a0: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
53b0: 72 65 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f  reeInsert())..*/
53c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
53d0: 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61  AllCursors(BtSha
53e0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69  red *pBt, Pgno i
53f0: 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a  Root, BtCursor *
5400: 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75  pExcept){.  BtCu
5410: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
5420: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
5430: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
5440: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
5450: 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78  Except==0 || pEx
5460: 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29  cept->pBt==pBt )
5470: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
5480: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
5490: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
54a0: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
54b0: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
54c0: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
54d0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65  {.      if( p->e
54e0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
54f0: 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 69  LID ){.        i
5500: 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75 72 73  nt rc = saveCurs
5510: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
5520: 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
5530: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
5540: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
5550: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5560: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5570: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61  testcase( p->iPa
5580: 67 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ge>0 );.        
5590: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
55a0: 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20  ursorPages(p);. 
55b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
55c0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
55d0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
55e0: 65 61 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ear the current 
55f0: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
5600: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5610: 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
5620: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
5630: 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
5640: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
5650: 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  r) );.  sqlite3_
5660: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
5670: 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d  ;.  pCur->pKey =
5680: 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61   0;.  pCur->eSta
5690: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
56a0: 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  LID;.}../*.** In
56b0: 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   this version of
56c0: 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b   BtreeMoveto, pK
56d0: 65 79 20 69 73 20 61 20 70 61 63 6b 65 64 20 69  ey is a packed i
56e0: 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73  ndex record.** s
56f0: 75 63 68 20 61 73 20 69 73 20 67 65 6e 65 72 61  uch as is genera
5700: 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61  ted by the OP_Ma
5710: 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
5720: 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20    Unpack the.** 
5730: 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20  record and then 
5740: 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f  call BtreeMoveto
5750: 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f  Unpacked() to do
5760: 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74   the work..*/.st
5770: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 4d 6f  atic int btreeMo
5780: 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72  veto(.  BtCursor
5790: 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43   *pCur,     /* C
57a0: 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68  ursor open on th
57b0: 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 73 65  e btree to be se
57c0: 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  arched */.  cons
57d0: 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
57e0: 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66  /* Packed key if
57f0: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6e   the btree is an
5800: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20   index */.  i64 
5810: 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
5820: 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66  /* Integer key f
5830: 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65  or tables.  Size
5840: 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64   of pKey for ind
5850: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69  ices */.  int bi
5860: 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  as,           /*
5870: 20 42 69 61 73 20 73 65 61 72 63 68 20 74 6f 20   Bias search to 
5880: 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
5890: 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
58a0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
58b0: 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
58c0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
58d0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
58e0: 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20        /* Status 
58f0: 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  code */.  Unpack
5900: 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
5910: 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64  y;   /* Unpacked
5920: 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20   index key */.  
5930: 63 68 61 72 20 61 53 70 61 63 65 5b 32 30 30 5d  char aSpace[200]
5940: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  ;          /* Te
5950: 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70 49 64  mp space for pId
5960: 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69 64 20  xKey - to avoid 
5970: 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68  a malloc */.  ch
5980: 61 72 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a  ar *pFree = 0;..
5990: 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
59a0: 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d    assert( nKey==
59b0: 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29  (i64)(int)nKey )
59c0: 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20  ;.    pIdxKey = 
59d0: 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63  sqlite3VdbeAlloc
59e0: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a  UnpackedRecord(.
59f0: 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b          pCur->pK
5a00: 65 79 49 6e 66 6f 2c 20 61 53 70 61 63 65 2c 20  eyInfo, aSpace, 
5a10: 73 69 7a 65 6f 66 28 61 53 70 61 63 65 29 2c 20  sizeof(aSpace), 
5a20: 26 70 46 72 65 65 0a 20 20 20 20 29 3b 0a 20 20  &pFree.    );.  
5a30: 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30    if( pIdxKey==0
5a40: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
5a50: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 73 71 6c 69  _NOMEM;.    sqli
5a60: 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
5a70: 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ack(pCur->pKeyIn
5a80: 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70  fo, (int)nKey, p
5a90: 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  Key, pIdxKey);. 
5aa0: 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e     if( pIdxKey->
5ab0: 6e 46 69 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20  nField==0 ){.   
5ac0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
5ad0: 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d  (pCur->pKeyInfo-
5ae0: 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 20  >db, pFree);.   
5af0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5b00: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
5b10: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
5b20: 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20    pIdxKey = 0;. 
5b30: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
5b40: 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
5b50: 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b  cked(pCur, pIdxK
5b60: 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20  ey, nKey, bias, 
5b70: 70 52 65 73 29 3b 0a 20 20 69 66 28 20 70 46 72  pRes);.  if( pFr
5b80: 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ee ){.    sqlite
5b90: 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b  3DbFree(pCur->pK
5ba0: 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65  eyInfo->db, pFre
5bb0: 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
5bc0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
5bd0: 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72  store the cursor
5be0: 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   to the position
5bf0: 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20 61   it was in (or a
5c00: 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f  s close to as po
5c10: 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20  ssible).** when 
5c20: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
5c30: 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2e  on() was called.
5c40: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20   Note that this 
5c50: 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68 65  call deletes the
5c60: 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69 74   .** saved posit
5c70: 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64 20  ion info stored 
5c80: 62 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  by saveCursorPos
5c90: 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72  ition(), so ther
5ca0: 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d  e can be.** at m
5cb0: 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69 76  ost one effectiv
5cc0: 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  e restoreCursorP
5cd0: 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61  osition() call a
5ce0: 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61  fter each .** sa
5cf0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
5d00: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
5d10: 74 20 62 74 72 65 65 52 65 73 74 6f 72 65 43 75  t btreeRestoreCu
5d20: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
5d30: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5d40: 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
5d50: 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
5d60: 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
5d70: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
5d80: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
5d90: 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20  RESEEK );.  if( 
5da0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
5db0: 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
5dc0: 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
5dd0: 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70  kipNext;.  }.  p
5de0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
5df0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
5e00: 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f  rc = btreeMoveto
5e10: 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65  (pCur, pCur->pKe
5e20: 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30  y, pCur->nKey, 0
5e30: 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  , &pCur->skipNex
5e40: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
5e50: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
5e60: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
5e70: 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75  ->pKey);.    pCu
5e80: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20  r->pKey = 0;.   
5e90: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
5ea0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
5eb0: 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
5ec0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
5ed0: 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  LID );.    if( p
5ee0: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26  Cur->skipNext &&
5ef0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
5f00: 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
5f10: 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
5f20: 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e  e = CURSOR_SKIPN
5f30: 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  EXT;.    }.  }. 
5f40: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
5f50: 64 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75  define restoreCu
5f60: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20  rsorPosition(p) 
5f70: 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d  \.  (p->eState>=
5f80: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5f90: 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20  EK ? \.         
5fa0: 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73  btreeRestoreCurs
5fb0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20  orPosition(p) : 
5fc0: 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  \.         SQLIT
5fd0: 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74  E_OK)../*.** Det
5fe0: 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
5ff0: 72 20 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68  r not a cursor h
6000: 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68  as moved from th
6010: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a  e position it.**
6020: 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64   was last placed
6030: 20 61 74 2e 20 20 43 75 72 73 6f 72 73 20 63 61   at.  Cursors ca
6040: 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20  n move when the 
6050: 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69  row they are poi
6060: 6e 74 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64  nting.** at is d
6070: 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
6080: 75 6e 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a  under them..**.*
6090: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
60a0: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
60b0: 63 6f 64 65 20 69 66 20 73 6f 6d 65 74 68 69 6e  code if somethin
60c0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54  g goes wrong.  T
60d0: 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70  he.** integer *p
60e0: 48 61 73 4d 6f 76 65 64 20 69 73 20 73 65 74 20  HasMoved is set 
60f0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
6100: 2a 20 20 20 20 30 3a 20 20 20 54 68 65 20 63 75  *    0:   The cu
6110: 72 73 6f 72 20 69 73 20 75 6e 63 68 61 6e 67 65  rsor is unchange
6120: 64 0a 2a 2a 20 20 20 20 31 3a 20 20 20 54 68 65  d.**    1:   The
6130: 20 63 75 72 73 6f 72 20 69 73 20 73 74 69 6c 6c   cursor is still
6140: 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
6150: 20 73 61 6d 65 20 72 6f 77 2c 20 62 75 74 20 74   same row, but t
6160: 68 65 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 20  he pointers.**  
6170: 20 20 20 20 20 20 20 72 65 74 75 72 6e 65 64 20         returned 
6180: 62 79 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  by sqlite3BtreeK
6190: 65 79 46 65 74 63 68 28 29 20 6f 72 20 73 71 6c  eyFetch() or sql
61a0: 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74  ite3BtreeDataFet
61b0: 63 68 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  ch().**         
61c0: 6d 69 67 68 74 20 6e 6f 77 20 62 65 20 69 6e 76  might now be inv
61d0: 61 6c 69 64 20 62 65 63 61 75 73 65 20 6f 66 20  alid because of 
61e0: 61 20 62 61 6c 61 6e 63 65 28 29 20 6f 72 20 6f  a balance() or o
61f0: 74 68 65 72 20 63 68 61 6e 67 65 20 74 6f 20 74  ther change to t
6200: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 62 2d  he.**         b-
6210: 74 72 65 65 2e 0a 2a 2a 20 20 20 20 32 3a 20 20  tree..**    2:  
6220: 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   The cursor is n
6230: 6f 20 6c 6f 6e 67 65 72 20 70 6f 69 6e 74 69 6e  o longer pointin
6240: 67 20 74 6f 20 74 68 65 20 72 6f 77 2e 20 20 54  g to the row.  T
6250: 68 65 20 72 6f 77 20 6d 69 67 68 74 20 68 61 76  he row might hav
6260: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 62 65 65  e.**         bee
6270: 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  n deleted out fr
6280: 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72  om under the cur
6290: 73 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sor..*/.int sqli
62a0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
62b0: 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20  sMoved(BtCursor 
62c0: 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73  *pCur, int *pHas
62d0: 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63  Moved){.  int rc
62e0: 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  ;..  if( pCur->e
62f0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
6300: 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 48 61 73  LID ){.    *pHas
6310: 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 20 20 72  Moved = 0;.    r
6320: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6330: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 72 65 73 74  .  }.  rc = rest
6340: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
6350: 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
6360: 63 20 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f  c ){.    *pHasMo
6370: 76 65 64 20 3d 20 32 3b 0a 20 20 20 20 72 65 74  ved = 2;.    ret
6380: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
6390: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
63a0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
63b0: 4e 45 56 45 52 28 70 43 75 72 2d 3e 73 6b 69 70  NEVER(pCur->skip
63c0: 4e 65 78 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  Next!=0) ){.    
63d0: 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 32 3b 0a  *pHasMoved = 2;.
63e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48    }else{.    *pH
63f0: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  asMoved = 1;.  }
6400: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6410: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
6420: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
6430: 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76  VACUUM./*.** Giv
6440: 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  en a page number
6450: 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64 61   of a regular da
6460: 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65 74  tabase page, ret
6470: 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20  urn the page.** 
6480: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70  number for the p
6490: 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20  ointer-map page 
64a0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
64b0: 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a  e entry for the.
64c0: 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75  ** input page nu
64d0: 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  mber..**.** Retu
64e0: 72 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c 69  rn 0 (not a vali
64f0: 64 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e 6f  d page) for pgno
6500: 3d 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65 20  ==1 since there 
6510: 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72  is.** no pointer
6520: 20 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64 20   map associated 
6530: 77 69 74 68 20 70 61 67 65 20 31 2e 20 20 54 68  with page 1.  Th
6540: 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  e integrity_chec
6550: 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69  k logic.** requi
6560: 72 65 73 20 74 68 61 74 20 70 74 72 6d 61 70 50  res that ptrmapP
6570: 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a  ageno(*,1)!=1..*
6580: 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74  /.static Pgno pt
6590: 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61  rmapPageno(BtSha
65a0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
65b0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67  gno){.  int nPag
65c0: 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20  esPerMapPage;.  
65d0: 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65  Pgno iPtrMap, re
65e0: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
65f0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
6600: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
6610: 20 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72 65   if( pgno<2 ) re
6620: 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73  turn 0;.  nPages
6630: 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42  PerMapPage = (pB
6640: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29  t->usableSize/5)
6650: 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20  +1;.  iPtrMap = 
6660: 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50  (pgno-2)/nPagesP
6670: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74  erMapPage;.  ret
6680: 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67   = (iPtrMap*nPag
6690: 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20  esPerMapPage) + 
66a0: 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50  2; .  if( ret==P
66b0: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
66c0: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74  (pBt) ){.    ret
66d0: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
66e0: 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57   ret;.}../*.** W
66f0: 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  rite an entry in
6700: 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  to the pointer m
6710: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
6720: 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20 74  outine updates t
6730: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
6740: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75  ntry for page nu
6750: 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f  mber 'key'.** so
6760: 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f   that it maps to
6770: 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61 6e   type 'eType' an
6780: 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  d parent page nu
6790: 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a  mber 'pgno'..**.
67a0: 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69 6e  ** If *pRC is in
67b0: 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f  itially non-zero
67c0: 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29   (non-SQLITE_OK)
67d0: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
67e0: 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70  ne is.** a no-op
67f0: 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  .  If an error o
6800: 63 63 75 72 73 2c 20 74 68 65 20 61 70 70 72 6f  ccurs, the appro
6810: 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
6820: 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  e is written.** 
6830: 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74  into *pRC..*/.st
6840: 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70  atic void ptrmap
6850: 50 75 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  Put(BtShared *pB
6860: 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20  t, Pgno key, u8 
6870: 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65  eType, Pgno pare
6880: 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  nt, int *pRC){. 
6890: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
68a0: 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65  ;  /* The pointe
68b0: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
68c0: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
68d0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
68e0: 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50   map data */.  P
68f0: 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20  gno iPtrmap;    
6900: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
6910: 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20  map page number 
6920: 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b  */.  int offset;
6930: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
6940: 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20   in pointer map 
6950: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  page */.  int rc
6960: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
6970: 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
6980: 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  subfunctions */.
6990: 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
69a0: 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
69b0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
69c0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
69d0: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74  );.  /* The mast
69e0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  er-journal page 
69f0: 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65  number must neve
6a00: 72 20 62 65 20 75 73 65 64 20 61 73 20 61 20 70  r be used as a p
6a10: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
6a20: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  */.  assert( 0==
6a30: 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
6a40: 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t, PENDING_BYTE_
6a50: 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20  PAGE(pBt)) );.. 
6a60: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
6a70: 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66  toVacuum );.  if
6a80: 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20  ( key==0 ){.    
6a90: 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRC = SQLITE_CO
6aa0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
6ab0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50  return;.  }.  iP
6ac0: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
6ad0: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
6ae0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
6af0: 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
6b00: 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70  ger, iPtrmap, &p
6b10: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
6b20: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
6b30: 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
6b40: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
6b50: 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50   offset = PTRMAP
6b60: 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d  _PTROFFSET(iPtrm
6b70: 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20  ap, key);.  if( 
6b80: 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20  offset<0 ){.    
6b90: 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRC = SQLITE_CO
6ba0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
6bb0: 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69 74  goto ptrmap_exit
6bc0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
6bd0: 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70  offset <= (int)p
6be0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35  Bt->usableSize-5
6bf0: 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20   );.  pPtrmap = 
6c00: 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67  (u8 *)sqlite3Pag
6c10: 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
6c20: 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65  e);..  if( eType
6c30: 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  !=pPtrmap[offset
6c40: 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70  ] || get4byte(&p
6c50: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d  Ptrmap[offset+1]
6c60: 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20  )!=parent ){.   
6c70: 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f   TRACE(("PTRMAP_
6c80: 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c  UPDATE: %d->(%d,
6c90: 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79  %d)\n", key, eTy
6ca0: 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20  pe, parent));.  
6cb0: 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71 6c    *pRC= rc = sql
6cc0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
6cd0: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
6ce0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
6cf0: 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b  {.      pPtrmap[
6d00: 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b  offset] = eType;
6d10: 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
6d20: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
6d30: 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20  1], parent);.   
6d40: 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65   }.  }..ptrmap_e
6d50: 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50 61  xit:.  sqlite3Pa
6d60: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
6d70: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  );.}../*.** Read
6d80: 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74   an entry from t
6d90: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
6da0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
6db0: 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68 65  ne retrieves the
6dc0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
6dd0: 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79  ry for page 'key
6de0: 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68  ', writing.** th
6df0: 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e  e type and paren
6e00: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  t page number to
6e10: 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50   *pEType and *pP
6e20: 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79  gno respectively
6e30: 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f  ..** An error co
6e40: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  de is returned i
6e50: 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
6e60: 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73   wrong, otherwis
6e70: 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  e SQLITE_OK..*/.
6e80: 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61  static int ptrma
6e90: 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a 70  pGet(BtShared *p
6ea0: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
6eb0: 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a   *pEType, Pgno *
6ec0: 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65  pPgno){.  DbPage
6ed0: 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20   *pDbPage;   /* 
6ee0: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
6ef0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50  page */.  int iP
6f00: 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20  trmap;       /* 
6f10: 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  Pointer map page
6f20: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a   index */.  u8 *
6f30: 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  pPtrmap;       /
6f40: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
6f50: 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ge data */.  int
6f60: 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20   offset;        
6f70: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74  /* Offset of ent
6f80: 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61  ry in pointer ma
6f90: 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  p */.  int rc;..
6fa0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6fb0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
6fc0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69  ->mutex) );..  i
6fd0: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
6fe0: 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29  PAGENO(pBt, key)
6ff0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
7000: 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
7010: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26  ager, iPtrmap, &
7020: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
7030: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  rc!=0 ){.    ret
7040: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
7050: 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71  trmap = (u8 *)sq
7060: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
7070: 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f  a(pDbPage);..  o
7080: 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50  ffset = PTRMAP_P
7090: 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70  TROFFSET(iPtrmap
70a0: 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66  , key);.  if( of
70b0: 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71  fset<0 ){.    sq
70c0: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
70d0: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65  pDbPage);.    re
70e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
70f0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
7100: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c  assert( offset <
7110: 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62  = (int)pBt->usab
7120: 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73  leSize-5 );.  as
7130: 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20  sert( pEType!=0 
7140: 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70  );.  *pEType = p
7150: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a  Ptrmap[offset];.
7160: 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70    if( pPgno ) *p
7170: 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
7180: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
7190: 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50  1]);..  sqlite3P
71a0: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
71b0: 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70  e);.  if( *pETyp
71c0: 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35  e<1 || *pEType>5
71d0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
71e0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
71f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7200: 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69  K;.}..#else /* i
7210: 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45  f defined SQLITE
7220: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
7230: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74   */.  #define pt
7240: 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c  rmapPut(w,x,y,z,
7250: 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74  rc).  #define pt
7260: 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29  rmapGet(w,x,y,z)
7270: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
7280: 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76  fine ptrmapPutOv
7290: 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a  flPtr(x, y, rc).
72a0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69  #endif../*.** Gi
72b0: 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65  ven a btree page
72c0: 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65   and a cell inde
72d0: 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66  x (0 means the f
72e0: 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20  irst cell on.** 
72f0: 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e  the page, 1 mean
7300: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c  s the second cel
7310: 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  l, and so forth)
7320: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
7330: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c  r.** to the cell
7340: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
7350: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
7360: 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65  ks only for page
7370: 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f  s that do not co
7380: 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ntain overflow c
7390: 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ells..*/.#define
73a0: 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c   findCell(P,I) \
73b0: 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b  .  ((P)->aData +
73c0: 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20   ((P)->maskPage 
73d0: 26 20 67 65 74 32 62 79 74 65 28 26 28 50 29 2d  & get2byte(&(P)-
73e0: 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d  >aCellIdx[2*(I)]
73f0: 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64  ))).#define find
7400: 43 65 6c 6c 76 32 28 44 2c 4d 2c 4f 2c 49 29 20  Cellv2(D,M,O,I) 
7410: 28 44 2b 28 4d 26 67 65 74 32 62 79 74 65 28 44  (D+(M&get2byte(D
7420: 2b 28 4f 2b 32 2a 28 49 29 29 29 29 29 0a 0a 0a  +(O+2*(I)))))...
7430: 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72  /*.** This a mor
7440: 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f  e complex versio
7450: 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28 29 20  n of findCell() 
7460: 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a  that works for.*
7470: 2a 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20  * pages that do 
7480: 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77  contain overflow
7490: 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   cells..*/.stati
74a0: 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c  c u8 *findOverfl
74b0: 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  owCell(MemPage *
74c0: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
74d0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
74e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
74f0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
7500: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
7510: 20 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f   for(i=pPage->nO
7520: 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b  verflow-1; i>=0;
7530: 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b   i--){.    int k
7540: 3b 0a 20 20 20 20 6b 20 3d 20 70 50 61 67 65 2d  ;.    k = pPage-
7550: 3e 61 69 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20  >aiOvfl[i];.    
7560: 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a  if( k<=iCell ){.
7570: 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65        if( k==iCe
7580: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ll ){.        re
7590: 74 75 72 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76  turn pPage->apOv
75a0: 66 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  fl[i];.      }. 
75b0: 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20       iCell--;.  
75c0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
75d0: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
75e0: 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   iCell);.}../*.*
75f0: 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63  * Parse a cell c
7600: 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64  ontent block and
7610: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c   fill in the Cel
7620: 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  lInfo structure.
7630: 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74    There.** are t
7640: 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  wo versions of t
7650: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 62  his function.  b
7660: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20  treeParseCell() 
7670: 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c  takes a .** cell
7680: 20 69 6e 64 65 78 20 61 73 20 74 68 65 20 73 65   index as the se
7690: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e  cond argument an
76a0: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
76b0: 50 74 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20  Ptr() .** takes 
76c0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
76d0: 20 62 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c   body of the cel
76e0: 6c 20 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20  l as its second 
76f0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
7700: 57 69 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65  Within this file
7710: 2c 20 74 68 65 20 70 61 72 73 65 43 65 6c 6c 28  , the parseCell(
7720: 29 20 6d 61 63 72 6f 20 63 61 6e 20 62 65 20 63  ) macro can be c
7730: 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 20 6f 66  alled instead of
7740: 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
7750: 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e 67 20 73  llPtr(). Using s
7760: 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74  ome compilers, t
7770: 68 69 73 20 77 69 6c 6c 20 62 65 20 66 61 73 74  his will be fast
7780: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
7790: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
77a0: 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20  lPtr(.  MemPage 
77b0: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
77c0: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
77d0: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
77e0: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
77f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
7800: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
7810: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
7820: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
7830: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
7840: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
7850: 29 7b 0a 20 20 75 31 36 20 6e 3b 20 20 20 20 20  ){.  u16 n;     
7860: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7870: 4e 75 6d 62 65 72 20 62 79 74 65 73 20 69 6e 20  Number bytes in 
7880: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61  cell content hea
7890: 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61  der */.  u32 nPa
78a0: 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20  yload;          
78b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
78c0: 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c  tes of cell payl
78d0: 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  oad */..  assert
78e0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
78f0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
7900: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 49  >mutex) );..  pI
7910: 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65  nfo->pCell = pCe
7920: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ll;.  assert( pP
7930: 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20  age->leaf==0 || 
7940: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29  pPage->leaf==1 )
7950: 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63  ;.  n = pPage->c
7960: 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 61  hildPtrSize;.  a
7970: 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50  ssert( n==4-4*pP
7980: 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69  age->leaf );.  i
7990: 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
79a0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
79b0: 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20  e->hasData ){.  
79c0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 30      assert( n==0
79d0: 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 67 65   );.      n = ge
79e0: 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c  tVarint32(pCell,
79f0: 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20   nPayload);.    
7a00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61  }else{.      nPa
7a10: 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d  yload = 0;.    }
7a20: 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72  .    n += getVar
7a30: 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28  int(&pCell[n], (
7a40: 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65  u64*)&pInfo->nKe
7a50: 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  y);.    pInfo->n
7a60: 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  Data = nPayload;
7a70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
7a80: 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 30 3b 0a  nfo->nData = 0;.
7a90: 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69      n += getVari
7aa0: 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20  nt32(&pCell[n], 
7ab0: 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70  nPayload);.    p
7ac0: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61  Info->nKey = nPa
7ad0: 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e  yload;.  }.  pIn
7ae0: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
7af0: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
7b00: 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20  ->nHeader = n;. 
7b10: 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c   testcase( nPayl
7b20: 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad==pPage->maxL
7b30: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
7b40: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
7b50: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
7b60: 29 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c 79 28  );.  if( likely(
7b70: 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
7b80: 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a 20 20  >maxLocal) ){.  
7b90: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
7ba0: 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63   (easy) common c
7bb0: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e  ase where the en
7bc0: 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74  tire payload fit
7bd0: 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  s.    ** on the 
7be0: 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20  local page.  No 
7bf0: 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75  overflow is requ
7c00: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
7c10: 20 69 66 28 20 28 70 49 6e 66 6f 2d 3e 6e 53 69   if( (pInfo->nSi
7c20: 7a 65 20 3d 20 28 75 31 36 29 28 6e 2b 6e 50 61  ze = (u16)(n+nPa
7c30: 79 6c 6f 61 64 29 29 3c 34 20 29 20 70 49 6e 66  yload))<4 ) pInf
7c40: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20  o->nSize = 4;.  
7c50: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
7c60: 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b  = (u16)nPayload;
7c70: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  .    pInfo->iOve
7c80: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c  rflow = 0;.  }el
7c90: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
7ca0: 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e  e payload will n
7cb0: 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c  ot fit completel
7cc0: 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  y on the local p
7cd0: 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20  age, we have.   
7ce0: 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f   ** to decide ho
7cf0: 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20  w much to store 
7d00: 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20  locally and how 
7d10: 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e  much to spill on
7d20: 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  to.    ** overfl
7d30: 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20 73  ow pages.  The s
7d40: 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69  trategy is to mi
7d50: 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e  nimize the amoun
7d60: 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20  t of unused.    
7d70: 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72  ** space on over
7d80: 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65  flow pages while
7d90: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f   keeping the amo
7da0: 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f  unt of local sto
7db0: 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62  rage.    ** in b
7dc0: 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20  etween minLocal 
7dd0: 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20  and maxLocal..  
7de0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e    **.    ** Warn
7df0: 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74  ing:  changing t
7e00: 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20  he way overflow 
7e10: 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72  payload is distr
7e20: 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20  ibuted in any.  
7e30: 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65    ** way will re
7e40: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  sult in an incom
7e50: 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72  patible file for
7e60: 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mat..    */.    
7e70: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f  int minLocal;  /
7e80: 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Minimum amount
7e90: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
7ea0: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
7eb0: 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f  int maxLocal;  /
7ec0: 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Maximum amount
7ed0: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
7ee0: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
7ef0: 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f  int surplus;   /
7f00: 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  * Overflow paylo
7f10: 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ad available for
7f20: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a   local storage *
7f30: 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20  /..    minLocal 
7f40: 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
7f50: 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20  l;.    maxLocal 
7f60: 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  = pPage->maxLoca
7f70: 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d  l;.    surplus =
7f80: 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61   minLocal + (nPa
7f90: 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c  yload - minLocal
7fa0: 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  )%(pPage->pBt->u
7fb0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
7fc0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 75      testcase( su
7fd0: 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20  rplus==maxLocal 
7fe0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
7ff0: 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63   surplus==maxLoc
8000: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
8010: 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f  surplus <= maxLo
8020: 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  cal ){.      pIn
8030: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
8040: 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d  6)surplus;.    }
8050: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66  else{.      pInf
8060: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
8070: 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d  )minLocal;.    }
8080: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  .    pInfo->iOve
8090: 72 66 6c 6f 77 20 3d 20 28 75 31 36 29 28 70 49  rflow = (u16)(pI
80a0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 29  nfo->nLocal + n)
80b0: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  ;.    pInfo->nSi
80c0: 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  ze = pInfo->iOve
80d0: 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d  rflow + 4;.  }.}
80e0: 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65 43 65  .#define parseCe
80f0: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c  ll(pPage, iCell,
8100: 20 70 49 6e 66 6f 29 20 5c 0a 20 20 62 74 72 65   pInfo) \.  btre
8110: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 28 70  eParseCellPtr((p
8120: 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28  Page), findCell(
8130: 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c 6c 29  (pPage), (iCell)
8140: 29 2c 20 28 70 49 6e 66 6f 29 29 0a 73 74 61 74  ), (pInfo)).stat
8150: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
8160: 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  seCell(.  MemPag
8170: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
8180: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
8190: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
81a0: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20  .  int iCell,   
81b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
81c0: 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46  e cell index.  F
81d0: 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a  irst cell is 0 *
81e0: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
81f0: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
8200: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
8210: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61  cture */.){.  pa
8220: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  rseCell(pPage, i
8230: 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a  Cell, pInfo);.}.
8240: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
8250: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
8260: 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20  of bytes that a 
8270: 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68  Cell needs in th
8280: 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61  e cell.** data a
8290: 72 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65  rea of the btree
82a0: 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75  -page.  The retu
82b0: 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64  rn number includ
82c0: 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64  es the cell.** d
82d0: 61 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74  ata header and t
82e0: 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64  he local payload
82f0: 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76  , but not any ov
8300: 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a  erflow page or.*
8310: 2a 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64  * the space used
8320: 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69   by the cell poi
8330: 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nter..*/.static 
8340: 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  u16 cellSizePtr(
8350: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8360: 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38  u8 *pCell){.  u8
8370: 20 2a 70 49 74 65 72 20 3d 20 26 70 43 65 6c 6c   *pIter = &pCell
8380: 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  [pPage->childPtr
8390: 53 69 7a 65 5d 3b 0a 20 20 75 33 32 20 6e 53 69  Size];.  u32 nSi
83a0: 7a 65 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ze;..#ifdef SQLI
83b0: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68  TE_DEBUG.  /* Th
83c0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
83d0: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
83e0: 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  n should always 
83f0: 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20  be the same as. 
8400: 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66   ** the (CellInf
8410: 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66  o.nSize) value f
8420: 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20  ound by doing a 
8430: 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68  full parse of th
8440: 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20  e.  ** cell. If 
8450: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20  SQLITE_DEBUG is 
8460: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
8470: 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74  rt() at the bott
8480: 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  om of.  ** this 
8490: 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65  function verifie
84a0: 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61  s that this inva
84b0: 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f  riant is not vio
84c0: 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c  lated. */.  Cell
84d0: 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a  Info debuginfo;.
84e0: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
84f0: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
8500: 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23  , &debuginfo);.#
8510: 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61  endif..  if( pPa
8520: 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
8530: 20 20 75 38 20 2a 70 45 6e 64 3b 0a 20 20 20 20    u8 *pEnd;.    
8540: 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
8550: 74 61 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  ta ){.      pIte
8560: 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  r += getVarint32
8570: 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a  (pIter, nSize);.
8580: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8590: 20 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20   nSize = 0;.    
85a0: 7d 0a 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20  }..    /* pIter 
85b0: 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68  now points at th
85c0: 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  e 64-bit integer
85d0: 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61   key value, a va
85e0: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20  riable length . 
85f0: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54     ** integer. T
8600: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
8610: 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74  ck moves pIter t
8620: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66  o point at the f
8630: 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a  irst byte.    **
8640: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
8650: 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
8660: 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70  */.    pEnd = &p
8670: 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Iter[9];.    whi
8680: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
8690: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
86a0: 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d );.  }else{.  
86b0: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
86c0: 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53  rint32(pIter, nS
86d0: 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 74 65 73  ize);.  }..  tes
86e0: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
86f0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
8700: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
8710: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
8720: 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e  cal+1 );.  if( n
8730: 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c  Size>pPage->maxL
8740: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
8750: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
8760: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
8770: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
8780: 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c   + (nSize - minL
8790: 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e  ocal) % (pPage->
87a0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
87b0: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
87c0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
87d0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
87e0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
87f0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
8800: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
8810: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
8820: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e  Local ){.      n
8830: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  Size = minLocal;
8840: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65  .    }.    nSize
8850: 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 6e 53 69   += 4;.  }.  nSi
8860: 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65  ze += (u32)(pIte
8870: 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 0a 20 20 2f  r - pCell);..  /
8880: 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69  * The minimum si
8890: 7a 65 20 6f 66 20 61 6e 79 20 63 65 6c 6c 20 69  ze of any cell i
88a0: 73 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20  s 4 bytes. */.  
88b0: 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b 0a 20  if( nSize<4 ){. 
88c0: 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20     nSize = 4;.  
88d0: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69  }..  assert( nSi
88e0: 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53  ze==debuginfo.nS
88f0: 69 7a 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ize );.  return 
8900: 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23  (u16)nSize;.}..#
8910: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
8920: 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61  UG./* This varia
8930: 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65  tion on cellSize
8940: 50 74 72 28 29 20 69 73 20 75 73 65 64 20 69 6e  Ptr() is used in
8950: 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29  side of assert()
8960: 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f   statements.** o
8970: 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75  nly. */.static u
8980: 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50  16 cellSize(MemP
8990: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
89a0: 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e  iCell){.  return
89b0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
89c0: 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ge, findCell(pPa
89d0: 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23  ge, iCell));.}.#
89e0: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
89f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
8a00: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ACUUM./*.** If t
8a10: 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70  he cell pCell, p
8a20: 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61 67  art of page pPag
8a30: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
8a40: 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76  nter.** to an ov
8a50: 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73  erflow page, ins
8a60: 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ert an entry int
8a70: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
8a80: 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65  p.** for the ove
8a90: 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73  rflow page..*/.s
8aa0: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
8ab0: 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50  pPutOvflPtr(MemP
8ac0: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
8ad0: 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29  pCell, int *pRC)
8ae0: 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  {.  CellInfo inf
8af0: 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  o;.  if( *pRC ) 
8b00: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
8b10: 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20  ( pCell!=0 );.  
8b20: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
8b30: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
8b40: 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  &info);.  assert
8b50: 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70  ( (info.nData+(p
8b60: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69  Page->intKey?0:i
8b70: 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f  nfo.nKey))==info
8b80: 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 69  .nPayload );.  i
8b90: 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
8ba0: 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76  w ){.    Pgno ov
8bb0: 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
8bc0: 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
8bd0: 6c 6f 77 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61  low]);.    ptrma
8be0: 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
8bf0: 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56   ovfl, PTRMAP_OV
8c00: 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
8c10: 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a  pgno, pRC);.  }.
8c20: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
8c30: 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20   Defragment the 
8c40: 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c  page given.  All
8c50: 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64   Cells are moved
8c60: 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
8c70: 66 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61  f the page and a
8c80: 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73  ll free space is
8c90: 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20   collected into 
8ca0: 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42  one.** big FreeB
8cb0: 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  lk that occurs i
8cc0: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65  n between the he
8cd0: 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a  ader and cell.**
8ce0: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61   pointer array a
8cf0: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
8d00: 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61  ent area..*/.sta
8d10: 74 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65  tic int defragme
8d20: 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  ntPage(MemPage *
8d30: 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
8d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d50: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
8d60: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63  nter */.  int pc
8d70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8d80: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
8d90: 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a  of a i-th cell *
8da0: 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8dc0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
8dd0: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
8de0: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8e00: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
8e10: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
8e20: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
8e30: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c   Number of usabl
8e40: 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67  e bytes on a pag
8e50: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  e */.  int cellO
8e60: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
8e70: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
8e80: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
8e90: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63  array */.  int c
8ea0: 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  brk;            
8eb0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
8ec0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
8ed0: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
8ee0: 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
8ef0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
8f00: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
8f10: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  he page */.  uns
8f20: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
8f30: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
8f40: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e  age data */.  un
8f50: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
8f60: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  p;       /* Temp
8f70: 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63   area for cell c
8f80: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  ontent */.  int 
8f90: 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20  iCellFirst;     
8fa0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
8fb0: 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69  allowable cell i
8fc0: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ndex */.  int iC
8fd0: 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20  ellLast;        
8fe0: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73       /* Last pos
8ff0: 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  sible cell index
9000: 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28 20   */...  assert( 
9010: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
9020: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
9030: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
9040: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
9050: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9060: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
9070: 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45  leSize <= SQLITE
9080: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29  _MAX_PAGE_SIZE )
9090: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
90a0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
90b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
90c0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
90d0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
90e0: 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73  x) );.  temp = s
90f0: 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
9100: 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d  pace(pPage->pBt-
9110: 3e 70 50 61 67 65 72 29 3b 0a 20 20 64 61 74 61  >pPager);.  data
9120: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
9130: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
9140: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c  hdrOffset;.  cel
9150: 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
9160: 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e  >cellOffset;.  n
9170: 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
9180: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ell;.  assert( n
9190: 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26  Cell==get2byte(&
91a0: 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a  data[hdr+3]) );.
91b0: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
91c0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
91d0: 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20  eSize;.  cbrk = 
91e0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
91f0: 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79  dr+5]);.  memcpy
9200: 28 26 74 65 6d 70 5b 63 62 72 6b 5d 2c 20 26 64  (&temp[cbrk], &d
9210: 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c  ata[cbrk], usabl
9220: 65 53 69 7a 65 20 2d 20 63 62 72 6b 29 3b 0a 20  eSize - cbrk);. 
9230: 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69   cbrk = usableSi
9240: 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74  ze;.  iCellFirst
9250: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
9260: 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c  2*nCell;.  iCell
9270: 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a  Last = usableSiz
9280: 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30  e - 4;.  for(i=0
9290: 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
92a0: 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20  .    u8 *pAddr; 
92b0: 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20      /* The i-th 
92c0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
92d0: 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74      pAddr = &dat
92e0: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69  a[cellOffset + i
92f0: 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65  *2];.    pc = ge
9300: 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20  t2byte(pAddr);. 
9310: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
9320: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
9330: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
9340: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 23 69  =iCellLast );.#i
9350: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
9360: 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
9370: 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20  E_CELL_CHECK).  
9380: 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64 69    /* These condi
9390: 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65 61  tions have alrea
93a0: 64 79 20 62 65 65 6e 20 76 65 72 69 66 69 65 64  dy been verified
93b0: 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61 67   in btreeInitPag
93c0: 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 53 51  e().    ** if SQ
93d0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52  LITE_ENABLE_OVER
93e0: 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 20  SIZE_CELL_CHECK 
93f0: 69 73 20 64 65 66 69 6e 65 64 20 0a 20 20 20 20  is defined .    
9400: 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43  */.    if( pc<iC
9410: 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69  ellFirst || pc>i
9420: 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20  CellLast ){.    
9430: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9440: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
9450: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61    }.#endif.    a
9460: 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c  ssert( pc>=iCell
9470: 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69 43 65  First && pc<=iCe
9480: 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 73 69  llLast );.    si
9490: 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ze = cellSizePtr
94a0: 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70 63  (pPage, &temp[pc
94b0: 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20  ]);.    cbrk -= 
94c0: 73 69 7a 65 3b 0a 23 69 66 20 64 65 66 69 6e 65  size;.#if define
94d0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
94e0: 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
94f0: 45 43 4b 29 0a 20 20 20 20 69 66 28 20 63 62 72  ECK).    if( cbr
9500: 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a  k<iCellFirst ){.
9510: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9520: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
9530: 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
9540: 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c    if( cbrk<iCell
9550: 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65  First || pc+size
9560: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
9570: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
9580: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
9590: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
95a0: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73    assert( cbrk+s
95b0: 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize<=usableSize 
95c0: 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  && cbrk>=iCellFi
95d0: 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  rst );.    testc
95e0: 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d  ase( cbrk+size==
95f0: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
9600: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
9610: 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize==usableSize 
9620: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
9630: 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74 65 6d 70  ata[cbrk], &temp
9640: 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20  [pc], size);.   
9650: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
9660: 20 63 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73   cbrk);.  }.  as
9670: 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c  sert( cbrk>=iCel
9680: 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32  lFirst );.  put2
9690: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
96a0: 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61  ], cbrk);.  data
96b0: 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+1] = 0;.  d
96c0: 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a  ata[hdr+2] = 0;.
96d0: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
96e0: 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  0;.  memset(&dat
96f0: 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30  a[iCellFirst], 0
9700: 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73  , cbrk-iCellFirs
9710: 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t);.  assert( sq
9720: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
9730: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
9740: 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 63  Page) );.  if( c
9750: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d  brk-iCellFirst!=
9760: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a  pPage->nFree ){.
9770: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9780: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
9790: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
97a0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
97b0: 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20   Allocate nByte 
97c0: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
97d0: 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42  rom within the B
97e0: 2d 54 72 65 65 20 70 61 67 65 20 70 61 73 73 65  -Tree page passe
97f0: 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73  d.** as the firs
9800: 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72 69 74  t argument. Writ
9810: 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74 68 65  e into *pIdx the
9820: 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67   index into pPag
9830: 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66  e->aData[].** of
9840: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
9850: 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61  of allocated spa
9860: 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74 68 65  ce. Return eithe
9870: 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a  r SQLITE_OK or.*
9880: 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * an error code 
9890: 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f  (usually SQLITE_
98a0: 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20  CORRUPT)..**.** 
98b0: 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61  The caller guara
98c0: 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 72 65  ntees that there
98d0: 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 73   is sufficient s
98e0: 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65  pace to make the
98f0: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  .** allocation. 
9900: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   This routine mi
9910: 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65 66 72  ght need to defr
9920: 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 20  agment in order 
9930: 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20  to bring.** all 
9940: 74 68 65 20 73 70 61 63 65 20 74 6f 67 65 74 68  the space togeth
9950: 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20 54 68  er, however.  Th
9960: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
9970: 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74  avoid using.** t
9980: 68 65 20 66 69 72 73 74 20 74 77 6f 20 62 79 74  he first two byt
9990: 65 73 20 70 61 73 74 20 74 68 65 20 63 65 6c 6c  es past the cell
99a0: 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20 73 69   pointer area si
99b0: 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79 20 74  nce presumably t
99c0: 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  his.** allocatio
99d0: 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64 65 20  n is being made 
99e0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 73 65  in order to inse
99f0: 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73  rt a new cell, s
9a00: 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73  o we will.** als
9a10: 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69 6e 67  o end up needing
9a20: 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e   a new cell poin
9a30: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ter..*/.static i
9a40: 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65  nt allocateSpace
9a50: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
9a60: 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20   int nByte, int 
9a70: 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20  *pIdx){.  const 
9a80: 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d  int hdr = pPage-
9a90: 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f  >hdrOffset;    /
9aa0: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
9ab0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
9ac0: 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73  t */.  u8 * cons
9ad0: 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  t data = pPage->
9ae0: 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c  aData;      /* L
9af0: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50  ocal cache of pP
9b00: 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
9b10: 69 6e 74 20 6e 46 72 61 67 3b 20 20 20 20 20 20  int nFrag;      
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9b40: 66 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74  f fragmented byt
9b50: 65 73 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20  es on pPage */. 
9b60: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
9b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b80: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
9b90: 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74  yte of cell cont
9ba0: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
9bb0: 74 20 67 61 70 3b 20 20 20 20 20 20 20 20 2f 2a  t gap;        /*
9bc0: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 67   First byte of g
9bd0: 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 20  ap between cell 
9be0: 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63 65 6c  pointers and cel
9bf0: 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69  l content */.  i
9c00: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f  nt rc;         /
9c10: 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e  * Integer return
9c20: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 75   code */.  int u
9c30: 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73  sableSize; /* Us
9c40: 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 74 68 65  able size of the
9c50: 20 70 61 67 65 20 2a 2f 0a 20 20 0a 20 20 61 73   page */.  .  as
9c60: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
9c70: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
9c80: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
9c90: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9ca0: 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
9cb0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
9cc0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
9cd0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
9ce0: 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29  sert( nByte>=0 )
9cf0: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65  ;  /* Minimum ce
9d00: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
9d10: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9d20: 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b  >nFree>=nByte );
9d30: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9d40: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
9d50: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
9d60: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
9d70: 62 6c 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  bleSize;.  asser
9d80: 74 28 20 6e 42 79 74 65 20 3c 20 75 73 61 62 6c  t( nByte < usabl
9d90: 65 53 69 7a 65 2d 38 20 29 3b 0a 0a 20 20 6e 46  eSize-8 );..  nF
9da0: 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  rag = data[hdr+7
9db0: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
9dc0: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
9dd0: 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70  = hdr + 12 - 4*p
9de0: 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
9df0: 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  gap = pPage->cel
9e00: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
9e10: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 74 6f 70 20  e->nCell;.  top 
9e20: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
9e30: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
9e40: 0a 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29  .  if( gap>top )
9e50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9e60: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 74  ORRUPT_BKPT;.  t
9e70: 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 3d 3d  estcase( gap+2==
9e80: 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73  top );.  testcas
9e90: 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b  e( gap+1==top );
9ea0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
9eb0: 3d 3d 74 6f 70 20 29 3b 0a 0a 20 20 69 66 28 20  ==top );..  if( 
9ec0: 6e 46 72 61 67 3e 3d 36 30 20 29 7b 0a 20 20 20  nFrag>=60 ){.   
9ed0: 20 2f 2a 20 41 6c 77 61 79 73 20 64 65 66 72 61   /* Always defra
9ee0: 67 6d 65 6e 74 20 68 69 67 68 6c 79 20 66 72 61  gment highly fra
9ef0: 67 6d 65 6e 74 65 64 20 70 61 67 65 73 20 2a 2f  gmented pages */
9f00: 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67  .    rc = defrag
9f10: 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b  mentPage(pPage);
9f20: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
9f30: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70  turn rc;.    top
9f40: 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65   = get2byteNotZe
9f50: 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  ro(&data[hdr+5])
9f60: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67 61  ;.  }else if( ga
9f70: 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20  p+2<=top ){.    
9f80: 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 72  /* Search the fr
9f90: 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66  eelist looking f
9fa0: 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62  or a free slot b
9fb0: 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74  ig enough to sat
9fc0: 69 73 66 79 20 0a 20 20 20 20 2a 2a 20 74 68 65  isfy .    ** the
9fd0: 20 72 65 71 75 65 73 74 2e 20 54 68 65 20 61 6c   request. The al
9fe0: 6c 6f 63 61 74 69 6f 6e 20 69 73 20 6d 61 64 65  location is made
9ff0: 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20   from the first 
a000: 66 72 65 65 20 73 6c 6f 74 20 69 6e 20 0a 20 20  free slot in .  
a010: 20 20 2a 2a 20 74 68 65 20 6c 69 73 74 20 74 68    ** the list th
a020: 61 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  at is large enou
a030: 67 68 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74  gh to accommodat
a040: 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  e it..    */.   
a050: 20 69 6e 74 20 70 63 2c 20 61 64 64 72 3b 0a 20   int pc, addr;. 
a060: 20 20 20 66 6f 72 28 61 64 64 72 3d 68 64 72 2b     for(addr=hdr+
a070: 31 3b 20 28 70 63 20 3d 20 67 65 74 32 62 79 74  1; (pc = get2byt
a080: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e  e(&data[addr]))>
a090: 30 3b 20 61 64 64 72 3d 70 63 29 7b 0a 20 20 20  0; addr=pc){.   
a0a0: 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20     int size;    
a0b0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
a0c0: 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c 6f 74  of the free slot
a0d0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 63   */.      if( pc
a0e0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c  >usableSize-4 ||
a0f0: 20 70 63 3c 61 64 64 72 2b 34 20 29 7b 0a 20 20   pc<addr+4 ){.  
a100: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
a110: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
a120: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a130: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
a140: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
a150: 20 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42      if( size>=nB
a160: 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  yte ){.        i
a170: 6e 74 20 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42  nt x = size - nB
a180: 79 74 65 3b 0a 20 20 20 20 20 20 20 20 74 65 73  yte;.        tes
a190: 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20  tcase( x==4 );. 
a1a0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
a1b0: 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 20   x==3 );.       
a1c0: 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20   if( x<4 ){.    
a1d0: 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
a1e0: 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68  the slot from th
a1f0: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64  e free-list. Upd
a200: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
a210: 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  f.          ** f
a220: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20  ragmented bytes 
a230: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
a240: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65   */.          me
a250: 6d 63 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d  mcpy(&data[addr]
a260: 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b  , &data[pc], 2);
a270: 0a 20 20 20 20 20 20 20 20 20 20 64 61 74 61 5b  .          data[
a280: 68 64 72 2b 37 5d 20 3d 20 28 75 38 29 28 6e 46  hdr+7] = (u8)(nF
a290: 72 61 67 20 2b 20 78 29 3b 0a 20 20 20 20 20 20  rag + x);.      
a2a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 69 7a 65    }else if( size
a2b0: 2b 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65  +pc > usableSize
a2c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
a2d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
a2e0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
a2f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a300: 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72     /* The slot r
a310: 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72  emains on the fr
a320: 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20  ee-list. Reduce 
a330: 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f  its size to acco
a340: 75 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  unt.          **
a350: 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e   for the portion
a360: 20 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77   used by the new
a370: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a   allocation. */.
a380: 20 20 20 20 20 20 20 20 20 20 70 75 74 32 62 79            put2by
a390: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20  te(&data[pc+2], 
a3a0: 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  x);.        }.  
a3b0: 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 70 63        *pIdx = pc
a3c0: 20 2b 20 78 3b 0a 20 20 20 20 20 20 20 20 72 65   + x;.        re
a3d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a3e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a3f0: 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  }..  /* Check to
a400: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   make sure there
a410: 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65   is enough space
a420: 20 69 6e 20 74 68 65 20 67 61 70 20 74 6f 20 73   in the gap to s
a430: 61 74 69 73 66 79 0a 20 20 2a 2a 20 74 68 65 20  atisfy.  ** the 
a440: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 49 66 20  allocation.  If 
a450: 6e 6f 74 2c 20 64 65 66 72 61 67 6d 65 6e 74 2e  not, defragment.
a460: 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
a470: 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74  ( gap+2+nByte==t
a480: 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b  op );.  if( gap+
a490: 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20  2+nByte>top ){. 
a4a0: 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65     rc = defragme
a4b0: 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  ntPage(pPage);. 
a4c0: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
a4d0: 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d  rn rc;.    top =
a4e0: 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f   get2byteNotZero
a4f0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
a500: 20 20 20 20 61 73 73 65 72 74 28 20 67 61 70 2b      assert( gap+
a510: 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20  nByte<=top );.  
a520: 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  }...  /* Allocat
a530: 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68  e memory from th
a540: 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e  e gap in between
a550: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
a560: 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64  r array.  ** and
a570: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
a580: 74 20 61 72 65 61 2e 20 20 54 68 65 20 62 74 72  t area.  The btr
a590: 65 65 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c  eeInitPage() cal
a5a0: 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20  l has already.  
a5b0: 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68 65  ** validated the
a5c0: 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65   freelist.  Give
a5d0: 6e 20 74 68 61 74 20 74 68 65 20 66 72 65 65 6c  n that the freel
a5e0: 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68  ist is valid, th
a5f0: 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77  ere.  ** is no w
a600: 61 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f  ay that the allo
a610: 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e  cation can exten
a620: 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  d off the end of
a630: 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20   the page..  ** 
a640: 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65 6c  The assert() bel
a650: 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 65 20  ow verifies the 
a660: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
a670: 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d  e..  */.  top -=
a680: 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79   nByte;.  put2by
a690: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
a6a0: 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28   top);.  assert(
a6b0: 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69   top+nByte <= (i
a6c0: 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  nt)pPage->pBt->u
a6d0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a  sableSize );.  *
a6e0: 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65  pIdx = top;.  re
a6f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a700: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
a710: 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  a section of the
a720: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f   pPage->aData to
a730: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
a740: 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
a750: 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65   of the new free
a760: 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d   block is pPage-
a770: 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a  >aDisk[start].**
a780: 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
a790: 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 22 73   the block is "s
a7a0: 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  ize" bytes..**.*
a7b0: 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 65 66  * Most of the ef
a7c0: 66 6f 72 74 20 68 65 72 65 20 69 73 20 69 6e 76  fort here is inv
a7d0: 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65 73 69  olved in coalesi
a7e0: 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66  ng adjacent.** f
a7f0: 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20  ree blocks into 
a800: 61 20 73 69 6e 67 6c 65 20 62 69 67 20 66 72 65  a single big fre
a810: 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  e block..*/.stat
a820: 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65  ic int freeSpace
a830: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
a840: 20 69 6e 74 20 73 74 61 72 74 2c 20 69 6e 74 20   int start, int 
a850: 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64 64  size){.  int add
a860: 72 2c 20 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a  r, pbegin, hdr;.
a870: 20 20 69 6e 74 20 69 4c 61 73 74 3b 20 20 20 20    int iLast;    
a880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a890: 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 70      /* Largest p
a8a0: 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c 6f 63  ossible freebloc
a8b0: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 6e  k offset */.  un
a8c0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
a8d0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
a8e0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
a8f0: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
a900: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
a910: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
a920: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
a930: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61  );.  assert( sta
a940: 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt>=pPage->hdrOf
a950: 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68  fset+6+pPage->ch
a960: 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a 20 20  ildPtrSize );.  
a970: 61 73 73 65 72 74 28 20 28 73 74 61 72 74 20 2b  assert( (start +
a980: 20 73 69 7a 65 29 20 3c 3d 20 28 69 6e 74 29 70   size) <= (int)p
a990: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
a9a0: 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  eSize );.  asser
a9b0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
a9c0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
a9d0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
a9e0: 73 65 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b  sert( size>=0 );
a9f0: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65     /* Minimum ce
aa00: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
aa10: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42  .  if( pPage->pB
aa20: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
aa30: 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
aa40: 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72  ){.    /* Overwr
aa50: 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
aa60: 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
aa70: 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 75  os when the secu
aa80: 72 65 5f 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a  re_delete.    **
aa90: 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
aaa0: 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  ed */.    memset
aab0: 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30  (&data[start], 0
aac0: 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  , size);.  }..  
aad0: 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61 63 65  /* Add the space
aae0: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c   back into the l
aaf0: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72  inked list of fr
ab00: 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74 65 20  eeblocks.  Note 
ab10: 74 68 61 74 0a 20 20 2a 2a 20 65 76 65 6e 20 74  that.  ** even t
ab20: 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c  hough the freebl
ab30: 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65  ock list was che
ab40: 63 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e 69  cked by btreeIni
ab50: 74 50 61 67 65 28 29 2c 0a 20 20 2a 2a 20 62 74  tPage(),.  ** bt
ab60: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 64 69  reeInitPage() di
ab70: 64 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65  d not detect ove
ab80: 72 6c 61 70 70 69 6e 67 20 63 65 6c 6c 73 20 6f  rlapping cells o
ab90: 72 0a 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b  r.  ** freeblock
aba0: 73 20 74 68 61 74 20 6f 76 65 72 6c 61 70 70 65  s that overlappe
abb0: 64 20 63 65 6c 6c 73 2e 20 20 20 4e 6f 72 20 64  d cells.   Nor d
abc0: 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 77 68  oes it detect wh
abd0: 65 6e 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  en the.  ** cell
abe0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 65 78   content area ex
abf0: 63 65 65 64 73 20 74 68 65 20 76 61 6c 75 65 20  ceeds the value 
ac00: 69 6e 20 74 68 65 20 70 61 67 65 20 68 65 61 64  in the page head
ac10: 65 72 2e 20 20 49 66 20 74 68 65 73 65 0a 20 20  er.  If these.  
ac20: 2a 2a 20 73 69 74 75 61 74 69 6f 6e 73 20 61 72  ** situations ar
ac30: 69 73 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71  ise, then subseq
ac40: 75 65 6e 74 20 69 6e 73 65 72 74 20 6f 70 65 72  uent insert oper
ac50: 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 63 6f 72  ations might cor
ac60: 72 75 70 74 0a 20 20 2a 2a 20 74 68 65 20 66 72  rupt.  ** the fr
ac70: 65 65 6c 69 73 74 2e 20 20 53 6f 20 77 65 20 64  eelist.  So we d
ac80: 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20  o need to check 
ac90: 66 6f 72 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  for corruption w
aca0: 68 69 6c 65 20 73 63 61 6e 6e 69 6e 67 0a 20 20  hile scanning.  
acb0: 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  ** the freelist.
acc0: 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50  .  */.  hdr = pP
acd0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
ace0: 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31    addr = hdr + 1
acf0: 3b 0a 20 20 69 4c 61 73 74 20 3d 20 70 50 61 67  ;.  iLast = pPag
ad00: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
ad10: 7a 65 20 2d 20 34 3b 0a 20 20 61 73 73 65 72 74  ze - 4;.  assert
ad20: 28 20 73 74 61 72 74 3c 3d 69 4c 61 73 74 20 29  ( start<=iLast )
ad30: 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67  ;.  while( (pbeg
ad40: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
ad50: 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72  ata[addr]))<star
ad60: 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b  t && pbegin>0 ){
ad70: 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 3c  .    if( pbegin<
ad80: 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20  addr+4 ){.      
ad90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
ada0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
adb0: 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62 65  }.    addr = pbe
adc0: 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  gin;.  }.  if( p
add0: 62 65 67 69 6e 3e 69 4c 61 73 74 20 29 7b 0a 20  begin>iLast ){. 
ade0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
adf0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
ae00: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62 65   }.  assert( pbe
ae10: 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67  gin>addr || pbeg
ae20: 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62  in==0 );.  put2b
ae30: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  yte(&data[addr],
ae40: 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62   start);.  put2b
ae50: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d  yte(&data[start]
ae60: 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74  , pbegin);.  put
ae70: 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72  2byte(&data[star
ae80: 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70  t+2], size);.  p
ae90: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50  Page->nFree = pP
aea0: 61 67 65 2d 3e 6e 46 72 65 65 20 2b 20 28 75 31  age->nFree + (u1
aeb0: 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f  6)size;..  /* Co
aec0: 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20  alesce adjacent 
aed0: 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20  free blocks */. 
aee0: 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b   addr = hdr + 1;
aef0: 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69  .  while( (pbegi
af00: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
af10: 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a  ta[addr]))>0 ){.
af20: 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70      int pnext, p
af30: 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73 73  size, x;.    ass
af40: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
af50: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
af60: 70 62 65 67 69 6e 20 3c 3d 20 28 69 6e 74 29 70  pbegin <= (int)p
af70: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
af80: 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70  eSize-4 );.    p
af90: 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28  next = get2byte(
afa0: 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a  &data[pbegin]);.
afb0: 20 20 20 20 70 73 69 7a 65 20 3d 20 67 65 74 32      psize = get2
afc0: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
afd0: 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70  n+2]);.    if( p
afe0: 62 65 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20  begin + psize + 
aff0: 33 20 3e 3d 20 70 6e 65 78 74 20 26 26 20 70 6e  3 >= pnext && pn
b000: 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  ext>0 ){.      i
b010: 6e 74 20 66 72 61 67 20 3d 20 70 6e 65 78 74 20  nt frag = pnext 
b020: 2d 20 28 70 62 65 67 69 6e 2b 70 73 69 7a 65 29  - (pbegin+psize)
b030: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 66 72 61  ;.      if( (fra
b040: 67 3c 30 29 20 7c 7c 20 28 66 72 61 67 3e 28 69  g<0) || (frag>(i
b050: 6e 74 29 64 61 74 61 5b 68 64 72 2b 37 5d 29 20  nt)data[hdr+7]) 
b060: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
b070: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
b080: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
b090: 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d       data[hdr+7]
b0a0: 20 2d 3d 20 28 75 38 29 66 72 61 67 3b 0a 20 20   -= (u8)frag;.  
b0b0: 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74 65      x = get2byte
b0c0: 28 26 64 61 74 61 5b 70 6e 65 78 74 5d 29 3b 0a  (&data[pnext]);.
b0d0: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
b0e0: 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 78 29  data[pbegin], x)
b0f0: 3b 0a 20 20 20 20 20 20 78 20 3d 20 70 6e 65 78  ;.      x = pnex
b100: 74 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61  t + get2byte(&da
b110: 74 61 5b 70 6e 65 78 74 2b 32 5d 29 20 2d 20 70  ta[pnext+2]) - p
b120: 62 65 67 69 6e 3b 0a 20 20 20 20 20 20 70 75 74  begin;.      put
b130: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
b140: 69 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 7d  in+2], x);.    }
b150: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72  else{.      addr
b160: 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 7d   = pbegin;.    }
b170: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
b180: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
b190: 72 65 61 20 62 65 67 69 6e 73 20 77 69 74 68 20  rea begins with 
b1a0: 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65 6d  a freeblock, rem
b1b0: 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  ove it. */.  if(
b1c0: 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64 61   data[hdr+1]==da
b1d0: 74 61 5b 68 64 72 2b 35 5d 20 26 26 20 64 61 74  ta[hdr+5] && dat
b1e0: 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b 68  a[hdr+2]==data[h
b1f0: 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e 74  dr+6] ){.    int
b200: 20 74 6f 70 3b 0a 20 20 20 20 70 62 65 67 69 6e   top;.    pbegin
b210: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
b220: 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6d  a[hdr+1]);.    m
b230: 65 6d 63 70 79 28 26 64 61 74 61 5b 68 64 72 2b  emcpy(&data[hdr+
b240: 31 5d 2c 20 26 64 61 74 61 5b 70 62 65 67 69 6e  1], &data[pbegin
b250: 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70 20 3d  ], 2);.    top =
b260: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b270: 68 64 72 2b 35 5d 29 20 2b 20 67 65 74 32 62 79  hdr+5]) + get2by
b280: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b  te(&data[pbegin+
b290: 32 5d 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  2]);.    put2byt
b2a0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
b2b0: 74 6f 70 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  top);.  }.  asse
b2c0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
b2d0: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
b2e0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
b2f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b300: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f  K;.}../*.** Deco
b310: 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  de the flags byt
b320: 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74  e (the first byt
b330: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29  e of the header)
b340: 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61   for a page.** a
b350: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69  nd initialize fi
b360: 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  elds of the MemP
b370: 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63  age structure ac
b380: 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a  cordingly..**.**
b390: 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77   Only the follow
b3a0: 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ing combinations
b3b0: 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20   are supported. 
b3c0: 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72   Anything differ
b3d0: 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73  ent.** indicates
b3e0: 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
b3f0: 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a  ase files:.**.**
b400: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
b410: 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20  ODATA.**        
b420: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20   PTF_ZERODATA | 
b430: 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20  PTF_LEAF.**     
b440: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
b450: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a   | PTF_INTKEY.**
b460: 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41           PTF_LEA
b470: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
b480: 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f  EY | PTF_LEAF.*/
b490: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f  .static int deco
b4a0: 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20  deFlags(MemPage 
b4b0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
b4c0: 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Byte){.  BtShare
b4d0: 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41  d *pBt;     /* A
b4e0: 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e   copy of pPage->
b4f0: 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  pBt */..  assert
b500: 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  ( pPage->hdrOffs
b510: 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f  et==(pPage->pgno
b520: 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29  ==1 ? 100 : 0) )
b530: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
b540: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
b550: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
b560: 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65  ) );.  pPage->le
b570: 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79  af = (u8)(flagBy
b580: 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28  te>>3);  assert(
b590: 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c   PTF_LEAF == 1<<
b5a0: 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20  3 );.  flagByte 
b5b0: 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20  &= ~PTF_LEAF;.  
b5c0: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
b5d0: 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d  ize = 4-4*pPage-
b5e0: 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d 20 70  >leaf;.  pBt = p
b5f0: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28  Page->pBt;.  if(
b600: 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f   flagByte==(PTF_
b610: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
b620: 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 70 50  NTKEY) ){.    pP
b630: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b  age->intKey = 1;
b640: 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44  .    pPage->hasD
b650: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61  ata = pPage->lea
b660: 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  f;.    pPage->ma
b670: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
b680: 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  xLeaf;.    pPage
b690: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
b6a0: 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c  ->minLeaf;.  }el
b6b0: 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  se if( flagByte=
b6c0: 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b  =PTF_ZERODATA ){
b6d0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
b6e0: 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ey = 0;.    pPag
b6f0: 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 30 3b 0a  e->hasData = 0;.
b700: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f      pPage->maxLo
b710: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f  cal = pBt->maxLo
b720: 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  cal;.    pPage->
b730: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  minLocal = pBt->
b740: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73  minLocal;.  }els
b750: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
b760: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
b770: 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  T;.  }.  pPage->
b780: 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
b790: 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50  = pBt->max1byteP
b7a0: 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e  ayload;.  return
b7b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
b7c0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
b7d0: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e  the auxiliary in
b7e0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
b7f0: 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  disk block..**.*
b800: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
b810: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  OK on success.  
b820: 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74  If we see that t
b830: 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20  he page does.** 
b840: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65  not contain a we
b850: 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61  ll-formed databa
b860: 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65  se page, then re
b870: 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
b880: 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74  CORRUPT.  Note t
b890: 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20  hat a return of 
b8a0: 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e  SQLITE_OK does n
b8b0: 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20  ot.** guarantee 
b8c0: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
b8d0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49   well-formed.  I
b8e0: 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61  t only shows tha
b8f0: 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74  t.** we failed t
b900: 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72  o detect any cor
b910: 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
b920: 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74  ic int btreeInit
b930: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
b940: 61 67 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28  age){..  assert(
b950: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
b960: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
b970: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
b980: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
b990: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
b9a0: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69  Page->pgno==sqli
b9b0: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
b9c0: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
b9d0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
b9e0: 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33  pPage == sqlite3
b9f0: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
ba00: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
ba10: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
ba20: 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74  ->aData == sqlit
ba30: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
ba40: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
ba50: 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  ;..  if( !pPage-
ba60: 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75  >isInit ){.    u
ba70: 31 36 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  16 pc;          
ba80: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
ba90: 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68  a freeblock with
baa0: 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  in pPage->aData[
bab0: 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b  ] */.    u8 hdr;
bac0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
bad0: 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69  ffset to beginni
bae0: 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65  ng of page heade
baf0: 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74  r */.    u8 *dat
bb00: 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  a;          /* E
bb10: 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61  qual to pPage->a
bb20: 44 61 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68  Data */.    BtSh
bb30: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
bb40: 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74    /* The main bt
bb50: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
bb60: 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53  .    int usableS
bb70: 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e  ize;    /* Amoun
bb80: 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63  t of usable spac
bb90: 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
bba0: 2f 0a 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66  /.    u16 cellOf
bbb0: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73  fset;    /* Offs
bbc0: 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66  et from start of
bbd0: 20 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63   page to first c
bbe0: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
bbf0: 20 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20     int nFree;   
bc00: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
bc10: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
bc20: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
bc30: 20 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20     int top;     
bc40: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
bc50: 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  yte of the cell 
bc60: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
bc70: 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72      int iCellFir
bc80: 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20  st;    /* First 
bc90: 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f  allowable cell o
bca0: 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73  r freeblock offs
bcb0: 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  et */.    int iC
bcc0: 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20  ellLast;     /* 
bcd0: 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65  Last possible ce
bce0: 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20  ll or freeblock 
bcf0: 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70  offset */..    p
bd00: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
bd10: 0a 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61 67  ..    hdr = pPag
bd20: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
bd30: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
bd40: 61 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 64  aData;.    if( d
bd50: 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
bd60: 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72  , data[hdr]) ) r
bd70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
bd80: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61  RUPT_BKPT;.    a
bd90: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65  ssert( pBt->page
bda0: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74  Size>=512 && pBt
bdb0: 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33  ->pageSize<=6553
bdc0: 36 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  6 );.    pPage->
bdd0: 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29  maskPage = (u16)
bde0: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
bdf0: 20 31 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e   1);.    pPage->
be00: 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
be10: 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20     usableSize = 
be20: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
be30: 0a 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c  .    pPage->cell
be40: 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66  Offset = cellOff
be50: 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d  set = hdr + 12 -
be60: 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a   4*pPage->leaf;.
be70: 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61      pPage->aData
be80: 45 6e 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62  End = &data[usab
be90: 6c 65 53 69 7a 65 5d 3b 0a 20 20 20 20 70 50 61  leSize];.    pPa
bea0: 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26  ge->aCellIdx = &
beb0: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d  data[cellOffset]
bec0: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
bed0: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
bee0: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70  a[hdr+5]);.    p
bef0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65  Page->nCell = ge
bf00: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
bf10: 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50  +3]);.    if( pP
bf20: 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45  age->nCell>MX_CE
bf30: 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  LL(pBt) ){.     
bf40: 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c   /* To many cell
bf50: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70  s for a single p
bf60: 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d  age.  The page m
bf70: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a  ust be corrupt *
bf80: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
bf90: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
bfa0: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65  PT;.    }.    te
bfb0: 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e  stcase( pPage->n
bfc0: 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42  Cell==MX_CELL(pB
bfd0: 74 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20  t) );..    /* A 
bfe0: 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61  malformed databa
bff0: 73 65 20 70 61 67 65 20 6d 69 67 68 74 20 63 61  se page might ca
c000: 75 73 65 20 75 73 20 74 6f 20 72 65 61 64 20 70  use us to read p
c010: 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20  ast the end.    
c020: 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20  ** of page when 
c030: 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20  parsing a cell. 
c040: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
c050: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
c060: 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63  ock of code chec
c070: 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20  ks early to see 
c080: 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64  if a cell extend
c090: 73 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  s.    ** past th
c0a0: 65 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20  e end of a page 
c0b0: 62 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75  boundary and cau
c0c0: 73 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  ses SQLITE_CORRU
c0d0: 50 54 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a  PT to be .    **
c0e0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 20   returned if it 
c0f0: 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  does..    */.   
c100: 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65   iCellFirst = ce
c110: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
c120: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69  ge->nCell;.    i
c130: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
c140: 65 53 69 7a 65 20 2d 20 34 3b 0a 23 69 66 20 64  eSize - 4;.#if d
c150: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
c160: 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45  ABLE_OVERSIZE_CE
c170: 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 7b 0a  LL_CHECK).    {.
c180: 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
c190: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
c1a0: 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70   into the cell p
c1b0: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a  ointer array */.
c1c0: 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 20 20 20        int sz;   
c1d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
c1e0: 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20  of a cell */..  
c1f0: 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
c200: 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74  leaf ) iCellLast
c210: 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  --;.      for(i=
c220: 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; i<pPage->nCel
c230: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
c240: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
c250: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b  data[cellOffset+
c260: 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  i*2]);.        t
c270: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
c280: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20  llFirst );.     
c290: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
c2a0: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
c2b0: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65        if( pc<iCe
c2c0: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43  llFirst || pc>iC
c2d0: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
c2e0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c2f0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
c300: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c310: 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65     sz = cellSize
c320: 50 74 72 28 70 50 61 67 65 2c 20 26 64 61 74 61  Ptr(pPage, &data
c330: 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  [pc]);.        t
c340: 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d  estcase( pc+sz==
c350: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
c360: 20 20 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e        if( pc+sz>
c370: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
c380: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
c390: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c3a0: 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  PT;.        }.  
c3b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
c3c0: 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69  !pPage->leaf ) i
c3d0: 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20  CellLast++;.    
c3e0: 7d 20 20 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  }  .#endif..    
c3f0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  /* Compute the t
c400: 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20  otal free space 
c410: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
c420: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
c430: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
c440: 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61      nFree = data
c450: 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 0a 20  [hdr+7] + top;. 
c460: 20 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29     while( pc>0 )
c470: 7b 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78 74  {.      u16 next
c480: 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  , size;.      if
c490: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
c4a0: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
c4b0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 74  ){.        /* St
c4c0: 61 72 74 20 6f 66 20 66 72 65 65 20 62 6c 6f 63  art of free bloc
c4d0: 6b 20 69 73 20 6f 66 66 20 74 68 65 20 70 61 67  k is off the pag
c4e0: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74  e */.        ret
c4f0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c500: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20  PT_BKPT; .      
c510: 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67  }.      next = g
c520: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
c530: 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d  ]);.      size =
c540: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c550: 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  pc+2]);.      if
c560: 28 20 28 6e 65 78 74 3e 30 20 26 26 20 6e 65 78  ( (next>0 && nex
c570: 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 29 20 7c 7c  t<=pc+size+3) ||
c580: 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53   pc+size>usableS
c590: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ize ){.        /
c5a0: 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75  * Free blocks mu
c5b0: 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69  st be in ascendi
c5c0: 6e 67 20 6f 72 64 65 72 2e 20 41 6e 64 20 74 68  ng order. And th
c5d0: 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 20  e last byte of. 
c5e0: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72         ** the fr
c5f0: 65 65 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69  ee-block must li
c600: 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  e on the databas
c610: 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20  e page.  */.    
c620: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c630: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
c640: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
c650: 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73  Free = nFree + s
c660: 69 7a 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20  ize;.      pc = 
c670: 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  next;.    }..   
c680: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
c690: 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e  t, nFree contain
c6a0: 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
c6b0: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
c6c0: 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74  tart.    ** of t
c6d0: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
c6e0: 61 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75  area plus the nu
c6f0: 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74  mber of free byt
c700: 65 73 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a  es within.    **
c710: 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
c720: 74 20 61 72 65 61 2e 20 49 66 20 74 68 69 73 20  t area. If this 
c730: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
c740: 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a  the usable-size.
c750: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61      ** of the pa
c760: 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ge, then the pag
c770: 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
c780: 74 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20  ted. This check 
c790: 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76  also.    ** serv
c7a0: 65 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  es to verify tha
c7b0: 74 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  t the offset to 
c7c0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
c7d0: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20   cell-content.  
c7e0: 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72    ** area, accor
c7f0: 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65  ding to the page
c800: 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69   header, lies wi
c810: 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20  thin the page.. 
c820: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46     */.    if( nF
c830: 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ree>usableSize )
c840: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
c850: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c860: 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70  PT; .    }.    p
c870: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75  Page->nFree = (u
c880: 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c  16)(nFree - iCel
c890: 6c 46 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61  lFirst);.    pPa
c8a0: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
c8b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
c8c0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
c8d0: 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61   Set up a raw pa
c8e0: 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f  ge so that it lo
c8f0: 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62  oks like a datab
c900: 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67  ase page holding
c910: 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a  .** no entries..
c920: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a  */.static void z
c930: 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20  eroPage(MemPage 
c940: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
c950: 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
c960: 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
c970: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68  e->aData;.  BtSh
c980: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
c990: 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72  e->pBt;.  u8 hdr
c9a0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
c9b0: 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74  set;.  u16 first
c9c0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
c9d0: 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
c9e0: 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ber(pPage->pDbPa
c9f0: 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ge)==pPage->pgno
ca00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
ca10: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
ca20: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
ca30: 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
ca40: 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
ca50: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
ca60: 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
ca70: 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20  ge) == data );. 
ca80: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ca90: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
caa0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
cab0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
cac0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
cad0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
cae0: 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
caf0: 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
cb00: 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d  _DELETE ){.    m
cb10: 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d  emset(&data[hdr]
cb20: 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  , 0, pBt->usable
cb30: 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d  Size - hdr);.  }
cb40: 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28  .  data[hdr] = (
cb50: 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69  char)flags;.  fi
cb60: 72 73 74 20 3d 20 68 64 72 20 2b 20 28 28 66 6c  rst = hdr + ((fl
cb70: 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30  ags&PTF_LEAF)==0
cb80: 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65   ? 12 : 8);.  me
cb90: 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31  mset(&data[hdr+1
cba0: 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61  ], 0, 4);.  data
cbb0: 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70  [hdr+7] = 0;.  p
cbc0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
cbd0: 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c  r+5], pBt->usabl
cbe0: 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d  eSize);.  pPage-
cbf0: 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 70  >nFree = (u16)(p
cc00: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
cc10: 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64   first);.  decod
cc20: 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c  eFlags(pPage, fl
cc30: 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63  ags);.  pPage->c
cc40: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73  ellOffset = firs
cc50: 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  t;.  pPage->aDat
cc60: 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74  aEnd = &data[pBt
cc70: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20  ->usableSize];. 
cc80: 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
cc90: 20 3d 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b   = &data[first];
cca0: 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  .  pPage->nOverf
ccb0: 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  low = 0;.  asser
ccc0: 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  t( pBt->pageSize
ccd0: 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61  >=512 && pBt->pa
cce0: 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b  geSize<=65536 );
ccf0: 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  .  pPage->maskPa
cd00: 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e  ge = (u16)(pBt->
cd10: 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20  pageSize - 1);. 
cd20: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
cd30: 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  0;.  pPage->isIn
cd40: 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  it = 1;.}.../*.*
cd50: 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61  * Convert a DbPa
cd60: 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ge obtained from
cd70: 20 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20   the pager into 
cd80: 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62  a MemPage used b
cd90: 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c  y.** the btree l
cda0: 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ayer..*/.static 
cdb0: 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61  MemPage *btreePa
cdc0: 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50  geFromDbPage(DbP
cdd0: 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67  age *pDbPage, Pg
cde0: 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65  no pgno, BtShare
cdf0: 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61  d *pBt){.  MemPa
ce00: 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d  ge *pPage = (Mem
ce10: 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67  Page*)sqlite3Pag
ce20: 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61  erGetExtra(pDbPa
ce30: 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44  ge);.  pPage->aD
ce40: 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ata = sqlite3Pag
ce50: 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
ce60: 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62  e);.  pPage->pDb
ce70: 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a  Page = pDbPage;.
ce80: 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70    pPage->pBt = p
ce90: 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e  Bt;.  pPage->pgn
cea0: 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67  o = pgno;.  pPag
ceb0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70  e->hdrOffset = p
cec0: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20  Page->pgno==1 ? 
ced0: 31 30 30 20 3a 20 30 3b 0a 20 20 72 65 74 75 72  100 : 0;.  retur
cee0: 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a  n pPage; .}../*.
cef0: 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
cf00: 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20 49  om the pager.  I
cf10: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
cf20: 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
cf30: 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
cf40: 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
cf50: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
cf60: 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69  noContent flag i
cf70: 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20  s set, it means 
cf80: 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63  that we do not c
cf90: 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  are about.** the
cfa0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
cfb0: 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d  page at this tim
cfc0: 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f  e.  So do not go
cfd0: 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20   to the disk.** 
cfe0: 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e  to fetch the con
cff0: 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c  tent.  Just fill
d000: 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   in the content 
d010: 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e  with zeros for n
d020: 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65  ow..** If in the
d030: 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20   future we call 
d040: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
d050: 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65  e() on this page
d060: 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20  , that.** means 
d070: 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64 20  we have started 
d080: 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20  to be concerned 
d090: 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e  about content an
d0a0: 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65  d the disk.** re
d0b0: 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20  ad should occur 
d0c0: 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a  at that point..*
d0d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
d0e0: 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74 53  eeGetPage(.  BtS
d0f0: 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
d100: 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
d110: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
d120: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
d130: 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
d140: 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d  o fetch */.  Mem
d150: 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
d160: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
d170: 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72  page in this par
d180: 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ameter */.  int 
d190: 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
d1a0: 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f   /* PAGER_GET_NO
d1b0: 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52  CONTENT or PAGER
d1c0: 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f  _GET_READONLY */
d1d0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
d1e0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
d1f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ..  assert( flag
d200: 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50  s==0 || flags==P
d210: 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
d220: 4e 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47  NT || flags==PAG
d230: 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
d240: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
d250: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
d260: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
d270: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
d280: 65 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70  erAcquire(pBt->p
d290: 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62  Pager, pgno, (Db
d2a0: 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c  Page**)&pDbPage,
d2b0: 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72   flags);.  if( r
d2c0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
d2d0: 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65 65   *ppPage = btree
d2e0: 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70  PageFromDbPage(p
d2f0: 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42  DbPage, pgno, pB
d300: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  t);.  return SQL
d310: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
d320: 20 52 65 74 72 69 65 76 65 20 61 20 70 61 67 65   Retrieve a page
d330: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
d340: 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 72 65  cache. If the re
d350: 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
d360: 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  not.** already i
d370: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
d380: 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49  e return NULL. I
d390: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
d3a0: 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
d3b0: 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
d3c0: 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
d3d0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  d..*/.static Mem
d3e0: 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c  Page *btreePageL
d3f0: 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a  ookup(BtShared *
d400: 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
d410: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
d420: 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
d430: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d440: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
d450: 20 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69    pDbPage = sqli
d460: 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
d470: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
d480: 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65  );.  if( pDbPage
d490: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62   ){.    return b
d4a0: 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
d4b0: 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
d4c0: 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65  , pBt);.  }.  re
d4d0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
d4e0: 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
d4f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
d500: 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20   file in pages. 
d510: 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20  If there is any 
d520: 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72  kind of.** error
d530: 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67  , return ((unsig
d540: 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a  ned int)-1)..*/.
d550: 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65  static Pgno btre
d560: 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61  ePagecount(BtSha
d570: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74  red *pBt){.  ret
d580: 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  urn pBt->nPage;.
d590: 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74 72  }.u32 sqlite3Btr
d5a0: 65 65 4c 61 73 74 50 61 67 65 28 42 74 72 65 65  eeLastPage(Btree
d5b0: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
d5c0: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
d5d0: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
d5e0: 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d  ssert( ((p->pBt-
d5f0: 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30 30 30  >nPage)&0x800000
d600: 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  0)==0 );.  retur
d610: 6e 20 28 69 6e 74 29 62 74 72 65 65 50 61 67 65  n (int)btreePage
d620: 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d  count(p->pBt);.}
d630: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
d640: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
d650: 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  r and initialize
d660: 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69   it.  This routi
d670: 6e 65 20 69 73 20 6a 75 73 74 20 61 0a 2a 2a 20  ne is just a.** 
d680: 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70  convenience wrap
d690: 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72  per around separ
d6a0: 61 74 65 20 63 61 6c 6c 73 20 74 6f 20 62 74 72  ate calls to btr
d6b0: 65 65 47 65 74 50 61 67 65 28 29 20 61 6e 64 20  eeGetPage() and 
d6c0: 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67  .** btreeInitPag
d6d0: 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  e()..**.** If an
d6e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
d6f0: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 2a 70  hen the value *p
d700: 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
d710: 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74  is undefined. It
d720: 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75  .** may remain u
d730: 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20  nchanged, or it 
d740: 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e  may be set to an
d750: 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a   invalid value..
d760: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
d770: 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20  tAndInitPage(.  
d780: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
d790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7a0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
d7b0: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
d7c0: 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
d7d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
d7e0: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
d7f0: 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50  to get */.  MemP
d800: 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
d810: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
d820: 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f  rite the page po
d830: 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  inter here */.  
d840: 69 6e 74 20 62 52 65 61 64 6f 6e 6c 79 20 20 20  int bReadonly   
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d860: 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41  /* PAGER_GET_REA
d870: 44 4f 4e 4c 59 20 6f 72 20 30 20 2a 2f 0a 29 7b  DONLY or 0 */.){
d880: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
d890: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
d8a0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
d8b0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
d8c0: 20 62 52 65 61 64 6f 6e 6c 79 3d 3d 50 41 47 45   bReadonly==PAGE
d8d0: 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 7c  R_GET_READONLY |
d8e0: 7c 20 62 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 29  | bReadonly==0 )
d8f0: 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74  ;..  if( pgno>bt
d900: 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
d910: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  ) ){.    rc = SQ
d920: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
d930: 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
d940: 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
d950: 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50  e(pBt, pgno, ppP
d960: 61 67 65 2c 20 62 52 65 61 64 6f 6e 6c 79 29 3b  age, bReadonly);
d970: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
d980: 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70 50 61  ITE_OK && (*ppPa
d990: 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  ge)->isInit==0 )
d9a0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  {.      rc = btr
d9b0: 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61  eeInitPage(*ppPa
d9c0: 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
d9d0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
d9e0: 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
d9f0: 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
da00: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
da10: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e  .  testcase( pgn
da20: 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  o==0 );.  assert
da30: 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d  ( pgno!=0 || rc=
da40: 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
da50: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
da60: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
da70: 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69   a MemPage.  Thi
da80: 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  s should be call
da90: 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
daa0: 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74   prior.** call t
dab0: 6f 20 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a  o btreeGetPage..
dac0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
dad0: 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61  eleasePage(MemPa
dae0: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66  ge *pPage){.  if
daf0: 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61  ( pPage ){.    a
db00: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
db10: 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
db20: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
db30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
db40: 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29  ge->pDbPage!=0 )
db50: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
db60: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
db70: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
db80: 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
db90: 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ge );.    assert
dba0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
dbb0: 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
dbc0: 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44  Page)==pPage->aD
dbd0: 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
dbe0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
dbf0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
dc00: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
dc10: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
dc20: 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e  fNotNull(pPage->
dc30: 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a  pDbPage);.  }.}.
dc40: 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20  ./*.** During a 
dc50: 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74  rollback, when t
dc60: 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73  he pager reloads
dc70: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74   information int
dc80: 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73  o the cache.** s
dc90: 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65  o that the cache
dca0: 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20   is restored to 
dcb0: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
dcc0: 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  te at the start 
dcd0: 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61  of.** the transa
dce0: 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20  ction, for each 
dcf0: 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68  page restored th
dd00: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
dd10: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  lled..**.** This
dd20: 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74   routine needs t
dd30: 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72  o reset the extr
dd40: 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61  a data section a
dd50: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
dd60: 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65  .** page to agre
dd70: 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f  e with the resto
dd80: 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61  red data..*/.sta
dd90: 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69  tic void pageRei
dda0: 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74  nit(DbPage *pDat
ddb0: 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  a){.  MemPage *p
ddc0: 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20  Page;.  pPage = 
ddd0: 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74  (MemPage *)sqlit
dde0: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
ddf0: 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74  pData);.  assert
de00: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
de10: 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61  geRefcount(pData
de20: 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  )>0 );.  if( pPa
de30: 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
de40: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
de50: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
de60: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
de70: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  );.    pPage->is
de80: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66  Init = 0;.    if
de90: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
dea0: 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61  geRefcount(pData
deb0: 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  )>1 ){.      /* 
dec0: 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20  pPage might not 
ded0: 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65 3b  be a btree page;
dee0: 20 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e    it might be an
def0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20   overflow page. 
df00: 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61       ** or ptrma
df10: 70 20 70 61 67 65 20 6f 72 20 61 20 66 72 65 65  p page or a free
df20: 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65   page.  In those
df30: 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c   cases, the foll
df40: 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63  owing.      ** c
df50: 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74  all to btreeInit
df60: 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65  Page() will like
df70: 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ly return SQLITE
df80: 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20  _CORRUPT..      
df90: 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69  ** But no harm i
dfa0: 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20  s done by this. 
dfb0: 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79 20   And it is very 
dfc0: 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20  important that. 
dfd0: 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69       ** btreeIni
dfe0: 74 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65  tPage() be calle
dff0: 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65  d on every btree
e000: 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65   page so we make
e010: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61  .      ** the ca
e020: 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67  ll for every pag
e030: 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20  e that comes in 
e040: 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20  for re-initing. 
e050: 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e  */.      btreeIn
e060: 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
e070: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
e080: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * Invoke the bus
e090: 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20  y handler for a 
e0a0: 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  btree..*/.static
e0b0: 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65   int btreeInvoke
e0c0: 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64  BusyHandler(void
e0d0: 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61   *pArg){.  BtSha
e0e0: 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68  red *pBt = (BtSh
e0f0: 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73  ared*)pArg;.  as
e100: 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b  sert( pBt->db );
e110: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
e120: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
e130: 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  t->db->mutex) );
e140: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
e150: 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
e160: 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73  er(&pBt->db->bus
e170: 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a  yHandler);.}../*
e180: 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62  .** Open a datab
e190: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
e1a0: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68   zFilename is th
e1b0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
e1c0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
e1d0: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
e1e0: 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70  LL.** then an ep
e1f0: 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
e200: 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68   is created.  Th
e210: 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  e ephemeral data
e220: 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65  base might.** be
e230: 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20   exclusively in 
e240: 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69  memory, or it mi
e250: 67 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62  ght use a disk-b
e260: 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68  ased memory cach
e270: 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79  e..** Either way
e280: 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  , the ephemeral 
e290: 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65  database will be
e2a0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
e2b0: 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20  eleted .** when 
e2c0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
e2d0: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
e2e0: 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
e2f0: 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
e300: 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  then an in-memor
e310: 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  y database is cr
e320: 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73  eated.** that is
e330: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
e340: 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74  estroyed when it
e350: 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
e360: 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20 70 61  * The "flags" pa
e370: 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74  rameter is a bit
e380: 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20  mask that might 
e390: 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b  contain bits lik
e3a0: 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f  e.** BTREE_OMIT_
e3b0: 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42  JOURNAL and/or B
e3c0: 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a  TREE_MEMORY..**.
e3d0: 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
e3e0: 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  se is already op
e3f0: 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ened in the same
e400: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
e410: 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61  tion.** and we a
e420: 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 63  re in shared cac
e430: 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  he mode, then th
e440: 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c  e open will fail
e450: 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49   with an.** SQLI
e460: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72  TE_CONSTRAINT er
e470: 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20  ror.  We cannot 
e480: 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72  allow two or mor
e490: 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62  e BtShared.** ob
e4a0: 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d  jects in the sam
e4b0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
e4c0: 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e  ction since doin
e4d0: 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a  g so will lead.*
e4e0: 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69  * to problems wi
e4f0: 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69  th locking..*/.i
e500: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f  nt sqlite3BtreeO
e510: 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
e520: 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f  fs *pVfs,      /
e530: 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72  * VFS to use for
e540: 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a   this b-tree */.
e550: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
e560: 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
e570: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
e580: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72  ntaining the BTr
e590: 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ee database */. 
e5a0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
e5b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f           /* Asso
e5c0: 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
e5d0: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65  handle */.  Btre
e5e0: 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20  e **ppBtree,    
e5f0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
e600: 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65  o new Btree obje
e610: 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ct written here 
e620: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
e630: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e640: 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  Options */.  int
e650: 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
e660: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
e670: 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
e680: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
e690: 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  n() */.){.  BtSh
e6a0: 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20  ared *pBt = 0;  
e6b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
e6c0: 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72  ared part of btr
e6d0: 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
e6e0: 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20    Btree *p;     
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e700: 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65   /* Handle to re
e710: 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  turn */.  sqlite
e720: 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70  3_mutex *mutexOp
e730: 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76  en = 0;  /* Prev
e740: 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64  ents a race cond
e750: 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33  ition. Ticket #3
e760: 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  537 */.  int rc 
e770: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
e780: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
e790: 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73  t code from this
e7a0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75   function */.  u
e7b0: 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20  8 nReserve;     
e7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e7d0: 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20   Byte of unused 
e7e0: 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
e7f0: 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
e800: 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b   char zDbHeader[
e810: 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61  100];  /* Databa
e820: 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e  se header conten
e830: 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20  t */..  /* True 
e840: 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70  if opening an ep
e850: 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61  hemeral, tempora
e860: 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ry database */. 
e870: 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d   const int isTem
e880: 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d  pDb = zFilename=
e890: 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b  =0 || zFilename[
e8a0: 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74  0]==0;..  /* Set
e8b0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73   the variable is
e8c0: 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f  Memdb to true fo
e8d0: 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
e8e0: 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a  atabase, or .  *
e8f0: 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69  * false for a fi
e900: 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73  le-based databas
e910: 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  e..  */.#ifdef S
e920: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
e930: 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  YDB.  const int 
e940: 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c  isMemdb = 0;.#el
e950: 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  se.  const int i
e960: 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e  sMemdb = (zFilen
e970: 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46  ame && strcmp(zF
e980: 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72  ilename, ":memor
e990: 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20  y:")==0).       
e9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9b0: 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26 20  || (isTempDb && 
e9c0: 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
e9d0: 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20 20 20  ory(db)).       
e9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9f0: 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20 53  || (vfsFlags & S
ea00: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52  QLITE_OPEN_MEMOR
ea10: 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  Y)!=0;.#endif.. 
ea20: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
ea30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  ;.  assert( pVfs
ea40: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
ea50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
ea60: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
ea70: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  ;.  assert( (fla
ea80: 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20  gs&0xff)==flags 
ea90: 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69  );   /* flags fi
eaa0: 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a  t in 8 bits */..
eab0: 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45    /* Only a BTRE
eac0: 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73  E_SINGLE databas
ead0: 65 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55  e can be BTREE_U
eae0: 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73  NORDERED */.  as
eaf0: 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42  sert( (flags & B
eb00: 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d  TREE_UNORDERED)=
eb10: 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42  =0 || (flags & B
eb20: 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20  TREE_SINGLE)!=0 
eb30: 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45  );..  /* A BTREE
eb40: 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65  _SINGLE database
eb50: 20 69 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d   is always a tem
eb60: 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70  porary and/or ep
eb70: 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73  hemeral */.  ass
eb80: 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54  ert( (flags & BT
eb90: 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c  REE_SINGLE)==0 |
eba0: 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20  | isTempDb );.. 
ebb0: 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a   if( isMemdb ){.
ebc0: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52      flags |= BTR
ebd0: 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20  EE_MEMORY;.  }. 
ebe0: 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20 26   if( (vfsFlags &
ebf0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
ec00: 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d  N_DB)!=0 && (isM
ec10: 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62  emdb || isTempDb
ec20: 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67  ) ){.    vfsFlag
ec30: 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20  s = (vfsFlags & 
ec40: 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  ~SQLITE_OPEN_MAI
ec50: 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f  N_DB) | SQLITE_O
ec60: 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d  PEN_TEMP_DB;.  }
ec70: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
ec80: 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
ec90: 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
eca0: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
ecb0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
ecc0: 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  }.  p->inTrans =
ecd0: 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70   TRANS_NONE;.  p
ece0: 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64  ->db = db;.#ifnd
ecf0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
ed00: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d  HARED_CACHE.  p-
ed10: 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70  >lock.pBtree = p
ed20: 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62  ;.  p->lock.iTab
ed30: 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a  le = 1;.#endif..
ed40: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
ed50: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
ed60: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
ed70: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
ed80: 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a  ISKIO).  /*.  **
ed90: 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20 69   If this Btree i
eda0: 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
edb0: 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20  r shared cache, 
edc0: 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20  try to find an. 
edd0: 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53   ** existing BtS
ede0: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61  hared object tha
edf0: 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20 77  t we can share w
ee00: 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ith.  */.  if( i
ee10: 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28 69  sTempDb==0 && (i
ee20: 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66  sMemdb==0 || (vf
ee30: 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
ee40: 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a 20  EN_URI)!=0) ){. 
ee50: 20 20 20 69 66 28 20 76 66 73 46 6c 61 67 73 20     if( vfsFlags 
ee60: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48  & SQLITE_OPEN_SH
ee70: 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20 20  AREDCACHE ){.   
ee80: 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68     int nFullPath
ee90: 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
eea0: 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20  athname+1;.     
eeb0: 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
eec0: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
eed0: 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61  lloc(nFullPathna
eee0: 6d 65 29 3b 0a 20 20 20 20 20 20 4d 55 54 45 58  me);.      MUTEX
eef0: 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
ef00: 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
ef10: 65 64 3b 20 29 0a 20 20 20 20 20 20 70 2d 3e 73  ed; ).      p->s
ef20: 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
ef30: 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74     if( !zFullPat
ef40: 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  hname ){.       
ef50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
ef60: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
ef70: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
ef80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
ef90: 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20   isMemdb ){.    
efa0: 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c      memcpy(zFull
efb0: 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e  Pathname, zFilen
efc0: 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  ame, sqlite3Strl
efd0: 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b  en30(zFilename)+
efe0: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
eff0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
f000: 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
f010: 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
f020: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
f030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f040: 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74          nFullPat
f050: 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  hname, zFullPath
f060: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  name);.        i
f070: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
f080: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
f090: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
f0a0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f0b0: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
f0c0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
f0d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f0e0: 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  }.#if SQLITE_THR
f0f0: 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75  EADSAFE.      mu
f100: 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65  texOpen = sqlite
f110: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
f120: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
f130: 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c  OPEN);.      sql
f140: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
f150: 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
f160: 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
f170: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
f180: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
f190: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
f1a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
f1b0: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
f1c0: 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  hared);.#endif. 
f1d0: 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f       for(pBt=GLO
f1e0: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
f1f0: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
f200: 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d  List); pBt; pBt=
f210: 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  pBt->pNext){.   
f220: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
f230: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
f240: 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
f250: 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  p(zFullPathname,
f260: 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
f270: 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
f280: 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20  r, 0)).         
f290: 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
f2a0: 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e  e3PagerVfs(pBt->
f2b0: 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b  pPager)==pVfs ){
f2c0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
f2d0: 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  Db;.          fo
f2e0: 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b  r(iDb=db->nDb-1;
f2f0: 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b   iDb>=0; iDb--){
f300: 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72  .            Btr
f310: 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20  ee *pExisting = 
f320: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
f330: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
f340: 28 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70  ( pExisting && p
f350: 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70  Existing->pBt==p
f360: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
f370: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
f380: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
f390: 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  red);.          
f3a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
f3b0: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
f3c0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
f3d0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
f3e0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
f3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
f400: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
f410: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
f420: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
f430: 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20  AINT;.          
f440: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
f450: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74            p->pBt
f460: 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20   = pBt;.        
f470: 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pBt->nRef++;. 
f480: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
f490: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f4a0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
f4b0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
f4c0: 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
f4d0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
f4e0: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
f4f0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
f500: 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b  _DEBUG.    else{
f510: 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62  .      /* In deb
f520: 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b  ug mode, we mark
f530: 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20   all persistent 
f540: 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61  databases as sha
f550: 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65  rable.      ** e
f560: 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72  ven when they ar
f570: 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65  e not.  This exe
f580: 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69  rcises the locki
f590: 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20  ng code and.    
f5a0: 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20    ** gives more 
f5b0: 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20  opportunity for 
f5c0: 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f  asserts(sqlite3_
f5d0: 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20  mutex_held()).  
f5e0: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
f5f0: 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e  s to find lockin
f600: 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20  g problems..    
f610: 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68    */.      p->sh
f620: 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  arable = 1;.    
f630: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e  }.#endif.  }.#en
f640: 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30  dif.  if( pBt==0
f650: 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
f660: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
f670: 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72  asserts make sur
f680: 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65  e that structure
f690: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74  s used by the bt
f6a0: 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74  ree are.    ** t
f6b0: 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20  he right size.  
f6c0: 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64  This is to guard
f6d0: 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68   against size ch
f6e0: 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c  anges that resul
f6f0: 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f  t.    ** when co
f700: 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66  mpiling on a dif
f710: 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74  ferent architect
f720: 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
f730: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69  assert( sizeof(i
f740: 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66  64)==8 || sizeof
f750: 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20  (i64)==4 );.    
f760: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
f770: 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66  64)==8 || sizeof
f780: 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20  (u64)==4 );.    
f790: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
f7a0: 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  32)==4 );.    as
f7b0: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36  sert( sizeof(u16
f7c0: 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65  )==2 );.    asse
f7d0: 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29  rt( sizeof(Pgno)
f7e0: 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42  ==4 );.  .    pB
f7f0: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
f800: 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70  cZero( sizeof(*p
f810: 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Bt) );.    if( p
f820: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  Bt==0 ){.      r
f830: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
f840: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  ;.      goto btr
f850: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
f860: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
f870: 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66  te3PagerOpen(pVf
f880: 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c  s, &pBt->pPager,
f890: 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20   zFilename,.    
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8b0: 20 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45        EXTRA_SIZE
f8c0: 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67  , flags, vfsFlag
f8d0: 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a  s, pageReinit);.
f8e0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
f8f0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
f900: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d  qlite3PagerSetMm
f910: 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61  apLimit(pBt->pPa
f920: 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29  ger, db->szMmap)
f930: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
f940: 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
f950: 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61  eheader(pBt->pPa
f960: 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65  ger,sizeof(zDbHe
f970: 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29  ader),zDbHeader)
f980: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f990: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f9a0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
f9b0: 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
f9c0: 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46  }.    pBt->openF
f9d0: 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73  lags = (u8)flags
f9e0: 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20  ;.    pBt->db = 
f9f0: 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  db;.    sqlite3P
fa00: 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
fa10: 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  er(pBt->pPager, 
fa20: 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
fa30: 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20  andler, pBt);.  
fa40: 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
fa50: 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72    .    pBt->pCur
fa60: 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  sor = 0;.    pBt
fa70: 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
fa80: 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
fa90: 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74  erIsreadonly(pBt
faa0: 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42 74 2d  ->pPager) ) pBt-
fab0: 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
fac0: 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 64  _READ_ONLY;.#ifd
fad0: 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ef SQLITE_SECURE
fae0: 5f 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74 2d  _DELETE.    pBt-
faf0: 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
fb00: 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a  _SECURE_DELETE;.
fb10: 23 65 6e 64 69 66 0a 20 20 20 20 70 42 74 2d 3e  #endif.    pBt->
fb20: 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62 48  pageSize = (zDbH
fb30: 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20  eader[16]<<8) | 
fb40: 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c  (zDbHeader[17]<<
fb50: 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  16);.    if( pBt
fb60: 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c  ->pageSize<512 |
fb70: 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  | pBt->pageSize>
fb80: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
fb90: 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c  SIZE.         ||
fba0: 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   ((pBt->pageSize
fbb0: 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  -1)&pBt->pageSiz
fbc0: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  e)!=0 ){.      p
fbd0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30  Bt->pageSize = 0
fbe0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
fbf0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
fc00: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
fc10: 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65   magic name ":me
fc20: 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61  mory:" will crea
fc30: 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  te an in-memory 
fc40: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20  database, then. 
fc50: 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68       ** leave th
fc60: 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64  e autoVacuum mod
fc70: 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61  e at 0 (do not a
fc80: 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65  uto-vacuum), eve
fc90: 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51  n if.      ** SQ
fca0: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
fcb0: 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e  OVACUUM is true.
fcc0: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
fcd0: 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  nd, if.      ** 
fce0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
fcf0: 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65  RYDB has been de
fd00: 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65  fined, then ":me
fd10: 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61  mory:" is just a
fd20: 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61  .      ** regula
fd30: 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20  r file-name. In 
fd40: 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75  this case the au
fd50: 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65  to-vacuum applie
fd60: 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e  s as per normal.
fd70: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
fd80: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
fd90: 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20   !isMemdb ){.   
fda0: 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
fdb0: 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
fdc0: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
fdd0: 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  M ? 1 : 0);.    
fde0: 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
fdf0: 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
fe00: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
fe10: 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  ==2 ? 1 : 0);.  
fe20: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
fe30: 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b     nReserve = 0;
fe40: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
fe50: 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62    nReserve = zDb
fe60: 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20  Header[20];.    
fe70: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
fe80: 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  |= BTS_PAGESIZE_
fe90: 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53  FIXED;.#ifndef S
fea0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
feb0: 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d  ACUUM.      pBt-
fec0: 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67  >autoVacuum = (g
fed0: 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
fee0: 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  er[36 + 4*4])?1:
fef0: 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69  0);.      pBt->i
ff00: 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
ff10: 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
ff20: 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
ff30: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
ff40: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
ff50: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
ff60: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
ff70: 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65  t->pageSize, nRe
ff80: 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20  serve);.    if( 
ff90: 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f  rc ) goto btree_
ffa0: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42  open_out;.    pB
ffb0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
ffc0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
ffd0: 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
ffe0: 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65  sert( (pBt->page
fff0: 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20  Size & 7)==0 ); 
10000 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
10010 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65  ment of pageSize
10020 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66   */.   .#if !def
10030 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
10040 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
10050 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
10060 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
10070 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65     /* Add the ne
10080 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  w BtShared objec
10090 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  t to the linked 
100a0 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74  list sharable Bt
100b0 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a  Shareds..    */.
100c0 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61      if( p->shara
100d0 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54  ble ){.      MUT
100e0 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
100f0 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
10100 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20 70 42  ared; ).      pB
10110 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  t->nRef = 1;.   
10120 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
10130 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71  mutexShared = sq
10140 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
10150 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
10160 54 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20  TIC_MASTER);).  
10170 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
10180 48 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c  HREADSAFE && sql
10190 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
101a0 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20  .bCoreMutex ){. 
101b0 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65         pBt->mute
101c0 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  x = sqlite3Mutex
101d0 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
101e0 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20  EX_FAST);.      
101f0 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78    if( pBt->mutex
10200 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10210 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
10220 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  EM;.          db
10230 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
10240 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   0;.          go
10250 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
10260 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
10270 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
10280 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
10290 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
102a0 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20     pBt->pNext = 
102b0 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
102c0 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
102d0 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  cheList);.      
102e0 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
102f0 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
10300 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a  cheList) = pBt;.
10310 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
10320 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
10330 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65  hared);.    }.#e
10340 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64  ndif.  }..#if !d
10350 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
10360 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
10370 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
10380 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
10390 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77  .  /* If the new
103a0 20 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68   Btree uses a sh
103b0 61 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64  arable pBtShared
103c0 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20  , then link the 
103d0 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69  new.  ** Btree i
103e0 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20  nto the list of 
103f0 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72  all sharable Btr
10400 65 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65  ees for the same
10410 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a   connection..  *
10420 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65  * The list is ke
10430 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  pt in ascending 
10440 6f 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64  order by pBt add
10450 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ress..  */.  if(
10460 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
10470 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42      int i;.    B
10480 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20  tree *pSib;.    
10490 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
104a0 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
104b0 69 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e  if( (pSib = db->
104c0 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26  aDb[i].pBt)!=0 &
104d0 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65  & pSib->sharable
104e0 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
104f0 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29  e( pSib->pPrev )
10500 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70  { pSib = pSib->p
10510 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20  Prev; }.        
10520 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d  if( p->pBt<pSib-
10530 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
10540 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69    p->pNext = pSi
10550 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  b;.          p->
10560 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20  pPrev = 0;.     
10570 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76       pSib->pPrev
10580 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65   = p;.        }e
10590 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77  lse{.          w
105a0 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78  hile( pSib->pNex
105b0 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74  t && pSib->pNext
105c0 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a  ->pBt<p->pBt ){.
105d0 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62              pSib
105e0 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
105f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
10600 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
10610 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
10620 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76          p->pPrev
10630 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
10640 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20     if( p->pNext 
10650 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
10660 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
10670 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   p;.          }.
10680 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e            pSib->
10690 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  pNext = p;.     
106a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
106b0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
106c0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a  }.  }.#endif.  *
106d0 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74  ppBtree = p;..bt
106e0 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20  ree_open_out:.  
106f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10700 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74  K ){.    if( pBt
10710 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20   && pBt->pPager 
10720 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10730 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
10740 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
10750 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
10760 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
10770 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a  3_free(p);.    *
10780 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d  ppBtree = 0;.  }
10790 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
107a0 74 68 65 20 42 2d 54 72 65 65 20 77 61 73 20 73  the B-Tree was s
107b0 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
107c0 65 64 2c 20 73 65 74 20 74 68 65 20 70 61 67 65  ed, set the page
107d0 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20  r-cache size to 
107e0 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75  the.    ** defau
107f0 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74  lt value. Except
10800 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f  , when opening o
10810 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68  n an existing sh
10820 61 72 65 64 20 70 61 67 65 72 2d 63 61 63 68 65  ared pager-cache
10830 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20  ,.    ** do not 
10840 63 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 72  change the pager
10850 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 20  -cache size..   
10860 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
10870 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 70  te3BtreeSchema(p
10880 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20  , 0, 0)==0 ){.  
10890 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
108a0 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d 3e  SetCachesize(p->
108b0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c  pBt->pPager, SQL
108c0 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48  ITE_DEFAULT_CACH
108d0 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20  E_SIZE);.    }. 
108e0 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70   }.  if( mutexOp
108f0 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  en ){.    assert
10900 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
10910 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20  held(mutexOpen) 
10920 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
10930 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
10940 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Open);.  }.  ret
10950 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
10960 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42   Decrement the B
10970 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75  tShared.nRef cou
10980 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72  nter.  When it r
10990 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20  eaches zero,.** 
109a0 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61  remove the BtSha
109b0 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66 72  red structure fr
109c0 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  om the sharing l
109d0 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ist.  Return.** 
109e0 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68  true if the BtSh
109f0 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
10a00 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61  r reaches zero a
10a10 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c  nd return.** fal
10a20 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c  se if it is stil
10a30 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73  l positive..*/.s
10a40 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65  tatic int remove
10a50 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
10a60 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
10a70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10a80 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
10a90 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
10aa0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
10ab0 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53 68  Master; ).  BtSh
10ac0 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69  ared *pList;.  i
10ad0 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a  nt removed = 0;.
10ae0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10af0 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64  e3_mutex_notheld
10b00 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
10b10 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70    MUTEX_LOGIC( p
10b20 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
10b30 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
10b40 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
10b50 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69  ASTER); ).  sqli
10b60 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
10b70 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d  pMaster);.  pBt-
10b80 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
10b90 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20  Bt->nRef<=0 ){. 
10ba0 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74     if( GLOBAL(Bt
10bb0 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
10bc0 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d  haredCacheList)=
10bd0 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c  =pBt ){.      GL
10be0 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
10bf0 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
10c00 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e  eList) = pBt->pN
10c10 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
10c20 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c        pList = GL
10c30 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
10c40 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
10c50 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68  eList);.      wh
10c60 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73  ile( ALWAYS(pLis
10c70 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65  t) && pList->pNe
10c80 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  xt!=pBt ){.     
10c90 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e     pList=pList->
10ca0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
10cb0 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
10cc0 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pList) ){.      
10cd0 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d    pList->pNext =
10ce0 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
10cf0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
10d00 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
10d10 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71  SAFE ){.      sq
10d20 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
10d30 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  (pBt->mutex);.  
10d40 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20    }.    removed 
10d50 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 1;.  }.  sqlit
10d60 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
10d70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
10d80 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65  n removed;.#else
10d90 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
10da0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  dif.}../*.** Mak
10db0 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70  e sure pBt->pTmp
10dc0 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20  Space points to 
10dd0 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66  an allocation of
10de0 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a   .** MX_CELL_SIZ
10df0 45 28 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f  E(pBt) bytes..*/
10e00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c  .static void all
10e10 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 42  ocateTempSpace(B
10e20 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
10e30 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53   if( !pBt->pTmpS
10e40 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d  pace ){.    pBt-
10e50 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c  >pTmpSpace = sql
10e60 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20  ite3PageMalloc( 
10e70 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
10e80 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20  ..    /* One of 
10e90 74 68 65 20 75 73 65 73 20 6f 66 20 70 42 74 2d  the uses of pBt-
10ea0 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20 74 6f  >pTmpSpace is to
10eb0 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62 65   format cells be
10ec0 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65  fore.    ** inse
10ed0 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20  rting them into 
10ee0 61 20 6c 65 61 66 20 70 61 67 65 20 28 66 75 6e  a leaf page (fun
10ef0 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c  ction fillInCell
10f00 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  ()). If.    ** a
10f10 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20 74 68   cell is less th
10f20 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20 73 69  an 4 bytes in si
10f30 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e 64 65  ze, it is rounde
10f40 64 20 75 70 20 74 6f 20 34 20 62 79 74 65 73 0a  d up to 4 bytes.
10f50 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 76 61      ** by the va
10f60 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73 20 74  rious routines t
10f70 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65 20 62  hat manipulate b
10f80 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57 68 69  inary cells. Whi
10f90 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65  ch.    ** can me
10fa0 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e 43 65  an that fillInCe
10fb0 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61  ll() only initia
10fc0 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73 74 20  lizes the first 
10fd0 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62 79  2 or 3.    ** by
10fe0 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61 63 65  tes of pTmpSpace
10ff0 2c 20 62 75 74 20 74 68 61 74 20 74 68 65 20 66  , but that the f
11000 69 72 73 74 20 34 20 62 79 74 65 73 20 61 72 65  irst 4 bytes are
11010 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20 20   copied from.   
11020 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20 64 61   ** it into a da
11030 74 61 62 61 73 65 20 70 61 67 65 2e 20 54 68 69  tabase page. Thi
11040 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  s is not actuall
11050 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74  y a problem, but
11060 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20   it.    ** does 
11070 63 61 75 73 65 20 61 20 76 61 6c 67 72 69 6e 64  cause a valgrind
11080 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68 65 20   error when the 
11090 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f 66 20  1 or 2 bytes of 
110a0 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20  unitialized .   
110b0 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61 73 73   ** data is pass
110c0 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63 61 6c  ed to system cal
110d0 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20 74 6f  l write(). So to
110e0 20 61 76 6f 69 64 20 74 68 69 73 20 65 72 72 6f   avoid this erro
110f0 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74  r,.    ** zero t
11100 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
11110 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65 20 68   of temp space h
11120 65 72 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ere.  */.    if(
11130 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
11140 29 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70 54  ) memset(pBt->pT
11150 6d 70 53 70 61 63 65 2c 20 30 2c 20 34 29 3b 0a  mpSpace, 0, 4);.
11160 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
11170 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53  e the pBt->pTmpS
11180 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  pace allocation.
11190 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
111a0 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  reeTempSpace(BtS
111b0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73  hared *pBt){.  s
111c0 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 20  qlite3PageFree( 
111d0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  pBt->pTmpSpace);
111e0 0a 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  .  pBt->pTmpSpac
111f0 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e = 0;.}../*.** 
11200 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61  Close an open da
11210 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c  tabase and inval
11220 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72  idate all cursor
11230 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
11240 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65  3BtreeClose(Btre
11250 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
11260 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
11270 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
11280 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  r;..  /* Close a
11290 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
112a0 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c  d via this handl
112b0 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
112c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
112d0 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
112e0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
112f0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
11300 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  Cur = pBt->pCurs
11310 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75  or;.  while( pCu
11320 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f  r ){.    BtCurso
11330 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a  r *pTmp = pCur;.
11340 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d      pCur = pCur-
11350 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
11360 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20  pTmp->pBtree==p 
11370 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11380 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
11390 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTmp);.    }.  
113a0 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  }..  /* Rollback
113b0 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e   any active tran
113c0 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  saction and free
113d0 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75   the handle stru
113e0 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20  cture..  ** The 
113f0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
11400 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64  treeRollback() d
11410 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c  rops any table-l
11420 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a  ocks held by.  *
11430 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20  * this handle.. 
11440 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
11450 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51  eeRollback(p, SQ
11460 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69  LITE_OK);.  sqli
11470 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
11480 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
11490 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72   are still other
114a0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
114b0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
114c0 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a  hared-btree.  **
114d0 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75   structure, retu
114e0 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61  rn now. The rema
114f0 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72  inder of this pr
11500 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a  ocedure cleans .
11510 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72    ** up the shar
11520 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20  ed-btree..  */. 
11530 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
11540 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e  ToLock==0 && p->
11550 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
11560 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
11570 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  || removeFromSha
11580 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b  ringList(pBt) ){
11590 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20  .    /* The pBt 
115a0 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20  is no longer on 
115b0 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
115c0 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65  , so we can acce
115d0 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74  ss.    ** it wit
115e0 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68  hout having to h
115f0 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20  old the mutex.. 
11600 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65     **.    ** Cle
11610 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74  an out and delet
11620 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f  e the BtShared o
11630 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  bject..    */.  
11640 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
11650 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73  pCursor );.    s
11660 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
11670 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
11680 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65     if( pBt->xFre
11690 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e  eSchema && pBt->
116a0 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
116b0 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
116c0 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  a(pBt->pSchema);
116d0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
116e0 65 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d  e3DbFree(0, pBt-
116f0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66  >pSchema);.    f
11700 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
11710 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
11720 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23  ree(pBt);.  }..#
11730 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11740 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
11750 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
11760 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  tToLock==0 );.  
11770 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65  assert( p->locke
11780 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  d==0 );.  if( p-
11790 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65  >pPrev ) p->pPre
117a0 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
117b0 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e  ext;.  if( p->pN
117c0 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e  ext ) p->pNext->
117d0 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
117e0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
117f0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
11800 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11810 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
11820 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68   the limit on th
11830 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
11840 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65  s allowed in the
11850 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
11860 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
11870 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20   of cache pages 
11880 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 61 62  is set to the ab
11890 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20  solute.** value 
118a0 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d  of mxPage.  If m
118b0 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  xPage is negativ
118c0 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  e, the pager wil
118d0 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79  l.** operate asy
118e0 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74  nchronously - it
118f0 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74   will not stop t
11900 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a  o do fsync()s.**
11910 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20   to insure data 
11920 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
11930 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20 62  e disk surface b
11940 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75  efore.** continu
11950 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f  ing.  Transactio
11960 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66  ns still work if
11970 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   synchronous is 
11980 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  off,.** and the 
11990 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
119a0 62 65 20 63 6f 72 72 75 70 74 65 64 20 69 66 20  be corrupted if 
119b0 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  this program.** 
119c0 63 72 61 73 68 65 73 2e 20 20 42 75 74 20 69 66  crashes.  But if
119d0 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
119e0 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72  ystem crashes or
119f0 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
11a00 61 62 72 75 70 74 20 70 6f 77 65 72 20 66 61 69  abrupt power fai
11a10 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72  lure when synchr
11a20 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68  onous is off, th
11a30 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
11a40 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61  uld be left in a
11a50 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61  n inconsistent a
11a60 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65  nd unrecoverable
11a70 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68   state..** Synch
11a80 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20  ronous is on by 
11a90 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62  default so datab
11aa0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
11ab0 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  s not.** normall
11ac0 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e  y a worry..*/.in
11ad0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
11ae0 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65  tCacheSize(Btree
11af0 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
11b00 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
11b10 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
11b20 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11b30 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
11b40 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
11b50 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
11b60 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
11b70 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74  SetCachesize(pBt
11b80 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
11b90 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
11ba0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
11bb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
11bc0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
11bd0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a  _MMAP_SIZE>0./*.
11be0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69  ** Change the li
11bf0 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e  mit on the amoun
11c00 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
11c10 65 20 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20  e file that may 
11c20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70  be.** memory map
11c30 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ped..*/.int sqli
11c40 74 65 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c  te3BtreeSetMmapL
11c50 69 6d 69 74 28 42 74 72 65 65 20 2a 70 2c 20 73  imit(Btree *p, s
11c60 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d  qlite3_int64 szM
11c70 6d 61 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64  map){.  BtShared
11c80 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
11c90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11ca0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
11cb0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
11cc0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
11cd0 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
11ce0 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
11cf0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a  (pBt->pPager, sz
11d00 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  Mmap);.  sqlite3
11d10 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11d20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11d30 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
11d40 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
11d50 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  IZE>0 */../*.** 
11d60 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64  Change the way d
11d70 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f  ata is synced to
11d80 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74   disk in order t
11d90 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65  o increase or de
11da0 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65  crease.** how we
11db0 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ll the database 
11dc0 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64  resists damage d
11dd0 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
11de0 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61   and power.** fa
11df0 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31  ilures.  Level 1
11e00 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
11e10 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f  asynchronous (no
11e20 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61   syncs() occur a
11e30 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61  nd.** there is a
11e40 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
11e50 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65  y of damage)  Le
11e60 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66  vel 2 is the def
11e70 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ault.  There.** 
11e80 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75  is a very low bu
11e90 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61  t non-zero proba
11ea0 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
11eb0 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63  .  Level 3 reduc
11ec0 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62  es the.** probab
11ed0 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20  ility of damage 
11ee0 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74  to near zero but
11ef0 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65   with a write pe
11f00 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74  rformance reduct
11f10 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
11f20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
11f30 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71  R_PRAGMAS.int sq
11f40 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
11f50 65 72 46 6c 61 67 73 28 0a 20 20 42 74 72 65 65  erFlags(.  Btree
11f60 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
11f70 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74    /* The btree t
11f80 6f 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79  o set the safety
11f90 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75   level on */.  u
11fa0 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20  nsigned pgFlags 
11fb0 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73        /* Various
11fc0 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a   PAGER_* flags *
11fd0 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
11fe0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
11ff0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12000 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
12010 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
12020 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
12030 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
12040 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d  gerSetFlags(pBt-
12050 3e 70 50 61 67 65 72 2c 20 70 67 46 6c 61 67 73  >pPager, pgFlags
12060 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
12070 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
12080 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
12090 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
120a0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
120b0 65 20 67 69 76 65 6e 20 62 74 72 65 65 20 69 73  e given btree is
120c0 20 73 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c   set to safety l
120d0 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65  evel 1.  In othe
120e0 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75  r.** words, retu
120f0 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79  rn TRUE if no sy
12100 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74  nc() occurs on t
12110 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a  he disk files..*
12120 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
12130 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42  eeSyncDisabled(B
12140 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
12150 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
12160 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  Bt;.  int rc;.  
12170 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
12180 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
12190 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20  ->mutex) );  .  
121a0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
121b0 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
121c0 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
121d0 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  er );.  rc = sql
121e0 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28  ite3PagerNosync(
121f0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
12200 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
12210 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
12220 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
12230 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  ge the default p
12240 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68  ages size and th
12250 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
12260 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70  rved bytes per p
12270 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74  age..** Or, if t
12280 68 65 20 70 61 67 65 20 73 69 7a 65 20 68 61 73  he page size has
12290 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69   already been fi
122a0 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  xed, return SQLI
122b0 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20  TE_READONLY .** 
122c0 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67  without changing
122d0 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a   anything..**.**
122e0 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d   The page size m
122f0 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
12300 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20  f 2 between 512 
12310 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74  and 65536.  If t
12320 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20  he page.** size 
12330 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f  supplied does no
12340 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73  t meet this cons
12350 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20  traint then the 
12360 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  page size is not
12370 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  .** changed..**.
12380 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72  ** Page sizes ar
12390 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f  e constrained to
123a0 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74   be a power of t
123b0 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72  wo so that the r
123c0 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  egion.** of the 
123d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73  database file us
123e0 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28  ed for locking (
123f0 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e  beginning at PEN
12400 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68  DING_BYTE,.** th
12410 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73  e first byte pas
12420 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61  t the 1GB bounda
12430 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20  ry, 0x40000000) 
12440 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a  needs to occur.*
12450 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  * at the beginni
12460 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a  ng of a page..**
12470 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
12480 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73   nReserve is les
12490 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
124a0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
124b0 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65  reserved.** byte
124c0 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65  s per page is le
124d0 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
124e0 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78 21  .** If the iFix!
124f0 3d 30 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f  =0 then the BTS_
12500 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66  PAGESIZE_FIXED f
12510 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20 74 68  lag is set so th
12520 61 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  at the page size
12530 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75  .** and autovacu
12540 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c  um mode can no l
12550 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64  onger be changed
12560 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12570 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
12580 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70  (Btree *p, int p
12590 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65  ageSize, int nRe
125a0 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29  serve, int iFix)
125b0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
125c0 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72  ITE_OK;.  BtShar
125d0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
125e0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  ;.  assert( nRes
125f0 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73  erve>=-1 && nRes
12600 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73  erve<=255 );.  s
12610 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
12620 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  (p);.  if( pBt->
12630 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
12640 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 29 7b  AGESIZE_FIXED ){
12650 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
12660 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
12670 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
12680 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  DONLY;.  }.  if(
12690 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20   nReserve<0 ){. 
126a0 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42     nReserve = pB
126b0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
126c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
126d0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65   }.  assert( nRe
126e0 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73  serve>=0 && nRes
126f0 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69  erve<=255 );.  i
12700 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  f( pageSize>=512
12710 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51   && pageSize<=SQ
12720 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
12730 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28  ZE &&.        ((
12740 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65  pageSize-1)&page
12750 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Size)==0 ){.    
12760 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
12770 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
12780 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
12790 50 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70  Page1 && !pBt->p
127a0 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42  Cursor );.    pB
127b0 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75  t->pageSize = (u
127c0 33 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  32)pageSize;.   
127d0 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
127e0 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  Bt);.  }.  rc = 
127f0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
12800 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
12810 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
12820 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a  ize, nReserve);.
12830 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
12840 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
12850 65 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76  e - (u16)nReserv
12860 65 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29 20  e;.  if( iFix ) 
12870 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
12880 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
12890 58 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  XED;.  sqlite3Bt
128a0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
128b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
128c0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
128d0 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20  rrently defined 
128e0 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74  page size.*/.int
128f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
12900 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a  PageSize(Btree *
12910 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
12920 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d  pBt->pageSize;.}
12930 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
12940 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20  LITE_HAS_CODEC) 
12950 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
12960 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 54  E_DEBUG)./*.** T
12970 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
12980 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74  similar to sqlit
12990 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
129a0 65 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74  e(), except that
129b0 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20   it.** may only 
129c0 62 65 20 63 61 6c 6c 65 64 20 69 66 20 69 74 20  be called if it 
129d0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
129e0 61 74 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75  at the b-tree mu
129f0 74 65 78 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  tex is already.*
12a00 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  * held..**.** Th
12a10 69 73 20 69 73 20 75 73 65 66 75 6c 20 69 6e 20  is is useful in 
12a20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  one special case
12a30 20 69 6e 20 74 68 65 20 62 61 63 6b 75 70 20 41   in the backup A
12a40 50 49 20 63 6f 64 65 20 77 68 65 72 65 20 69 74  PI code where it
12a50 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61   is.** known tha
12a60 74 20 74 68 65 20 73 68 61 72 65 64 20 62 2d 74  t the shared b-t
12a70 72 65 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c  ree mutex is hel
12a80 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74 65 78  d, but the mutex
12a90 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   on the .** data
12aa0 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74  base handle that
12ab0 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e   owns *p is not.
12ac0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 66   In this case if
12ad0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
12ae0 65 72 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20  er().** were to 
12af0 62 65 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69  be called, it mi
12b00 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68  ght collide with
12b10 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65 72   some other oper
12b20 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  ation on the.** 
12b30 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
12b40 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61  that owns *p, ca
12b50 75 73 69 6e 67 20 75 6e 64 65 66 69 6e 65 64 20  using undefined 
12b60 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74  behavior..*/.int
12b70 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
12b80 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 42  ReserveNoMutex(B
12b90 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  tree *p){.  asse
12ba0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
12bb0 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
12bc0 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72  utex) );.  retur
12bd0 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  n p->pBt->pageSi
12be0 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61  ze - p->pBt->usa
12bf0 62 6c 65 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69  bleSize;.}.#endi
12c00 66 20 2f 2a 20 53 51 4c 49 54 45 5f 48 41 53 5f  f /* SQLITE_HAS_
12c10 43 4f 44 45 43 20 7c 7c 20 53 51 4c 49 54 45 5f  CODEC || SQLITE_
12c20 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 20 21 64  DEBUG */..#if !d
12c30 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
12c40 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
12c50 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
12c60 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
12c70 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
12c80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
12c90 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74  es of space at t
12ca0 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20  he end of every 
12cb0 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65  page that.** are
12cc0 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66   intentually lef
12cd0 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20  t unused.  This 
12ce0 69 73 20 74 68 65 20 22 72 65 73 65 72 76 65 64  is the "reserved
12cf0 22 20 73 70 61 63 65 20 74 68 61 74 20 69 73 0a  " space that is.
12d00 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65  ** sometimes use
12d10 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e  d by extensions.
12d20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
12d30 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28 42  treeGetReserve(B
12d40 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
12d50 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  n;.  sqlite3Btre
12d60 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d  eEnter(p);.  n =
12d70 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
12d80 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62  e - p->pBt->usab
12d90 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74 65  leSize;.  sqlite
12da0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
12db0 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
12dc0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78  *.** Set the max
12dd0 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
12de0 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69  for a database i
12df0 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69  f mxPage is posi
12e00 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e  tive..** No chan
12e10 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20  ges are made if 
12e20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e  mxPage is 0 or n
12e30 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61  egative..** Rega
12e40 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61  rdless of the va
12e50 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72  lue of mxPage, r
12e60 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75  eturn the maximu
12e70 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
12e80 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
12e90 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74  eMaxPageCount(Bt
12ea0 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
12eb0 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  ge){.  int n;.  
12ec0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
12ed0 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  r(p);.  n = sqli
12ee0 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
12ef0 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61  ount(p->pBt->pPa
12f00 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
12f10 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
12f20 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
12f30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
12f40 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  he BTS_SECURE_DE
12f50 4c 45 54 45 20 66 6c 61 67 20 69 66 20 6e 65 77  LETE flag if new
12f60 46 6c 61 67 20 69 73 20 30 20 6f 72 20 31 2e 20  Flag is 0 or 1. 
12f70 20 49 66 20 6e 65 77 46 6c 61 67 20 69 73 20 2d   If newFlag is -
12f80 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20  1,.** then make 
12f90 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20 41 6c 77  no changes.  Alw
12fa0 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 76  ays return the v
12fb0 61 6c 75 65 20 6f 66 20 74 68 65 20 42 54 53 5f  alue of the BTS_
12fc0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 2a 2a  SECURE_DELETE.**
12fd0 20 73 65 74 74 69 6e 67 20 61 66 74 65 72 20 74   setting after t
12fe0 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e  he change..*/.in
12ff0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
13000 63 75 72 65 44 65 6c 65 74 65 28 42 74 72 65 65  cureDelete(Btree
13010 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67   *p, int newFlag
13020 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66  ){.  int b;.  if
13030 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
13040 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  0;.  sqlite3Btre
13050 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
13060 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20   newFlag>=0 ){. 
13070 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c     p->pBt->btsFl
13080 61 67 73 20 26 3d 20 7e 42 54 53 5f 53 45 43 55  ags &= ~BTS_SECU
13090 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 69  RE_DELETE;.    i
130a0 66 28 20 6e 65 77 46 6c 61 67 20 29 20 70 2d 3e  f( newFlag ) p->
130b0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
130c0 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
130d0 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20 3d 20 28  TE;.  } .  b = (
130e0 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
130f0 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
13100 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73 71 6c 69  LETE)!=0;.  sqli
13110 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
13120 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a  ;.  return b;.}.
13130 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
13140 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
13150 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c  AGER_PRAGMAS) ||
13160 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
13170 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f  _OMIT_VACUUM) */
13180 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
13190 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
131a0 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
131b0 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
131c0 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a  e 'autoVacuum'.*
131d0 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  * parameter is n
131e0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75  on-zero, then au
131f0 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69  to-vacuum mode i
13200 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65  s enabled. If ze
13210 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73  ro, it.** is dis
13220 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75  abled. The defau
13230 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
13240 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f   auto-vacuum pro
13250 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74  perty is .** det
13260 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53  ermined by the S
13270 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
13280 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a  TOVACUUM macro..
13290 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
132a0 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d  reeSetAutoVacuum
132b0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61  (Btree *p, int a
132c0 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64  utoVacuum){.#ifd
132d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
132e0 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
132f0 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
13300 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68  LY;.#else.  BtSh
13310 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
13320 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
13330 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61  QLITE_OK;.  u8 a
13340 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75  v = (u8)autoVacu
13350 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  um;..  sqlite3Bt
13360 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
13370 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  f( (pBt->btsFlag
13380 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45  s & BTS_PAGESIZE
13390 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20 28 61  _FIXED)!=0 && (a
133a0 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75  v ?1:0)!=pBt->au
133b0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
133c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
133d0 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ONLY;.  }else{. 
133e0 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
133f0 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20  um = av ?1:0;.  
13400 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
13410 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a  m = av==2 ?1:0;.
13420 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
13430 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
13440 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
13450 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
13460 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
13470 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
13480 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f  roperty. If auto
13490 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65  -vacuum is .** e
134a0 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75  nabled 1 is retu
134b0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
134c0 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
134d0 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63  3BtreeGetAutoVac
134e0 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23  uum(Btree *p){.#
134f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
13500 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
13510 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f  eturn BTREE_AUTO
13520 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c  VACUUM_NONE;.#el
13530 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  se.  int rc;.  s
13540 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
13550 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20  (p);.  rc = (.  
13560 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f    (!p->pBt->auto
13570 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
13580 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20  TOVACUUM_NONE:. 
13590 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63     (!p->pBt->inc
135a0 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  rVacuum)?BTREE_A
135b0 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a  UTOVACUUM_FULL:.
135c0 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41      BTREE_AUTOVA
135d0 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20  CUUM_INCR.  );. 
135e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
135f0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
13600 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  rc;.#endif.}.../
13610 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72  *.** Get a refer
13620 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f  ence to pPage1 o
13630 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
13640 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a  ile.  This will.
13650 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20  ** also acquire 
13660 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68  a readlock on th
13670 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  at file..**.** S
13680 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
13690 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
136a0 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73    If the file is
136b0 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66   not a.** well-f
136c0 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  ormed database f
136d0 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ile, then SQLITE
136e0 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75  _CORRUPT is retu
136f0 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f  rned..** SQLITE_
13700 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
13710 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
13720 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c   is locked.  SQL
13730 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20  ITE_NOMEM.** is 
13740 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72  returned if we r
13750 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  un out of memory
13760 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
13770 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61   lockBtree(BtSha
13780 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
13790 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
137a0 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
137b0 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f   from subfunctio
137c0 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ns */.  MemPage 
137d0 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20  *pPage1;     /* 
137e0 50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61  Page 1 of the da
137f0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
13800 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
13810 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
13820 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
13830 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
13840 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b  t nPageFile = 0;
13850 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13860 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
13870 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
13880 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b  int nPageHeader;
13890 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
138a0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
138b0 61 74 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e  atabase accordin
138c0 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61  g to hdr */..  a
138d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
138e0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
138f0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
13900 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  t( pBt->pPage1==
13910 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
13920 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f  te3PagerSharedLo
13930 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ck(pBt->pPager);
13940 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
13950 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
13960 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47 65  ;.  rc = btreeGe
13970 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
13980 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28  Page1, 0);.  if(
13990 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
139a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
139b0 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69  * Do some checki
139c0 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72  ng to help insur
139d0 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70  e the file we op
139e0 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20  ened really is. 
139f0 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61   ** a valid data
13a00 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f  base file. .  */
13a10 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  .  nPage = nPage
13a20 48 65 61 64 65 72 20 3d 20 67 65 74 34 62 79 74  Header = get4byt
13a30 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31  e(28+(u8*)pPage1
13a40 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c 69  ->aData);.  sqli
13a50 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
13a60 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
13a70 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66  nPageFile);.  if
13a80 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65  ( nPage==0 || me
13a90 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61  mcmp(24+(u8*)pPa
13aa0 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28  ge1->aData, 92+(
13ab0 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
13ac0 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e  a,4)!=0 ){.    n
13ad0 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65  Page = nPageFile
13ae0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67  ;.  }.  if( nPag
13af0 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20 70  e>0 ){.    u32 p
13b00 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33 32  ageSize;.    u32
13b10 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20   usableSize;.   
13b20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61   u8 *page1 = pPa
13b30 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  ge1->aData;.    
13b40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41  rc = SQLITE_NOTA
13b50 44 42 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63  DB;.    if( memc
13b60 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63  mp(page1, zMagic
13b70 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29  Header, 16)!=0 )
13b80 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
13b90 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
13ba0 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
13bb0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
13bc0 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e    if( page1[18]>
13bd0 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  1 ){.      pBt->
13be0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
13bf0 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d  READ_ONLY;.    }
13c00 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
13c10 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f  9]>1 ){.      go
13c20 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
13c30 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  iled;.    }.#els
13c40 65 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  e.    if( page1[
13c50 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70  18]>2 ){.      p
13c60 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
13c70 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20  BTS_READ_ONLY;. 
13c80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
13c90 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20  e1[19]>2 ){.    
13ca0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
13cb0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
13cc0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77  .    /* If the w
13cd0 72 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20  rite version is 
13ce0 73 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64  set to 2, this d
13cf0 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62  atabase should b
13d00 65 20 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a  e accessed.    *
13d10 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49  * in WAL mode. I
13d20 66 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74  f the log is not
13d30 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f   already open, o
13d40 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e  pen it now. Then
13d50 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20   .    ** return 
13d60 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
13d70 74 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70  turn without pop
13d80 75 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65 64  ulating BtShared
13d90 2e 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20  .pPage1..    ** 
13da0 54 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63  The caller detec
13db0 74 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c  ts this and call
13dc0 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
13dd0 61 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20  again. This is. 
13de0 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61     ** required a
13df0 73 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66  s the version of
13e00 20 70 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c   page 1 currentl
13e10 79 20 69 6e 20 74 68 65 20 70 61 67 65 31 20 62  y in the page1 b
13e20 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79  uffer.    ** may
13e30 20 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65   not be the late
13e40 73 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65  st version - the
13e50 72 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65  re may be a newe
13e60 72 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67  r one in the log
13e70 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20  .    ** file..  
13e80 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67    */.    if( pag
13e90 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42  e1[19]==2 && (pB
13ea0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
13eb0 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a  S_NO_WAL)==0 ){.
13ec0 20 20 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e        int isOpen
13ed0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
13ee0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
13ef0 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72  nWal(pBt->pPager
13f00 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20  , &isOpen);.    
13f10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13f20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
13f30 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
13f40 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c  ailed;.      }el
13f50 73 65 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30  se if( isOpen==0
13f60 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
13f70 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
13f80 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
13f90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
13fa0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51   }.      rc = SQ
13fb0 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20  LITE_NOTADB;.   
13fc0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
13fd0 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d  * The maximum em
13fe0 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20  bedded fraction 
13ff0 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79 20  must be exactly 
14000 32 35 25 2e 20 20 41 6e 64 20 74 68 65 20 6d 69  25%.  And the mi
14010 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62  nimum.    ** emb
14020 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d  edded fraction m
14030 75 73 74 20 62 65 20 31 32 2e 35 25 20 66 6f 72  ust be 12.5% for
14040 20 62 6f 74 68 20 6c 65 61 66 2d 64 61 74 61 20   both leaf-data 
14050 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74  and non-leaf-dat
14060 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72  a..    ** The or
14070 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c  iginal design al
14080 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75  lowed these amou
14090 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74  nts to vary, but
140a0 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65   as of.    ** ve
140b0 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20  rsion 3.6.0, we 
140c0 72 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20  require them to 
140d0 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f  be fixed..    */
140e0 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
140f0 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30  &page1[21], "\10
14100 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30  0\040\040",3)!=0
14110 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
14120 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
14130 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
14140 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36  Size = (page1[16
14150 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31  ]<<8) | (page1[1
14160 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28  7]<<16);.    if(
14170 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
14180 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20 20  ageSize)!=0.    
14190 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51 4c   || pageSize>SQL
141a0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
141b0 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53  E .     || pageS
141c0 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b  ize<=256 .    ){
141d0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
141e0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
141f0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
14200 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
14210 3d 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c 65  =0 );.    usable
14220 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20  Size = pageSize 
14230 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20  - page1[20];.   
14240 20 69 66 28 20 28 75 33 32 29 70 61 67 65 53 69   if( (u32)pageSi
14250 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ze!=pBt->pageSiz
14260 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66  e ){.      /* Af
14270 74 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20  ter reading the 
14280 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
14290 65 20 64 61 74 61 62 61 73 65 20 61 73 73 75 6d  e database assum
142a0 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a  ing a page size.
142b0 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68        ** of BtSh
142c0 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77  ared.pageSize, w
142d0 65 20 68 61 76 65 20 64 69 73 63 6f 76 65 72 65  e have discovere
142e0 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  d that the page-
142f0 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  size is.      **
14300 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69   actually pageSi
14310 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  ze. Unlock the d
14320 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70  atabase, leave p
14330 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20  Bt->pPage1 at.  
14340 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20      ** zero and 
14350 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14360 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
14370 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63  l call this func
14380 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67  tion.      ** ag
14390 61 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72  ain with the cor
143a0 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a  rect page-size..
143b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
143c0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
143d0 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75  1);.      pBt->u
143e0 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62  sableSize = usab
143f0 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42  leSize;.      pB
14400 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  t->pageSize = pa
14410 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72  geSize;.      fr
14420 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
14430 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
14440 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
14450 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
14460 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
14470 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14490 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73       pageSize-us
144a0 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  ableSize);.     
144b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
144c0 7d 0a 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e  }.    if( (pBt->
144d0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
144e0 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65 29  TE_RecoveryMode)
144f0 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61  ==0 && nPage>nPa
14500 67 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  geFile ){.      
14510 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
14520 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
14530 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
14540 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
14550 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65    if( usableSize
14560 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  <480 ){.      go
14570 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
14580 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
14590 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
145a0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42  pageSize;.    pB
145b0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
145c0 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e  usableSize;.#ifn
145d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
145e0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70  AUTOVACUUM.    p
145f0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
14600 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65   (get4byte(&page
14610 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  1[36 + 4*4])?1:0
14620 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  );.    pBt->incr
14630 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
14640 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37  te(&page1[36 + 7
14650 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
14660 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c  f.  }..  /* maxL
14670 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69  ocal is the maxi
14680 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
14690 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c  yload to store l
146a0 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20  ocally for.  ** 
146b0 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75  a cell.  Make su
146c0 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65  re it is small e
146d0 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74  nough so that at
146e0 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74   least minFanout
146f0 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20  .  ** cells can 
14700 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20  will fit on one 
14710 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65  page.  We assume
14720 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20   a 10-byte page 
14730 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73  header..  ** Bes
14740 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64  ides the payload
14750 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20  , the cell must 
14760 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20  store:.  **     
14770 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74  2-byte pointer t
14780 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20  o the cell.  ** 
14790 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64      4-byte child
147a0 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20   pointer.  **   
147b0 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61    9-byte nKey va
147c0 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  lue.  **     4-b
147d0 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a  yte nData value.
147e0 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
147f0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  overflow page po
14800 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20  inter.  ** So a 
14810 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
14820 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65   a 2-byte pointe
14830 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63  r, a header whic
14840 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a  h is as much as.
14850 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f    ** 17 bytes lo
14860 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73  ng, 0 to N bytes
14870 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64   of payload, and
14880 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62   an optional 4 b
14890 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a  yte overflow.  *
148a0 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a  * page pointer..
148b0 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c    */.  pBt->maxL
148c0 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42  ocal = (u16)((pB
148d0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
148e0 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a  )*64/255 - 23);.
148f0 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20    pBt->minLocal 
14900 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
14910 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f  ableSize-12)*32/
14920 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
14930 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36  ->maxLeaf = (u16
14940 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  )(pBt->usableSiz
14950 65 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e  e - 35);.  pBt->
14960 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28  minLeaf = (u16)(
14970 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
14980 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33  -12)*32/255 - 23
14990 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61  );.  if( pBt->ma
149a0 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20  xLocal>127 ){.  
149b0 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50    pBt->max1byteP
149c0 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20  ayload = 127;.  
149d0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e  }else{.    pBt->
149e0 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
149f0 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f  = (u8)pBt->maxLo
14a00 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  cal;.  }.  asser
14a10 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  t( pBt->maxLeaf 
14a20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f  + 23 <= MX_CELL_
14a30 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70  SIZE(pBt) );.  p
14a40 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61  Bt->pPage1 = pPa
14a50 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67  ge1;.  pBt->nPag
14a60 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74  e = nPage;.  ret
14a70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
14a80 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
14a90 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  d:.  releasePage
14aa0 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d  (pPage1);.  pBt-
14ab0 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72  >pPage1 = 0;.  r
14ac0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
14ad0 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a  ndef NDEBUG./*.*
14ae0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
14af0 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 6f  ber of cursors o
14b00 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69 73  pen on pBt. This
14b10 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69   is for use.** i
14b20 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65  n assert() expre
14b30 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73  ssions, so it is
14b40 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69   only compiled i
14b50 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a  f NDEBUG is not.
14b60 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a  ** defined..**.*
14b70 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72  * Only write cur
14b80 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64  sors are counted
14b90 20 69 66 20 77 72 4f 6e 6c 79 20 69 73 20 74 72   if wrOnly is tr
14ba0 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20 69  ue.  If wrOnly i
14bb0 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e 20  s.** false then 
14bc0 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20  all cursors are 
14bd0 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  counted..**.** F
14be0 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
14bf0 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  of this routine,
14c00 20 61 20 63 75 72 73 6f 72 20 69 73 20 61 6e 79   a cursor is any
14c10 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20   cursor that.** 
14c20 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20 72 65  is capable of re
14c30 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
14c40 20 74 6f 20 74 68 65 20 64 61 74 61 62 73 65 2e   to the databse.
14c50 20 20 43 75 72 73 6f 72 73 20 74 68 61 74 0a 2a    Cursors that.*
14c60 2a 20 68 61 76 65 20 62 65 65 6e 20 74 72 69 70  * have been trip
14c70 70 65 64 20 69 6e 74 6f 20 74 68 65 20 43 55 52  ped into the CUR
14c80 53 4f 52 5f 46 41 55 4c 54 20 73 74 61 74 65 20  SOR_FAULT state 
14c90 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e  are not counted.
14ca0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
14cb0 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73  ountValidCursors
14cc0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
14cd0 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42  int wrOnly){.  B
14ce0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
14cf0 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f   int r = 0;.  fo
14d00 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72  r(pCur=pBt->pCur
14d10 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d  sor; pCur; pCur=
14d20 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pCur->pNext){.  
14d30 20 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30    if( (wrOnly==0
14d40 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   || (pCur->curFl
14d50 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65  ags & BTCF_Write
14d60 46 6c 61 67 29 21 3d 30 29 0a 20 20 20 20 20 26  Flag)!=0).     &
14d70 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  & pCur->eState!=
14d80 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72  CURSOR_FAULT ) r
14d90 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  ++; .  }.  retur
14da0 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n r;.}.#endif../
14db0 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
14dc0 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
14dd0 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20   cursors and we 
14de0 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d  are not in the m
14df0 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72  iddle.** of a tr
14e00 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68  ansaction but th
14e10 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f  ere is a read lo
14e20 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
14e30 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  se, then.** this
14e40 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20   routine unrefs 
14e50 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
14e60 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
14e70 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61  ile which .** ha
14e80 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  s the effect of 
14e90 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65  releasing the re
14ea0 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ad lock..**.** I
14eb0 66 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61  f there is a tra
14ec0 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67  nsaction in prog
14ed0 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ress, this routi
14ee0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
14ef0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
14f00 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
14f10 64 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  d(BtShared *pBt)
14f20 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
14f30 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
14f40 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
14f50 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c  assert( countVal
14f60 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c 30 29  idCursors(pBt,0)
14f70 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  ==0 || pBt->inTr
14f80 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f  ansaction>TRANS_
14f90 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42  NONE );.  if( pB
14fa0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
14fb0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  ==TRANS_NONE && 
14fc0 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29  pBt->pPage1!=0 )
14fd0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  {.    assert( pB
14fe0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
14ff0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
15000 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
15010 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
15020 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )==1 );.    asse
15030 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  rt( pBt->pPage1-
15040 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 72 65  >aData );.    re
15050 6c 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70  leasePage(pBt->p
15060 50 61 67 65 31 29 3b 0a 20 20 20 20 70 42 74 2d  Page1);.    pBt-
15070 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 7d  >pPage1 = 0;.  }
15080 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74  .}../*.** If pBt
15090 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d   points to an em
150a0 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63 6f  pty file then co
150b0 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70 74 79  nvert that empty
150c0 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20   file.** into a 
150d0 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61 62 61  new empty databa
150e0 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  se by initializi
150f0 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ng the first pag
15100 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74 61  e of.** the data
15110 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
15120 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28  int newDatabase(
15130 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
15140 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a    MemPage *pP1;.
15150 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
15160 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b  *data;.  int rc;
15170 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
15180 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
15190 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
151a0 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30  if( pBt->nPage>0
151b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
151c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
151d0 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  pP1 = pBt->pPage
151e0 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31  1;.  assert( pP1
151f0 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20  !=0 );.  data = 
15200 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63  pP1->aData;.  rc
15210 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
15220 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67  rite(pP1->pDbPag
15230 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
15240 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63  eturn rc;.  memc
15250 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48  py(data, zMagicH
15260 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d  eader, sizeof(zM
15270 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20  agicHeader));.  
15280 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a  assert( sizeof(z
15290 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36  MagicHeader)==16
152a0 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d   );.  data[16] =
152b0 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65   (u8)((pBt->page
152c0 53 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a  Size>>8)&0xff);.
152d0 20 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75 38    data[17] = (u8
152e0 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )((pBt->pageSize
152f0 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20 64  >>16)&0xff);.  d
15300 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64  ata[18] = 1;.  d
15310 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61  ata[19] = 1;.  a
15320 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62  ssert( pBt->usab
15330 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67  leSize<=pBt->pag
15340 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73  eSize && pBt->us
15350 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42  ableSize+255>=pB
15360 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
15370 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28  data[20] = (u8)(
15380 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
15390 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
153a0 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36  ;.  data[21] = 6
153b0 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20  4;.  data[22] = 
153c0 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d  32;.  data[23] =
153d0 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64   32;.  memset(&d
153e0 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d  ata[24], 0, 100-
153f0 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28  24);.  zeroPage(
15400 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c  pP1, PTF_INTKEY|
15410 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41  PTF_LEAF|PTF_LEA
15420 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e  FDATA );.  pBt->
15430 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
15440 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a  PAGESIZE_FIXED;.
15450 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15460 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
15470 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
15480 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  toVacuum==1 || p
15490 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d  Bt->autoVacuum==
154a0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
154b0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
154c0 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61  1 || pBt->incrVa
154d0 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74  cuum==0 );.  put
154e0 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b  4byte(&data[36 +
154f0 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f   4*4], pBt->auto
15500 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62  Vacuum);.  put4b
15510 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37  yte(&data[36 + 7
15520 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61  *4], pBt->incrVa
15530 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20  cuum);.#endif.  
15540 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a  pBt->nPage = 1;.
15550 20 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a    data[31] = 1;.
15560 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15570 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  OK;.}../*.** Ini
15580 74 69 61 6c 69 7a 65 20 74 68 65 20 66 69 72 73  tialize the firs
15590 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
155a0 74 61 62 61 73 65 20 66 69 6c 65 20 28 63 72 65  tabase file (cre
155b0 61 74 69 6e 67 20 61 20 64 61 74 61 62 61 73 65  ating a database
155c0 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f  .** consisting o
155d0 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  f a single page 
155e0 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62  and no schema ob
155f0 6a 65 63 74 73 29 2e 20 52 65 74 75 72 6e 20 53  jects). Return S
15600 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73  QLITE_OK.** if s
15610 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
15620 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
15630 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  de otherwise..*/
15640 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
15650 65 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70 29  eNewDb(Btree *p)
15660 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
15670 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
15680 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50  p);.  p->pBt->nP
15690 61 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  age = 0;.  rc = 
156a0 6e 65 77 44 61 74 61 62 61 73 65 28 70 2d 3e 70  newDatabase(p->p
156b0 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt);.  sqlite3Bt
156c0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
156d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
156e0 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74  ** Attempt to st
156f0 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61  art a new transa
15700 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74  ction. A write-t
15710 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
15720 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20   started if the 
15730 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
15740 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65  is nonzero, othe
15750 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a  rwise a read-.**
15760 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49   transaction.  I
15770 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
15780 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f  ument is 2 or mo
15790 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  re and exclusive
157a0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
157b0 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e  is started, mean
157c0 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  ing that no othe
157d0 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c  r process is all
157e0 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73  owed.** to acces
157f0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  s the database. 
15800 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74   A preexisting t
15810 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e  ransaction may n
15820 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65  ot be.** upgrade
15830 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  d to exclusive b
15840 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  y calling this r
15850 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20  outine a second 
15860 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78  time - the.** ex
15870 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f  clusivity flag o
15880 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20  nly works for a 
15890 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
158a0 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  .**.** A write-t
158b0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
158c0 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72  be started befor
158d0 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79  e attempting any
158e0 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20   .** changes to 
158f0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e  the database.  N
15900 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
15910 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a  wing routines .*
15920 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65  * will work unle
15930 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ss a transaction
15940 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73   is started firs
15950 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71  t:.**.**      sq
15960 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
15970 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
15980 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
15990 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20  teIndex().**    
159a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
159b0 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  earTable().**   
159c0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44     sqlite3BtreeD
159d0 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  ropTable().**   
159e0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49     sqlite3BtreeI
159f0 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20  nsert().**      
15a00 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65  sqlite3BtreeDele
15a10 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  te().**      sql
15a20 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d  ite3BtreeUpdateM
15a30 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61  eta().**.** If a
15a40 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70  n initial attemp
15a50 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65  t to acquire the
15a60 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61   lock fails beca
15a70 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74  use of lock cont
15a80 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68  ention.** and th
15a90 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70  e database was p
15aa0 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b  reviously unlock
15ab0 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20  ed, then invoke 
15ac0 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
15ad0 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
15ae0 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65  one.  But if the
15af0 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  re was previousl
15b00 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64  y a read-lock, d
15b10 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20  o not.** invoke 
15b20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
15b30 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53   - just return S
15b40 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c  QLITE_BUSY.  SQL
15b50 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20  ITE_BUSY is .** 
15b60 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68  returned when th
15b70 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
15b80 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72   read-lock in or
15b90 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64  der to avoid a d
15ba0 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  eadlock..**.** S
15bb0 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65  uppose there are
15bc0 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41   two processes A
15bd0 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61   and B.  A has a
15be0 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42   read lock and B
15bf0 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76   has.** a reserv
15c00 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65  ed lock.  B trie
15c10 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20  s to promote to 
15c20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73  exclusive but is
15c30 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65   blocked because
15c40 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20  .** of A's read 
15c50 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74  lock.  A tries t
15c60 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73  o promote to res
15c70 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f  erved but is blo
15c80 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e  cked by B..** On
15c90 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  e or the other o
15ca0 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73  f the two proces
15cb0 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61  ses must give wa
15cc0 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62  y or there can b
15cd0 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73  e.** no progress
15ce0 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20  .  By returning 
15cf0 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20  SQLITE_BUSY and 
15d00 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  not invoking the
15d10 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a   busy callback.*
15d20 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79  * when A already
15d30 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
15d40 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41  , we encourage A
15d50 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20   to give up and 
15d60 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64  let B.** proceed
15d70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15d80 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28  BtreeBeginTrans(
15d90 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72  Btree *p, int wr
15da0 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  flag){.  sqlite3
15db0 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20   *pBlock = 0;.  
15dc0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
15dd0 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
15de0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
15df0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
15e00 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e  er(p);.  btreeIn
15e10 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f  tegrity(p);..  /
15e20 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69  * If the btree i
15e30 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77  s already in a w
15e40 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
15e50 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20  , or it.  ** is 
15e60 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61  already in a rea
15e70 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  d-transaction an
15e80 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  d a read-transac
15e90 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71  tion.  ** is req
15ea0 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20  uested, this is 
15eb0 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
15ec0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
15ed0 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28  TRANS_WRITE || (
15ee0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
15ef0 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61  S_READ && !wrfla
15f00 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  g) ){.    goto t
15f10 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
15f20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
15f30 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
15f40 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e  ANS_WRITE || IfN
15f50 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44  otOmitAV(pBt->bD
15f60 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b  oTruncate)==0 );
15f70 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61  ..  /* Write tra
15f80 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f  nsactions are no
15f90 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20  t possible on a 
15fa0 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61  read-only databa
15fb0 73 65 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74  se */.  if( (pBt
15fc0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
15fd0 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26  _READ_ONLY)!=0 &
15fe0 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
15ff0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
16000 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74  ONLY;.    goto t
16010 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
16020 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16030 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
16040 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65  E.  /* If anothe
16050 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  r database handl
16060 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70  e has already op
16070 65 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61  ened a write tra
16080 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f  nsaction .  ** o
16090 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74  n this shared-bt
160a0 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ree structure an
160b0 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65  d a second write
160c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
160d0 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20    ** requested, 
160e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
160f0 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  CKED..  */.  if(
16100 20 28 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d   (wrflag && pBt-
16110 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
16120 54 52 41 4e 53 5f 57 52 49 54 45 29 0a 20 20 20  TRANS_WRITE).   
16130 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  || (pBt->btsFlag
16140 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29  s & BTS_PENDING)
16150 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 42 6c  !=0.  ){.    pBl
16160 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74  ock = pBt->pWrit
16170 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 20  er->db;.  }else 
16180 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a  if( wrflag>1 ){.
16190 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65      BtLock *pIte
161a0 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72  r;.    for(pIter
161b0 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74  =pBt->pLock; pIt
161c0 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d  er; pIter=pIter-
161d0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
161e0 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  f( pIter->pBtree
161f0 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=p ){.        p
16200 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70  Block = pIter->p
16210 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20  Btree->db;.     
16220 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
16230 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
16240 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20  ( pBlock ){.    
16250 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
16260 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20  nBlocked(p->db, 
16270 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20  pBlock);.    rc 
16280 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f  = SQLITE_LOCKED_
16290 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20  SHAREDCACHE;.   
162a0 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
162b0 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
162c0 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c   /* Any read-onl
162d0 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20  y or read-write 
162e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c  transaction impl
162f0 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ies a read-lock 
16300 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e  on .  ** page 1.
16310 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65   So if some othe
16320 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63  r shared-cache c
16330 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61  lient already ha
16340 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a  s a write-lock .
16350 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20    ** on page 1, 
16360 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
16370 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64  cannot be opened
16380 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72  . */.  rc = quer
16390 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
163a0 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f  eLock(p, MASTER_
163b0 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29  ROOT, READ_LOCK)
163c0 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
163d0 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61  K!=rc ) goto tra
163e0 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74  ns_begun;..  pBt
163f0 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
16400 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
16410 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  TY;.  if( pBt->n
16420 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62  Page==0 ) pBt->b
16430 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49  tsFlags |= BTS_I
16440 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a  NITIALLY_EMPTY;.
16450 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61    do {.    /* Ca
16460 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75  ll lockBtree() u
16470 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d  ntil either pBt-
16480 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c  >pPage1 is popul
16490 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c  ated or.    ** l
164a0 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72  ockBtree() retur
164b0 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  ns something oth
164c0 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
164d0 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20  K. lockBtree(). 
164e0 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e     ** may return
164f0 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c   SQLITE_OK but l
16500 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
16510 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74   set to 0 if aft
16520 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  er.    ** readin
16530 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63  g page 1 it disc
16540 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70  overs that the p
16550 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
16560 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a  database .    **
16570 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74   file is not pBt
16580 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74  ->pageSize. In t
16590 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72  his case lockBtr
165a0 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65  ee() will update
165b0 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67  .    ** pBt->pag
165c0 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67  eSize to the pag
165d0 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e-size of the fi
165e0 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20  le on disk..    
165f0 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42  */.    while( pB
16600 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20  t->pPage1==0 && 
16610 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
16620 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29   lockBtree(pBt))
16630 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   );..    if( rc=
16640 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
16650 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66  flag ){.      if
16660 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
16670 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
16680 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
16690 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
166a0 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ONLY;.      }els
166b0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
166c0 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
166d0 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72  n(pBt->pPager,wr
166e0 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65  flag>1,sqlite3Te
166f0 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62  mpInMemory(p->db
16700 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
16710 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16720 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
16730 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
16740 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16750 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
16760 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16770 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f  OK ){.      unlo
16780 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
16790 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  pBt);.    }.  }w
167a0 68 69 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d  hile( (rc&0xFF)=
167b0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
167c0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
167d0 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
167e0 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65  &.          btre
167f0 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
16800 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66  er(pBt) );..  if
16810 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16820 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  ){.    if( p->in
16830 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
16840 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  E ){.      pBt->
16850 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a  nTransaction++;.
16860 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16870 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
16880 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68  .      if( p->sh
16890 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
168a0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
168b0 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70  k.pBtree==p && p
168c0 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31  ->lock.iTable==1
168d0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c   );.        p->l
168e0 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44  ock.eLock = READ
168f0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70  _LOCK;.        p
16900 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70  ->lock.pNext = p
16910 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20  Bt->pLock;.     
16920 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20     pBt->pLock = 
16930 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  &p->lock;.      
16940 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
16950 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
16960 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52  (wrflag?TRANS_WR
16970 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b  ITE:TRANS_READ);
16980 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
16990 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  ans>pBt->inTrans
169a0 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
169b0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
169c0 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b  on = p->inTrans;
169d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77  .    }.    if( w
169e0 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d  rflag ){.      M
169f0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
16a00 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69   pBt->pPage1;.#i
16a10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16a20 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
16a30 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42       assert( !pB
16a40 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
16a50 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
16a60 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d   = p;.      pBt-
16a70 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
16a80 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  S_EXCLUSIVE;.   
16a90 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20     if( wrflag>1 
16aa0 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
16ab0 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45  |= BTS_EXCLUSIVE
16ac0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  ;.#endif..      
16ad0 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a  /* If the db-siz
16ae0 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 69  e header field i
16af0 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20  s incorrect (as 
16b00 69 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20  it may be if an 
16b10 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69  old.      ** cli
16b20 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72 69  ent has been wri
16b30 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
16b40 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20  e file), update 
16b50 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20  it now. Doing.  
16b60 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e      ** this soon
16b70 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c  er rather than l
16b80 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64  ater means the d
16b90 61 74 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e  atabase size can
16ba0 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a   safely .      *
16bb0 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20 64 61  * re-read the da
16bc0 74 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d  tabase size from
16bd0 20 70 61 67 65 20 31 20 69 66 20 61 20 73 61 76   page 1 if a sav
16be0 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61  epoint or transa
16bf0 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72  ction.      ** r
16c00 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77  ollback occurs w
16c10 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61  ithin the transa
16c20 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
16c30 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
16c40 50 61 67 65 21 3d 67 65 74 34 62 79 74 65 28 26  Page!=get4byte(&
16c50 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
16c60 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ]) ){.        rc
16c70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
16c80 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
16c90 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
16ca0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16cb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
16cc0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
16cd0 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e  aData[28], pBt->
16ce0 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  nPage);.        
16cf0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
16d00 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75    }...trans_begu
16d10 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  n:.  if( rc==SQL
16d20 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
16d30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
16d40 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20  call makes sure 
16d50 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68  that the pager h
16d60 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e  as the correct n
16d70 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  umber of.    ** 
16d80 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
16d90 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70   If the second p
16da0 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61  arameter is grea
16db0 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20  ter than 0 and. 
16dc0 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f     ** the sub-jo
16dd0 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72  urnal is not alr
16de0 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20  eady open, then 
16df0 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  it will be opene
16e00 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  d here..    */. 
16e10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
16e20 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
16e30 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  t(pBt->pPager, p
16e40 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
16e50 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49  );.  }..  btreeI
16e60 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
16e70 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
16e80 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
16e90 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
16ea0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
16eb0 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  UUM../*.** Set t
16ec0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
16ed0 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63  ntries for all c
16ee0 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20  hildren of page 
16ef0 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a  pPage. Also, if.
16f00 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ** pPage contain
16f10 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69  s cells that poi
16f20 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
16f30 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f  ages, set the po
16f40 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74  inter.** map ent
16f50 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65  ries for the ove
16f60 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77  rflow pages as w
16f70 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
16f80 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  nt setChildPtrma
16f90 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ps(MemPage *pPag
16fa0 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
16fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fc0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e           /* Coun
16fd0 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  ter variable */.
16fe0 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
16ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17000 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
17010 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20  f cells in page 
17020 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72  pPage */.  int r
17030 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
17040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17050 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
17060 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
17070 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
17080 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20  u8 isInitOrig = 
17090 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20  pPage->isInit;. 
170a0 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61   Pgno pgno = pPa
170b0 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73  ge->pgno;..  ass
170c0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
170d0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
170e0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
170f0 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
17100 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28  ge(pPage);.  if(
17110 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17120 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63  {.    goto set_c
17130 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
17140 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20  ;.  }.  nCell = 
17150 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
17160 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
17170 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
17180 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
17190 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20  l(pPage, i);..  
171a0 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50    ptrmapPutOvflP
171b0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
171c0 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20   &rc);..    if( 
171d0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
171e0 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
171f0 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
17200 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74  pCell);.      pt
17210 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
17220 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
17230 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29  TREE, pgno, &rc)
17240 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
17250 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
17260 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  ){.    Pgno chil
17270 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
17280 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
17290 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
172a0 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50  8]);.    ptrmapP
172b0 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
172c0 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
172d0 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d   pgno, &rc);.  }
172e0 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  ..set_child_ptrm
172f0 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65  aps_out:.  pPage
17300 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69  ->isInit = isIni
17310 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20  tOrig;.  return 
17320 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  rc;.}../*.** Som
17330 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20  ewhere on pPage 
17340 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
17350 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64  page iFrom.  Mod
17360 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72  ify this pointer
17370 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70   so.** that it p
17380 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61  oints to iTo. Pa
17390 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65  rameter eType de
173a0 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65  scribes the type
173b0 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a   of pointer to.*
173c0 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61  * be modified, a
173d0 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  s  follows:.**.*
173e0 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20  * PTRMAP_BTREE: 
173f0 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62      pPage is a b
17400 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
17410 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
17420 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20   a child .**    
17430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
17440 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a  age of pPage..**
17450 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
17460 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61  LOW1: pPage is a
17470 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
17480 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
17490 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a  at an overflow.*
174a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
174b0 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64      page pointed
174c0 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68   to by one of th
174d0 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65  e cells on pPage
174e0 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
174f0 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20  VERFLOW2: pPage 
17500 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70  is an overflow-p
17510 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
17520 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e   points at the n
17530 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ext.**          
17540 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f           overflo
17550 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
17560 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
17570 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  t modifyPagePoin
17580 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ter(MemPage *pPa
17590 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20  ge, Pgno iFrom, 
175a0 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79  Pgno iTo, u8 eTy
175b0 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  pe){.  assert( s
175c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
175d0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
175e0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
175f0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
17600 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
17610 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
17620 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
17630 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20  _OVERFLOW2 ){.  
17640 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
17650 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66   is always the f
17660 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20  irst 4 bytes of 
17670 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
17680 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69   case.  */.    i
17690 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67  f( get4byte(pPag
176a0 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d  e->aData)!=iFrom
176b0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
176c0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
176d0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
176e0 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
176f0 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d  aData, iTo);.  }
17700 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49  else{.    u8 isI
17710 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d  nitOrig = pPage-
17720 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74  >isInit;.    int
17730 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c   i;.    int nCel
17740 6c 3b 0a 0a 20 20 20 20 62 74 72 65 65 49 6e 69  l;..    btreeIni
17750 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
17760 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
17770 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72  >nCell;..    for
17780 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
17790 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70  ++){.      u8 *p
177a0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
177b0 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20  pPage, i);.     
177c0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
177d0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a  AP_OVERFLOW1 ){.
177e0 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f          CellInfo
177f0 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 62   info;.        b
17800 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
17810 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
17820 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  info);.        i
17830 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
17840 77 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 43  w.         && pC
17850 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell+info.iOverfl
17860 6f 77 2b 33 3c 3d 70 50 61 67 65 2d 3e 61 44 61  ow+3<=pPage->aDa
17870 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  ta+pPage->maskPa
17880 67 65 0a 20 20 20 20 20 20 20 20 20 26 26 20 69  ge.         && i
17890 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26  From==get4byte(&
178a0 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
178b0 66 6c 6f 77 5d 29 0a 20 20 20 20 20 20 20 20 29  flow]).        )
178c0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
178d0 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
178e0 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f  .iOverflow], iTo
178f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
17900 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
17910 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17920 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
17930 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b  pCell)==iFrom ){
17940 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
17950 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b  yte(pCell, iTo);
17960 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
17970 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
17980 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
17990 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b   if( i==nCell ){
179a0 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
179b0 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  !=PTRMAP_BTREE |
179c0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74  | .          get
179d0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
179e0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
179f0 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20  fset+8])!=iFrom 
17a00 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
17a10 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
17a20 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
17a30 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
17a40 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
17a50 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  e->hdrOffset+8],
17a60 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   iTo);.    }..  
17a70 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
17a80 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20  = isInitOrig;.  
17a90 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
17aa0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
17ab0 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61  Move the open da
17ac0 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
17ad0 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  age to location 
17ae0 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65  iFreePage in the
17af0 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54   .** database. T
17b00 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72  he pDbPage refer
17b10 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c  ence remains val
17b20 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73  id..**.** The is
17b30 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69  Commit flag indi
17b40 63 61 74 65 73 20 74 68 61 74 20 74 68 65 72 65  cates that there
17b50 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72   is no need to r
17b60 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20  emember that.** 
17b70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64  the journal need
17b80 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64  s to be sync()ed
17b90 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65   before database
17ba0 20 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70   page pDbPage->p
17bb0 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77  gno .** can be w
17bc0 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63  ritten to. The c
17bd0 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
17be0 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74  y promised not t
17bf0 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a  o write to that.
17c00 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ** page..*/.stat
17c10 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50  ic int relocateP
17c20 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
17c30 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
17c40 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65  /* Btree */.  Me
17c50 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  mPage *pDbPage, 
17c60 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70         /* Open p
17c70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20  age to move */. 
17c80 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20   u8 eType,      
17c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
17ca0 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20  nter map 'type' 
17cb0 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
17cc0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  e */.  Pgno iPtr
17cd0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
17ce0 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
17cf0 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66  page-no' entry f
17d00 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
17d10 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20  Pgno iFreePage, 
17d20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17d30 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65  location to move
17d40 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20   pDbPage to */. 
17d50 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20   int isCommit   
17d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43            /* isC
17d70 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65  ommit flag passe
17d80 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  d to sqlite3Page
17d90 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a  rMovepage */.){.
17da0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50    MemPage *pPtrP
17db0 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61  age;   /* The pa
17dc0 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
17dd0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44   a pointer to pD
17de0 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
17df0 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  iDbPage = pDbPag
17e00 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72  e->pgno;.  Pager
17e10 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
17e20 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
17e30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  ;..  assert( eTy
17e40 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
17e50 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50  LOW2 || eType==P
17e60 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
17e70 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d  || .      eType=
17e80 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
17e90 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
17ea0 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73  OOTPAGE );.  ass
17eb0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
17ec0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
17ed0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
17ee0 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70   pDbPage->pBt==p
17ef0 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65  Bt );..  /* Move
17f00 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72   page iDbPage fr
17f10 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c  om its current l
17f20 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20  ocation to page 
17f30 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65  number iFreePage
17f40 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55   */.  TRACE(("AU
17f50 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67  TOVACUUM: Moving
17f60 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65   %d to free page
17f70 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64   %d (ptr page %d
17f80 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20   type %d)\n", . 
17f90 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46       iDbPage, iF
17fa0 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67  reePage, iPtrPag
17fb0 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63  e, eType));.  rc
17fc0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
17fd0 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20  ovepage(pPager, 
17fe0 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65  pDbPage->pDbPage
17ff0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43  , iFreePage, isC
18000 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63  ommit);.  if( rc
18010 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18020 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
18030 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  }.  pDbPage->pgn
18040 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a  o = iFreePage;..
18050 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20    /* If pDbPage 
18060 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65  was a btree-page
18070 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61  , then it may ha
18080 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61  ve child pages a
18090 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  nd/or cells.  **
180a0 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
180b0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54  verflow pages. T
180c0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
180d0 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74  ntries for all t
180e0 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20  hese.  ** pages 
180f0 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67  need to be chang
18100 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ed..  **.  ** If
18110 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f   pDbPage is an o
18120 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
18130 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62  en the first 4 b
18140 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61  ytes may store a
18150 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f  .  ** pointer to
18160 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76   a subsequent ov
18170 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
18180 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
18190 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  , then.  ** the 
181a0 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64  pointer map need
181b0 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  s to be updated 
181c0 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65  for the subseque
181d0 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
181e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
181f0 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
18200 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
18210 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
18220 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50    rc = setChildP
18230 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b  trmaps(pDbPage);
18240 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
18250 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18260 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
18270 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67  .  }else{.    Pg
18280 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65  no nextOvfl = ge
18290 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e  t4byte(pDbPage->
182a0 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  aData);.    if( 
182b0 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20  nextOvfl!=0 ){. 
182c0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
182d0 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54  Bt, nextOvfl, PT
182e0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20  RMAP_OVERFLOW2, 
182f0 69 46 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b  iFreePage, &rc);
18300 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
18310 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18320 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
18330 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
18340 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64  ..  /* Fix the d
18350 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20  atabase pointer 
18360 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65  on page iPtrPage
18370 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74   that pointed at
18380 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a   iDbPage so.  **
18390 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
183a0 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c  at iFreePage. Al
183b0 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74  so fix the point
183c0 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
183d0 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a  .  ** iPtrPage..
183e0 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
183f0 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  !=PTRMAP_ROOTPAG
18400 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  E ){.    rc = bt
18410 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
18420 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50  iPtrPage, &pPtrP
18430 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
18440 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18450 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
18460 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
18470 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
18480 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44  ite(pPtrPage->pD
18490 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
184a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
184b0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
184c0 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
184d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
184e0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
184f0 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
18500 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67  pPtrPage, iDbPag
18510 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  e, iFreePage, eT
18520 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ype);.    releas
18530 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
18540 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
18550 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18560 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
18570 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c  FreePage, eType,
18580 20 69 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b   iPtrPage, &rc);
18590 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
185a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
185b0 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
185c0 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e  n required by in
185d0 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20  crVacuumStep(). 
185e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
185f0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
18600 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50  BtShared *, MemP
18610 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20  age **, Pgno *, 
18620 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a  Pgno, u8);../*.*
18630 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67  * Perform a sing
18640 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e  le step of an in
18650 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
18660 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
18670 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   return.** SQLIT
18680 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69  E_OK. If there i
18690 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20  s no work to do 
186a0 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e  (and therefore n
186b0 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63  o point in .** c
186c0 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
186d0 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74  tion again), ret
186e0 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
186f0 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72   Or, if an error
18700 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74   .** occurs, ret
18710 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65  urn some other e
18720 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rror code..**.**
18730 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79   More specificly
18740 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
18750 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f  attempts to re-o
18760 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74 61  rganize the data
18770 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74  base so .** that
18780 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f   the last page o
18790 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65  f the file curre
187a0 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20 6e  ntly in use is n
187b0 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e  o longer in use.
187c0 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
187d0 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75 6d   nFin is the num
187e0 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61  ber of pages tha
187f0 74 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  t this database 
18800 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a  would contain.**
18810 20 77 65 72 65 20 74 68 69 73 20 66 75 6e 63 74   were this funct
18820 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c  ion called until
18830 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
18840 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49  TE_DONE..**.** I
18850 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70 61  f the bCommit pa
18860 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
18870 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ero, this functi
18880 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
18890 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77  the .** caller w
188a0 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67  ill keep calling
188b0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
188c0 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72  ) until it retur
188d0 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a  ns SQLITE_DONE .
188e0 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20  ** or an error. 
188f0 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73 65  bCommit is passe
18900 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61 75  d true for an au
18910 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d  to-vacuum-on-com
18920 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69  mmit .** operati
18930 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f 72  on, or false for
18940 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
18950 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69  vacuum..*/.stati
18960 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d  c int incrVacuum
18970 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70  Step(BtShared *p
18980 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50  Bt, Pgno nFin, P
18990 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e 74  gno iLastPg, int
189a0 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e   bCommit){.  Pgn
189b0 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20  o nFreeList;    
189c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
189d0 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20   of pages still 
189e0 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
189f0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
18a00 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
18a10 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
18a20 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
18a30 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69  ert( iLastPg>nFi
18a40 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52  n );..  if( !PTR
18a50 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
18a60 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73  iLastPg) && iLas
18a70 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg!=PENDING_BYT
18a80 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
18a90 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
18aa0 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
18ab0 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d  .    nFreeList =
18ac0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
18ad0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
18ae0 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65  ]);.    if( nFre
18af0 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eList==0 ){.    
18b00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18b10 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
18b20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
18b30 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65  pBt, iLastPg, &e
18b40 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
18b50 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
18b60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18b70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18b80 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  }.    if( eType=
18b90 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
18ba0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
18bb0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
18bc0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
18bd0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
18be0 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
18bf0 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74       if( bCommit
18c00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
18c10 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67  * Remove the pag
18c20 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73  e from the files
18c30 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
18c40 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
18c50 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 62  .        ** if b
18c60 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65  Commit is non-ze
18c70 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ro. In that case
18c80 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  , the free-list 
18c90 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
18ca0 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  ** truncated to 
18cb0 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20  zero after this 
18cc0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
18cd0 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20  , so it doesn't 
18ce0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74  .        ** matt
18cf0 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63  er if it still c
18d00 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72  ontains some gar
18d10 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20  bage entries..  
18d20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
18d30 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20   Pgno iFreePg;. 
18d40 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
18d50 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
18d60 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
18d70 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
18d80 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
18d90 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f   iLastPg, BTALLO
18da0 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20  C_EXACT);.      
18db0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18dc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
18dd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18de0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
18df0 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69  sert( iFreePg==i
18e00 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
18e10 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
18e20 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  reePg);.      }.
18e30 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
18e40 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
18e50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18e60 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61  Index of free pa
18e70 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74  ge to move pLast
18e80 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d  Pg to */.      M
18e90 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b  emPage *pLastPg;
18ea0 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65 20  .      u8 eMode 
18eb0 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20  = BTALLOC_ANY;  
18ec0 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65 74   /* Mode paramet
18ed0 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42  er for allocateB
18ee0 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20 20  treePage() */.  
18ef0 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d      Pgno iNear =
18f00 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
18f10 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74 65   nearby paramete
18f20 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74  r for allocateBt
18f30 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20  reePage() */..  
18f40 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
18f50 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74  tPage(pBt, iLast
18f60 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29  Pg, &pLastPg, 0)
18f70 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
18f80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18f90 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
18fa0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
18fb0 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  * If bCommit is 
18fc0 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20  zero, this loop 
18fd0 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63  runs exactly onc
18fe0 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74  e and page pLast
18ff0 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  Pg.      ** is s
19000 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20  wapped with the 
19010 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  first free page 
19020 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66  pulled off the f
19030 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  ree list..      
19040 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74  **.      ** On t
19050 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
19060 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72 65  f bCommit is gre
19070 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
19080 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20  then keep.      
19090 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ** looping until
190a0 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63   a free-page loc
190b0 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ated within the 
190c0 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73  first nFin pages
190d0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
190e0 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a   file is found..
190f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
19100 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  f( bCommit==0 ){
19110 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d  .        eMode =
19120 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20   BTALLOC_LE;.   
19130 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69       iNear = nFi
19140 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
19150 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65   do {.        Me
19160 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
19170 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
19180 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
19190 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
191a0 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20 65  FreePg, iNear, e
191b0 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Mode);.        i
191c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
191d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
191e0 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
191f0 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  g);.          re
19200 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
19210 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61   }.        relea
19220 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
19230 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 62  .      }while( b
19240 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65 50  Commit && iFreeP
19250 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20  g>nFin );.      
19260 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c  assert( iFreePg<
19270 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
19280 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c   .      rc = rel
19290 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
192a0 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69  LastPg, eType, i
192b0 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67  PtrPage, iFreePg
192c0 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20  , bCommit);.    
192d0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
192e0 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66  astPg);.      if
192f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19300 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
19310 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
19320 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62    }.  }..  if( b
19330 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
19340 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61 73   do {.      iLas
19350 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c  tPg--;.    }whil
19360 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44  e( iLastPg==PEND
19370 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
19380 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50  t) || PTRMAP_ISP
19390 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
193a0 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44  ) );.    pBt->bD
193b0 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20  oTruncate = 1;. 
193c0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
193d0 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72  iLastPg;.  }.  r
193e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
193f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61  .}../*.** The da
19400 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79  tabase opened by
19410 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
19420 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  ent is an auto-v
19430 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a 2a  acuum database.*
19440 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69 6e  * nOrig pages in
19450 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67   size containing
19460 20 6e 46 72 65 65 20 66 72 65 65 20 70 61 67 65   nFree free page
19470 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65 78  s. Return the ex
19480 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20  pected .** size 
19490 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
194a0 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69  in pages followi
194b0 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  ng an auto-vacuu
194c0 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  m operation..*/.
194d0 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e 61  static Pgno fina
194e0 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72 65 64  lDbSize(BtShared
194f0 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69   *pBt, Pgno nOri
19500 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a  g, Pgno nFree){.
19510 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20    int nEntry;   
19520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19530 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
19540 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74  ntries on one pt
19550 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50  rmap page */.  P
19560 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20  gno nPtrmap;    
19570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19580 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d  * Number of PtrM
19590 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20 66  ap pages to be f
195a0 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  reed */.  Pgno n
195b0 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  Fin;            
195c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
195d0 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
195e0 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73  nEntry = pBt->us
195f0 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50  ableSize/5;.  nP
19600 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e  trmap = (nFree-n
19610 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45  Orig+PTRMAP_PAGE
19620 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e  NO(pBt, nOrig)+n
19630 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20  Entry)/nEntry;. 
19640 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20   nFin = nOrig - 
19650 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b  nFree - nPtrmap;
19660 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e  .  if( nOrig>PEN
19670 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
19680 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44  Bt) && nFin<PEND
19690 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
196a0 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d  t) ){.    nFin--
196b0 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50  ;.  }.  while( P
196c0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
196d0 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d  , nFin) || nFin=
196e0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
196f0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e  GE(pBt) ){.    n
19700 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65  Fin--;.  }..  re
19710 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a  turn nFin;.}../*
19720 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
19730 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
19740 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61  opened before ca
19750 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
19760 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f  ion..** It perfo
19770 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69  rms a single uni
19780 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64  t of work toward
19790 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s an incremental
197a0 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49   vacuum..**.** I
197b0 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
197c0 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69  l vacuum is fini
197d0 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20  shed after this 
197e0 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e  function has run
197f0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ,.** SQLITE_DONE
19800 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
19810 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73   it is not finis
19820 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  hed, but no erro
19830 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53  r occurred,.** S
19840 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
19850 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
19860 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
19870 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  code. .*/.int sq
19880 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61  lite3BtreeIncrVa
19890 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
198a0 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
198b0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
198c0 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
198d0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
198e0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
198f0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
19900 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54  _WRITE && p->inT
19910 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
19920 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  E );.  if( !pBt-
19930 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
19940 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
19950 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ONE;.  }else{.  
19960 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62    Pgno nOrig = b
19970 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
19980 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72  t);.    Pgno nFr
19990 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
199a0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
199b0 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f  a[36]);.    Pgno
199c0 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53   nFin = finalDbS
199d0 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20  ize(pBt, nOrig, 
199e0 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66 28  nFree);..    if(
199f0 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20   nOrig<nFin ){. 
19a00 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
19a10 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
19a20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72     }else if( nFr
19a30 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
19a40 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
19a50 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
19a60 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19a70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19a80 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
19a90 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
19aa0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 69  ;.        rc = i
19ab0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
19ac0 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20  t, nFin, nOrig, 
19ad0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
19ae0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19af0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
19b00 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
19b10 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
19b20 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
19b30 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
19b40 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
19b50 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67  a[28], pBt->nPag
19b60 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
19b70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
19b80 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
19b90 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
19ba0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
19bb0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19bc0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
19bd0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72  ine is called pr
19be0 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61  ior to sqlite3Pa
19bf0 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61  gerCommit when a
19c00 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
19c10 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72  is committed for
19c20 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
19c30 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
19c40 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
19c50 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a  returned, then *
19c60 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74  pnTrunc is set t
19c70 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
19c80 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74  pages.** the dat
19c90 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
19ca0 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  d be truncated t
19cb0 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d  o during the com
19cc0 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a  mit process. .**
19cd0 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61   i.e. the databa
19ce0 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72  se has been reor
19cf0 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20  ganized so that 
19d00 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a  only the first *
19d10 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73  pnTrunc.** pages
19d20 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a   are in use..*/.
19d30 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56  static int autoV
19d40 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68  acuumCommit(BtSh
19d50 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
19d60 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
19d70 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
19d80 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
19d90 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74  .  VVA_ONLY( int
19da0 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50   nRef = sqlite3P
19db0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
19dc0 67 65 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72  ger) );..  asser
19dd0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
19de0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
19df0 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74  ) );.  invalidat
19e00 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
19e10 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74  e(pBt);.  assert
19e20 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
19e30 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69  );.  if( !pBt->i
19e40 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  ncrVacuum ){.   
19e50 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20   Pgno nFin;     
19e60 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
19e70 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
19e80 73 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63  se after autovac
19e90 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67  uuming */.    Pg
19ea0 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  no nFree;       
19eb0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
19ec0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
19ed0 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f  ist initially */
19ee0 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b  .    Pgno iFree;
19ef0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
19f00 65 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66  ext page to be f
19f10 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  reed */.    Pgno
19f20 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f   nOrig;        /
19f30 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20  * Database size 
19f40 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a  before freeing *
19f50 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62  /..    nOrig = b
19f60 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
19f70 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d  t);.    if( PTRM
19f80 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
19f90 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d  Orig) || nOrig==
19fa0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
19fb0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
19fc0 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
19fd0 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  sible to create 
19fe0 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77  a database for w
19ff0 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70  hich the final p
1a000 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
1a010 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72  either a pointer
1a020 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65  -map page or the
1a030 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61   pending-byte pa
1a040 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20  ge. If one.     
1a050 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   ** is encounter
1a060 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ed, this indicat
1a070 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  es corruption.. 
1a080 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
1a090 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1a0a0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
1a0b0 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74  .    nFree = get
1a0c0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1a0d0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1a0e0 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c      nFin = final
1a0f0 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69  DbSize(pBt, nOri
1a100 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69  g, nFree);.    i
1a110 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20  f( nFin>nOrig ) 
1a120 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1a130 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1a140 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29  if( nFin<nOrig )
1a150 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76  {.      rc = sav
1a160 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
1a170 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
1a180 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69    for(iFree=nOri
1a190 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26  g; iFree>nFin &&
1a1a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
1a1b0 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20  iFree--){.      
1a1c0 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
1a1d0 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69  tep(pBt, nFin, i
1a1e0 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  Free, 1);.    }.
1a1f0 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c      if( (rc==SQL
1a200 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d  ITE_DONE || rc==
1a210 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46  SQLITE_OK) && nF
1a220 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  ree>0 ){.      r
1a230 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1a240 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
1a250 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
1a260 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
1a270 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1a280 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  32], 0);.      p
1a290 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
1a2a0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
1a2b0 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
1a2c0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1a2d0 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69  ->aData[28], nFi
1a2e0 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62  n);.      pBt->b
1a2f0 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a  DoTruncate = 1;.
1a300 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
1a310 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20   = nFin;.    }. 
1a320 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1a330 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
1a340 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
1a350 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
1a360 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
1a370 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50 61   nRef>=sqlite3Pa
1a380 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
1a390 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
1a3a0 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  rc;.}..#else /* 
1a3b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a3c0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
1a3d0 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69  .# define setChi
1a3e0 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c  ldPtrmaps(x) SQL
1a3f0 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f  ITE_OK.#endif../
1a400 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1a410 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
1a420 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d   phase of a two-
1a430 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
1a440 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63  his routine.** c
1a450 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b  auses a rollback
1a460 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63   journal to be c
1a470 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f  reated (if it do
1a480 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
1a490 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70  xist).** and pop
1a4a0 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75  ulated with enou
1a4b0 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73  gh information s
1a4c0 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  o that if a powe
1a4d0 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a  r loss occurs.**
1a4e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
1a4f0 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  n be restored to
1a500 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
1a510 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62  ate by playing b
1a520 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ack.** the journ
1a530 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  al.  Then the co
1a540 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f  ntents of the jo
1a550 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65  urnal are flushe
1a560 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20  d out to.** the 
1a570 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65  disk.  After the
1a580 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65   journal is safe
1a590 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65  ly on oxide, the
1a5a0 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a   changes to the.
1a5b0 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20  ** database are 
1a5c0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1a5d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
1a5e0 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78  nd flushed to ox
1a5f0 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ide..** At the e
1a600 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c  nd of this call,
1a610 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1a620 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73  urnal still exis
1a630 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73  ts on the.** dis
1a640 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69  k and we are sti
1a650 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c  ll holding all l
1a660 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61  ocks, so the tra
1a670 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74  nsaction has not
1a680 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20  .** committed.  
1a690 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  See sqlite3Btree
1a6a0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
1a6b0 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
1a6c0 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20  phase of the.** 
1a6d0 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
1a6e0 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
1a6f0 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f  is a no-op if no
1a700 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1a710 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  on is currently 
1a720 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a  active on pBt..*
1a730 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1a740 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
1a750 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62  e file for the b
1a760 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65  tree pBt. zMaste
1a770 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  r points to.** t
1a780 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
1a790 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1a7a0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
1a7b0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1a7c0 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  .** individual j
1a7d0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20  ournal file, or 
1a7e0 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74  is NULL, indicat
1a7f0 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  ing no master jo
1a800 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28  urnal file .** (
1a810 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
1a820 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
1a830 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
1a840 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73   called, the mas
1a850 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75  ter journal shou
1a860 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ld already have 
1a870 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c  been.** created,
1a880 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
1a890 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  this journal poi
1a8a0 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20  nter and synced 
1a8b0 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  to disk..**.** O
1a8c0 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74  nce this is rout
1a8d0 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64  ine has returned
1a8e0 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  , the only thing
1a8f0 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d   required to com
1a900 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65  mit.** the write
1a910 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
1a920 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66   this database f
1a930 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ile is to delete
1a940 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   the journal..*/
1a950 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1a960 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
1a970 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20  Btree *p, const 
1a980 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
1a990 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1a9a0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69  E_OK;.  if( p->i
1a9b0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1a9c0 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
1a9d0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1a9e0 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
1a9f0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66  reeEnter(p);.#if
1aa00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1aa10 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1aa20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
1aa30 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  uum ){.      rc 
1aa40 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  = autoVacuumComm
1aa50 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69  it(pBt);.      i
1aa60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1aa70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1aa80 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1aa90 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1aaa0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1aab0 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e   }.    if( pBt->
1aac0 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20  bDoTruncate ){. 
1aad0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1aae0 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70  rTruncateImage(p
1aaf0 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d  Bt->pPager, pBt-
1ab00 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23  >nPage);.    }.#
1ab10 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73  endif.    rc = s
1ab20 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1ab30 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70  tPhaseOne(pBt->p
1ab40 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20  Pager, zMaster, 
1ab50 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  0);.    sqlite3B
1ab60 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1ab70 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1ab80 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1ab90 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1aba0 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43  from both BtreeC
1abb0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
1abc0 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63  and BtreeRollbac
1abd0 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f  k().** at the co
1abe0 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72  nclusion of a tr
1abf0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
1ac00 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45  atic void btreeE
1ac10 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74  ndTransaction(Bt
1ac20 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
1ac30 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1ac40 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
1ac50 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
1ac60 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
1ac70 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
1ac80 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1ac90 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1aca0 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  .  pBt->bDoTrunc
1acb0 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ate = 0;.#endif.
1acc0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1acd0 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64  >TRANS_NONE && d
1ace0 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29  b->nVdbeRead>1 )
1acf0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
1ad00 65 20 61 72 65 20 6f 74 68 65 72 20 61 63 74 69  e are other acti
1ad10 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  ve statements th
1ad20 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69  at belong to thi
1ad30 73 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  s database.    *
1ad40 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72  * handle, downgr
1ad50 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e  ade to a read-on
1ad60 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ly transaction. 
1ad70 54 68 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d  The other statem
1ad80 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ents.    ** may 
1ad90 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67  still be reading
1ada0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1adb0 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e  se.  */.    down
1adc0 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
1add0 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29  cheTableLocks(p)
1ade0 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  ;.    p->inTrans
1adf0 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
1ae00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
1ae10 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64  f the handle had
1ae20 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61   any kind of tra
1ae30 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64  nsaction open, d
1ae40 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ecrement the .  
1ae50 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1ae60 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68   count of the sh
1ae70 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74  ared btree. If t
1ae80 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1ae90 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61  ount .    ** rea
1aea0 63 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20  ches 0, set the 
1aeb0 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
1aec0 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20  TRANS_NONE. The 
1aed0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
1aee0 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c  sed().    ** cal
1aef0 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c  l below will unl
1af00 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20  ock the pager.  
1af10 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  */.    if( p->in
1af20 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
1af30 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72  E ){.      clear
1af40 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
1af50 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
1af60 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
1af70 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66  tion--;.      if
1af80 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73  ( 0==pBt->nTrans
1af90 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
1afa0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
1afb0 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  tion = TRANS_NON
1afc0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
1afd0 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
1afe0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
1aff0 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52  tion state to TR
1b000 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c  ANS_NONE and unl
1b010 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ock the .    ** 
1b020 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61  pager if this ca
1b030 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e  ll closed the on
1b040 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ly read or write
1b050 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a   transaction.  *
1b060 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  /.    p->inTrans
1b070 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
1b080 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
1b090 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d  Unused(pBt);.  }
1b0a0 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
1b0b0 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ty(p);.}../*.** 
1b0c0 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  Commit the trans
1b0d0 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  action currently
1b0e0 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a   in progress..**
1b0f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1b100 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
1b110 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
1b120 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  a 2-phase commit
1b130 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65  .  The.** sqlite
1b140 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1b150 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64  eOne() routine d
1b160 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
1b170 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a  ase and should.*
1b180 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69  * be invoked pri
1b190 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
1b1a0 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  is routine.  The
1b1b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1b1c0 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a  mitPhaseOne().**
1b1d0 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c   routine did all
1b1e0 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69   the work of wri
1b1f0 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ting information
1b200 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64   out to disk and
1b210 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a   flushing the.**
1b220 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61   contents so tha
1b230 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74  t they are writt
1b240 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b  en onto the disk
1b250 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74   platter.  All t
1b260 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68  his.** routine h
1b270 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65  as to do is dele
1b280 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f  te or truncate o
1b290 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65  r zero the heade
1b2a0 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20  r in the.** the 
1b2b0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1b2c0 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74   (which causes t
1b2d0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  he transaction t
1b2e0 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a  o commit) and.**
1b2f0 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a   drop locks..**.
1b300 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20  ** Normally, if 
1b310 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
1b320 77 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  while the pager 
1b330 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d 70 74  layer is attempt
1b340 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c  ing to .** final
1b350 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ize the underlyi
1b360 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ng journal file,
1b370 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
1b380 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
1b390 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72  and.** the upper
1b3a0 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65   layer will atte
1b3b0 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20  mpt a rollback. 
1b3c0 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
1b3d0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
1b3e0 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74  ** is non-zero t
1b3f0 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20  hen this b-tree 
1b400 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70  transaction is p
1b410 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66  art of a multi-f
1b420 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ile .** transact
1b430 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
1b440 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  e, the transacti
1b450 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
1b460 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a  een committed .*
1b470 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61  * (by deleting a
1b480 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1b490 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61  file) and the ca
1b4a0 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65  ller will ignore
1b4b0 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
1b4c0 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  ons return code.
1b4d0 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20   So, even if an 
1b4e0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
1b4f0 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c  the pager layer,
1b500 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d  .** reset the b-
1b510 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74  tree objects int
1b520 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69  ernal state to i
1b530 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
1b540 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61   write.** transa
1b550 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63  ction has been c
1b560 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20 71  losed. This is q
1b570 75 69 74 65 20 73 61 66 65 2c 20 61 73 20 74 68  uite safe, as th
1b580 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76  e pager will hav
1b590 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65  e.** transitione
1b5a0 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73  d to the error s
1b5b0 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tate..**.** This
1b5c0 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
1b5d0 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
1b5e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b5f0 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
1b600 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
1b610 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
1b620 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
1b630 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
1b640 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1b650 50 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a  PhaseTwo(Btree *
1b660 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29  p, int bCleanup)
1b670 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  {..  if( p->inTr
1b680 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
1b690 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1b6a0 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  OK;.  sqlite3Btr
1b6b0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
1b6c0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
1b6d0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61  ..  /* If the ha
1b6e0 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65  ndle has a write
1b6f0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65  -transaction ope
1b700 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68  n, commit the sh
1b710 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a  ared-btrees .  *
1b720 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
1b730 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64  d set the shared
1b740 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
1b750 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  READ..  */.  if(
1b760 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1b770 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
1b780 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68  int rc;.    BtSh
1b790 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1b7a0 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
1b7b0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1b7c0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
1b7d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1b7e0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
1b7f0 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  >0 );.    rc = s
1b800 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1b810 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70  tPhaseTwo(pBt->p
1b820 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1b830 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
1b840 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a   bCleanup==0 ){.
1b850 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1b860 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
1b870 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1b880 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72   }.    pBt->inTr
1b890 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
1b8a0 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65  S_READ;.    btre
1b8b0 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
1b8c0 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
1b8d0 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
1b8e0 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
1b8f0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1b900 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b910 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f  ;.}../*.** Do bo
1b920 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20 63  th phases of a c
1b930 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ommit..*/.int sq
1b940 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1b950 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
1b960 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
1b970 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1b980 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1b990 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
1b9a0 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  p, 0);.  if( rc=
1b9b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b9c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1b9d0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
1b9e0 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  o(p, 0);.  }.  s
1b9f0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1ba00 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1ba10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1ba20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
1ba30 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52   state to CURSOR
1ba40 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65  _FAULT and the e
1ba50 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  rror.** code to 
1ba60 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72  errCode for ever
1ba70 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68  y cursor on BtSh
1ba80 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65  ared that pBtree
1ba90 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a  .** references..
1baa0 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73  **.** Every curs
1bab0 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c 20 69  or is tripped, i
1bac0 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73  ncluding cursors
1bad0 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20   that belong.** 
1bae0 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  to other databas
1baf0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
1bb00 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20  at happen to be 
1bb10 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63  sharing.** the c
1bb20 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65  ache with pBtree
1bb30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1bb40 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64  tine gets called
1bb50 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b   when a rollback
1bb60 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20   occurs..** All 
1bb70 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68  cursors using th
1bb80 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73  e same cache mus
1bb90 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20  t be tripped.** 
1bba0 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20  to prevent them 
1bbb0 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75  from trying to u
1bbc0 73 65 20 74 68 65 20 62 74 72 65 65 20 61 66 74  se the btree aft
1bbd0 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  er.** the rollba
1bbe0 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63  ck.  The rollbac
1bbf0 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74  k may have delet
1bc00 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20  ed tables.** or 
1bc10 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73  moved root pages
1bc20 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73  , so it is not s
1bc30 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20  ufficient to.** 
1bc40 73 61 76 65 20 74 68 65 20 73 74 61 74 65 20 6f  save the state o
1bc50 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54  f the cursor.  T
1bc60 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62  he cursor must b
1bc70 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
1bc80 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1bc90 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
1bca0 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72  sors(Btree *pBtr
1bcb0 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29  ee, int errCode)
1bcc0 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
1bcd0 0a 20 20 69 66 28 20 70 42 74 72 65 65 3d 3d 30  .  if( pBtree==0
1bce0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
1bcf0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1bd00 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d  Btree);.  for(p=
1bd10 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
1bd20 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
1bd30 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ext){.    int i;
1bd40 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1bd50 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b  eClearCursor(p);
1bd60 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d  .    p->eState =
1bd70 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20   CURSOR_FAULT;. 
1bd80 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d     p->skipNext =
1bd90 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 66 6f   errCode;.    fo
1bda0 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61  r(i=0; i<=p->iPa
1bdb0 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
1bdc0 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61  releasePage(p->a
1bdd0 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20  pPage[i]);.     
1bde0 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20   p->apPage[i] = 
1bdf0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  0;.    }.  }.  s
1be00 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1be10 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a  (pBtree);.}../*.
1be20 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** Rollback the 
1be30 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
1be40 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63 75  rogress.  All cu
1be50 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a  rsors will be.**
1be60 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74 68   invalided by th
1be70 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41  is operation.  A
1be80 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
1be90 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68  e a cursor.** th
1bea0 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74  at was open at t
1beb0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
1bec0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 77  this operation w
1bed0 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  ill result.** in
1bee0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
1bef0 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
1bf00 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
1bf10 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1bf20 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
1bf30 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
1bf40 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
1bf50 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
1bf60 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
1bf70 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  nt sqlite3BtreeR
1bf80 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70  ollback(Btree *p
1bf90 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 29 7b  , int tripCode){
1bfa0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
1bfb0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1bfc0 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
1bfd0 70 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74  pPage1;..  sqlit
1bfe0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1bff0 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 3d  .  if( tripCode=
1c000 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c010 20 20 72 63 20 3d 20 74 72 69 70 43 6f 64 65 20    rc = tripCode 
1c020 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
1c030 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  (pBt, 0, 0);.  }
1c040 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
1c050 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1c060 69 66 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a  if( tripCode ){.
1c070 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1c080 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70  TripAllCursors(p
1c090 2c 20 74 72 69 70 43 6f 64 65 29 3b 0a 20 20 7d  , tripCode);.  }
1c0a0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1c0b0 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  y(p);..  if( p->
1c0c0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1c0d0 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
1c0e0 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  rc2;..    assert
1c0f0 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
1c100 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1c110 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
1c120 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
1c130 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
1c140 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
1c150 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c160 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
1c170 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  }..    /* The ro
1c180 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
1c190 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
1c1a0 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
1c1b0 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
1c1c0 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67 65 28  ll btreeGetPage(
1c1d0 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69  ) on page 1 agai
1c1e0 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  n to make.    **
1c1f0 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44   sure pPage1->aD
1c200 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65  ata is set corre
1c210 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ctly. */.    if(
1c220 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1c230 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
1c240 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
1c250 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20        int nPage 
1c260 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
1c270 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
1c280 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1c290 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20  e( nPage==0 );. 
1c2a0 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
1c2b0 30 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72  0 ) sqlite3Pager
1c2c0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
1c2d0 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
1c2e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c2f0 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67  pBt->nPage!=nPag
1c300 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e );.      pBt->
1c310 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
1c320 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1c330 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a  (pPage1);.    }.
1c340 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e      assert( coun
1c350 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42  tValidCursors(pB
1c360 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20  t, 1)==0 );.    
1c370 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1c380 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
1c390 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48  .    btreeClearH
1c3a0 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a  asContent(pBt);.
1c3b0 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
1c3c0 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
1c3d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1c3e0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1c3f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  rc;.}../*.** Sta
1c400 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  rt a statement s
1c410 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  ubtransaction. T
1c420 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
1c430 6e 20 63 61 6e 20 63 61 6e 20 62 65 20 72 6f 6c  n can can be rol
1c440 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65  led.** back inde
1c450 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65  pendently of the
1c460 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
1c470 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72  n. You must star
1c480 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
1c490 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74  .** before start
1c4a0 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63  ing a subtransac
1c4b0 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
1c4c0 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65  nsaction is ende
1c4d0 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
1c4e0 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20  .** if the main 
1c4f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d  transaction comm
1c500 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  its or rolls bac
1c510 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65  k..**.** Stateme
1c520 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
1c530 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75  ns are used arou
1c540 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51  nd individual SQ
1c550 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  L statements.** 
1c560 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e  that are contain
1c570 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49  ed within a BEGI
1c580 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b  N...COMMIT block
1c590 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69  .  If a constrai
1c5a0 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  nt.** error occu
1c5b0 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  rs within the st
1c5c0 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66  atement, the eff
1c5d0 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20  ect of that one 
1c5e0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e  statement.** can
1c5f0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
1c600 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
1c610 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65  o rollback the e
1c620 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
1c630 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65  n..**.** A state
1c640 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63  ment sub-transac
1c650 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
1c660 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d  ted as an anonym
1c670 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54  ous savepoint. T
1c680 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73  he.** value pass
1c690 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
1c6a0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
1c6b0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
1c6c0 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a  f savepoints,.**
1c6d0 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e   including the n
1c6e0 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  ew anonymous sav
1c6f0 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20  epoint, open on 
1c700 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e  the B-Tree. i.e.
1c710 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
1c720 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70   no active savep
1c730 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  oints and no oth
1c740 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61  er statement-tra
1c750 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a  nsactions open,.
1c760 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73  ** iStatement is
1c770 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f   1. This anonymo
1c780 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e  us savepoint can
1c790 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20   be released or 
1c7a0 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75  rolled back.** u
1c7b0 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  sing the sqlite3
1c7c0 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29  BtreeSavepoint()
1c7d0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
1c7e0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
1c7f0 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70  ginStmt(Btree *p
1c800 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74  , int iStatement
1c810 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
1c820 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1c830 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
1c840 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1c850 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
1c860 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1c870 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
1c880 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1c890 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30  TS_READ_ONLY)==0
1c8a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
1c8b0 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  tatement>0 );.  
1c8c0 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
1c8d0 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  nt>p->db->nSavep
1c8e0 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74  oint );.  assert
1c8f0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
1c900 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1c910 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65  E );.  /* At the
1c920 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20   pager level, a 
1c930 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
1c940 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70  ction is a savep
1c950 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61  oint with.  ** a
1c960 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20  n index greater 
1c970 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69  than all savepoi
1c980 6e 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c  nts created expl
1c990 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a  icitly using.  *
1c9a0 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  * SQL statements
1c9b0 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  . It is illegal 
1c9c0 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65  to open, release
1c9d0 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79   or rollback any
1c9e0 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70  .  ** such savep
1c9f0 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20  oints while the 
1ca00 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
1ca10 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
1ca20 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a  is active..  */.
1ca30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1ca40 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
1ca50 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53  (pBt->pPager, iS
1ca60 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c  tatement);.  sql
1ca70 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1ca80 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1ca90 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63  }../*.** The sec
1caa0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
1cab0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f  this function, o
1cac0 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56  p, is always SAV
1cad0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a  EPOINT_ROLLBACK.
1cae0 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f  ** or SAVEPOINT_
1caf0 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75  RELEASE. This fu
1cb00 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65  nction either re
1cb10 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20  leases or rolls 
1cb20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65  back the.** save
1cb30 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64  point identified
1cb40 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53   by parameter iS
1cb50 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64  avepoint, depend
1cb60 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  ing on the value
1cb70 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a   .** of op..**.*
1cb80 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76  * Normally, iSav
1cb90 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65  epoint is greate
1cba0 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
1cbb0 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72  to zero. However
1cbc0 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41  , if op is.** SA
1cbd0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
1cbe0 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e  , then iSavepoin
1cbf0 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31  t may also be -1
1cc00 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
1cc10 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  he .** contents 
1cc20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  of the entire tr
1cc30 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f  ansaction are ro
1cc40 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20  lled back. This 
1cc50 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  is different.** 
1cc60 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72  from a normal tr
1cc70 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61  ansaction rollba
1cc80 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20  ck, as no locks 
1cc90 61 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64  are released and
1cca0 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74   the.** transact
1ccb0 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e  ion remains open
1ccc0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ccd0 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42  BtreeSavepoint(B
1cce0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  tree *p, int op,
1ccf0 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29   int iSavepoint)
1cd00 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1cd10 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20  ITE_OK;.  if( p 
1cd20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
1cd30 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
1cd40 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1cd50 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  = p->pBt;.    as
1cd60 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f  sert( op==SAVEPO
1cd70 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f  INT_RELEASE || o
1cd80 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
1cd90 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  LBACK );.    ass
1cda0 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e  ert( iSavepoint>
1cdb0 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e  =0 || (iSavepoin
1cdc0 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56  t==-1 && op==SAV
1cdd0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29  EPOINT_ROLLBACK)
1cde0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   );.    sqlite3B
1cdf0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1ce00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1ce10 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74  gerSavepoint(pBt
1ce20 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53  ->pPager, op, iS
1ce30 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69  avepoint);.    i
1ce40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ce50 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53   ){.      if( iS
1ce60 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70  avepoint<0 && (p
1ce70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1ce80 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
1ce90 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  TY)!=0 ){.      
1cea0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30    pBt->nPage = 0
1ceb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1cec0 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
1ced0 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74  (pBt);.      pBt
1cee0 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  ->nPage = get4by
1cef0 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61  te(28 + pBt->pPa
1cf00 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20  ge1->aData);..  
1cf10 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1cf20 61 73 65 20 73 69 7a 65 20 77 61 73 20 77 72 69  ase size was wri
1cf30 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66  tten into the of
1cf40 66 73 65 74 20 32 38 20 6f 66 20 74 68 65 20 68  fset 28 of the h
1cf50 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77  eader.      ** w
1cf60 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
1cf70 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20  ion started, so 
1cf80 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
1cf90 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74   value at offset
1cfa0 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20  .      ** 28 is 
1cfb0 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20  nonzero. */.    
1cfc0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
1cfd0 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a  Page>0 );.    }.
1cfe0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1cff0 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
1d000 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1d010 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
1d020 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
1d030 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74  BTree whose root
1d040 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a   is on the page.
1d050 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20  ** iTable. If a 
1d060 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
1d070 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
1d080 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
1d090 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  t.** the caller 
1d0a0 61 6c 72 65 61 64 79 20 68 61 73 20 61 74 20 6c  already has at l
1d0b0 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79  east a read-only
1d0c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
1d0d0 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61  n.** on the data
1d0e0 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66  base already. If
1d0f0 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
1d100 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
1d110 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  en.** the caller
1d120 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68   is assumed to h
1d130 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
1d140 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
1d150 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  *.** If wrFlag==
1d160 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  0, then the curs
1d170 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  or can only be u
1d180 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  sed for reading.
1d190 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31  .** If wrFlag==1
1d1a0 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
1d1b0 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  r can be used fo
1d1c0 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
1d1d0 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f  .** writing if o
1d1e0 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  ther conditions 
1d1f0 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20  for writing are 
1d200 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
1d210 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64  .** are the cond
1d220 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  itions that must
1d230 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72   be met in order
1d240 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a   for writing to.
1d250 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a  ** be allowed:.*
1d260 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72  *.** 1:  The cur
1d270 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65  sor must have be
1d280 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  en opened with w
1d290 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32  rFlag==1.**.** 2
1d2a0 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73  :  Other databas
1d2b0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
1d2c0 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d  at share the sam
1d2d0 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a  e pager cache.**
1d2e0 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61       but which a
1d2f0 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45  re not in the RE
1d300 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73  AD_UNCOMMITTED s
1d310 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76  tate may not hav
1d320 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73  e.**     cursors
1d330 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61   open with wrFla
1d340 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65  g==0 on the same
1d350 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69   table.  Otherwi
1d360 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68  se.**     the ch
1d370 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
1d380 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20  is write cursor 
1d390 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65  would be visible
1d3a0 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72   to.**     the r
1d3b0 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74  ead cursors in t
1d3c0 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  he other databas
1d3d0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
1d3e0 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61  .** 3:  The data
1d3f0 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69  base must be wri
1d400 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65  table (not on re
1d410 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a  ad-only media).*
1d420 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d  *.** 4:  There m
1d430 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65  ust be an active
1d440 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
1d450 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20  .** No checking 
1d460 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20  is done to make 
1d470 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69  sure that page i
1d480 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20  Table really is 
1d490 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
1d4a0 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49   of a b-tree.  I
1d4b0 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
1d4c0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71  n the cursor acq
1d4d0 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  uired.** will no
1d4e0 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  t work correctly
1d4f0 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73  ..**.** It is as
1d500 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73  sumed that the s
1d510 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1d520 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e  rZero() has been
1d530 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43   called.** on pC
1d540 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ur to initialize
1d550 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63   the memory spac
1d560 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b  e prior to invok
1d570 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1d580 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d590 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  btreeCursor(.  B
1d5a0 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
1d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
1d5d0 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
1d5e0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
1d5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d600 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
1d610 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
1d620 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
1d630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d640 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
1d650 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
1d660 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
1d670 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1d680 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
1d690 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
1d6a0 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
1d6b0 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ion */.  BtCurso
1d6c0 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
1d6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6e0 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77  /* Space for new
1d6f0 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20   cursor */.){.  
1d700 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1d710 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20  p->pBt;         
1d720 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
1d730 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a   b-tree handle *
1d740 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
1d750 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1d760 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
1d770 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
1d780 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20   wrFlag==1 );.. 
1d790 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1d7a0 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65  g assert stateme
1d7b0 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20  nts verify that 
1d7c0 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61  if this is a sha
1d7d0 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72  rable .  ** b-tr
1d7e0 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ee database, the
1d7f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68   connection is h
1d800 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69  olding the requi
1d810 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c  red table locks,
1d820 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20   .  ** and that 
1d830 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
1d840 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e  ion has any open
1d850 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e   cursor that con
1d860 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a  flicts with .  *
1d870 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f  * this lock.  */
1d880 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68  .  assert( hasSh
1d890 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1d8a0 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b  ck(p, iTable, pK
1d8b0 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c 61  eyInfo!=0, wrFla
1d8c0 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74  g+1) );.  assert
1d8d0 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21  ( wrFlag==0 || !
1d8e0 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  hasReadConflicts
1d8f0 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a  (p, iTable) );..
1d900 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
1d910 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
1d920 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75 69  opened the requi
1d930 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  red transaction.
1d940 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
1d950 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
1d960 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ONE );.  assert(
1d970 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d   wrFlag==0 || p-
1d980 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1d990 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
1d9a0 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26  t( pBt->pPage1 &
1d9b0 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  & pBt->pPage1->a
1d9c0 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 4e  Data );..  if( N
1d9d0 45 56 45 52 28 77 72 46 6c 61 67 20 26 26 20 28  EVER(wrFlag && (
1d9e0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1d9f0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
1da00 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1da10 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
1da20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62  ;.  }.  if( iTab
1da30 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61  le==1 && btreePa
1da40 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20  gecount(pBt)==0 
1da50 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77  ){.    assert( w
1da60 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20  rFlag==0 );.    
1da70 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a  iTable = 0;.  }.
1da80 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e  .  /* Now that n
1da90 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63  o other errors c
1daa0 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68  an occur, finish
1dab0 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20   filling in the 
1dac0 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61  BtCursor.  ** va
1dad0 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b  riables and link
1dae0 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f   the cursor into
1daf0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69   the BtShared li
1db00 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e  st.  */.  pCur->
1db10 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f  pgnoRoot = (Pgno
1db20 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d  )iTable;.  pCur-
1db30 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70  >iPage = -1;.  p
1db40 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20  Cur->pKeyInfo = 
1db50 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72  pKeyInfo;.  pCur
1db60 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
1db70 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b  pCur->pBt = pBt;
1db80 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
1db90 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 42 54 43  s = wrFlag ? BTC
1dba0 46 5f 57 72 69 74 65 46 6c 61 67 20 3a 20 30 3b  F_WriteFlag : 0;
1dbb0 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d  .  pCur->pNext =
1dbc0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
1dbd0 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74   if( pCur->pNext
1dbe0 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e   ){.    pCur->pN
1dbf0 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75  ext->pPrev = pCu
1dc00 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43  r;.  }.  pBt->pC
1dc10 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20  ursor = pCur;.  
1dc20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
1dc30 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
1dc40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1dc50 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  K;.}.int sqlite3
1dc60 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  BtreeCursor(.  B
1dc70 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
1dc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1dca0 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
1dcb0 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
1dcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcd0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
1dce0 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
1dcf0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
1dd00 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
1dd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20          /* 1 to 
1dd30 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e  write. 0 read-on
1dd40 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b  ly */.  struct K
1dd50 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1dd60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1dd70 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
1dd80 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a   to xCompare() *
1dd90 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
1dda0 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
1ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddc0 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72  /* Write new cur
1ddd0 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  sor here */.){. 
1dde0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
1ddf0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1de00 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72  .  rc = btreeCur
1de10 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77  sor(p, iTable, w
1de20 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c  rFlag, pKeyInfo,
1de30 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65   pCur);.  sqlite
1de40 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1de50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1de60 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1de70 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72   size of a BtCur
1de80 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79  sor object in by
1de90 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tes..**.** This 
1dea0 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e 65  interfaces is ne
1deb0 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73 65  eded so that use
1dec0 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61  rs of cursors ca
1ded0 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a  n preallocate.**
1dee0 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72   sufficient stor
1def0 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75  age to hold a cu
1df00 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72  rsor.  The BtCur
1df10 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70  sor object is op
1df20 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73  aque.** to users
1df30 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20   so they cannot 
1df40 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20  do the sizeof() 
1df50 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65  themselves - the
1df60 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74  y must call.** t
1df70 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  his routine..*/.
1df80 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1df90 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29  CursorSize(void)
1dfa0 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44  {.  return ROUND
1dfb0 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f  8(sizeof(BtCurso
1dfc0 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  r));.}../*.** In
1dfd0 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20  itialize memory 
1dfe0 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e  that will be con
1dff0 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42 74  verted into a Bt
1e000 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a  Cursor object..*
1e010 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65 20  *.** The simple 
1e020 61 70 70 72 6f 61 63 68 20 68 65 72 65 20 77 6f  approach here wo
1e030 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65 74  uld be to memset
1e040 28 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f 62  () the entire ob
1e050 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e  ject.** to zero.
1e060 20 20 42 75 74 20 69 74 20 74 75 72 6e 73 20 6f    But it turns o
1e070 75 74 20 74 68 61 74 20 74 68 65 20 61 70 50 61  ut that the apPa
1e080 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d  ge[] and aiIdx[]
1e090 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f   arrays.** do no
1e0a0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65 72  t need to be zer
1e0b0 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61 72 65  oed and they are
1e0c0 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63 61   large, so we ca
1e0d0 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20  n save a lot.** 
1e0e0 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20 73  of run-time by s
1e0f0 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74  kipping the init
1e100 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68  ialization of th
1e110 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f  ose elements..*/
1e120 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
1e130 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74 43  eeCursorZero(BtC
1e140 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d  ursor *p){.  mem
1e150 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65 74  set(p, 0, offset
1e160 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69 50 61  of(BtCursor, iPa
1e170 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ge));.}../*.** C
1e180 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20  lose a cursor.  
1e190 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  The read lock on
1e1a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1e1b0 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a  le is released.*
1e1c0 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
1e1d0 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64  cursor is closed
1e1e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e1f0 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
1e200 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1e210 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  {.  Btree *pBtre
1e220 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  e = pCur->pBtree
1e230 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29  ;.  if( pBtree )
1e240 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
1e250 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1e260 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20   pCur->pBt;.    
1e270 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1e280 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73  r(pBtree);.    s
1e290 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
1e2a0 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
1e2b0 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65    if( pCur->pPre
1e2c0 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  v ){.      pCur-
1e2d0 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
1e2e0 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
1e2f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42   }else{.      pB
1e300 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
1e310 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  r->pNext;.    }.
1e320 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e      if( pCur->pN
1e330 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75  ext ){.      pCu
1e340 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  r->pNext->pPrev 
1e350 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20  = pCur->pPrev;. 
1e360 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
1e370 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
1e380 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
1e390 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
1e3a0 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
1e3b0 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  }.    unlockBtre
1e3c0 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
1e3d0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1e3e0 65 28 70 42 74 72 65 65 2d 3e 64 62 2c 20 70 43  e(pBtree->db, pC
1e3f0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a  ur->aOverflow);.
1e400 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66      /* sqlite3_f
1e410 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20  ree(pCur); */.  
1e420 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1e430 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
1e440 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1e450 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  _OK;.}../*.** Ma
1e460 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43 75  ke sure the BtCu
1e470 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74  rsor* given in t
1e480 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20  he argument has 
1e490 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72  a valid.** BtCur
1e4a0 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75  sor.info structu
1e4b0 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  re.  If it is no
1e4c0 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c  t already valid,
1e4d0 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61   call.** btreePa
1e4e0 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c  rseCell() to fil
1e4f0 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42  l it in..**.** B
1e500 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20  tCursor.info is 
1e510 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 69  a cache of the i
1e520 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
1e530 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a  e current cell..
1e540 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63 61  ** Using this ca
1e550 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65 20  che reduces the 
1e560 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
1e570 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  to btreeParseCel
1e580 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d  l()..**.** 2007-
1e590 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20 69 73  06-25:  There is
1e5a0 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65 20 76   a bug in some v
1e5b0 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20  ersions of MSVC 
1e5c0 74 68 61 74 20 63 61 75 73 65 20 74 68 65 0a 2a  that cause the.*
1e5d0 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72  * compiler to cr
1e5e0 61 73 68 20 77 68 65 6e 20 67 65 74 43 65 6c 6c  ash when getCell
1e5f0 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d  Info() is implem
1e600 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63 72 6f  ented as a macro
1e610 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20 69  ..** But there i
1e620 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20  s a measureable 
1e630 73 70 65 65 64 20 61 64 76 61 6e 74 61 67 65 20  speed advantage 
1e640 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d 61 63  to using the mac
1e650 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68  ro on gcc.** (wh
1e660 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72  en less compiler
1e670 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c   optimizations l
1e680 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61  ike -Os or -O0 a
1e690 72 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a  re used and the.
1e6a0 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e  ** compiler is n
1e6b0 6f 74 20 64 6f 69 6e 67 20 61 67 72 65 73 73 69  ot doing agressi
1e6c0 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53  ve inlining.)  S
1e6d0 6f 20 77 65 20 75 73 65 20 61 20 72 65 61 6c 20  o we use a real 
1e6e0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  function.** for 
1e6f0 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72 6f  MSVC and a macro
1e700 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20   for everything 
1e710 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23 32  else.  Ticket #2
1e720 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  457..*/.#ifndef 
1e730 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20  NDEBUG.  static 
1e740 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49  void assertCellI
1e750 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
1e760 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66  ur){.    CellInf
1e770 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20  o info;.    int 
1e780 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
1e790 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  age;.    memset(
1e7a0 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  &info, 0, sizeof
1e7b0 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72  (info));.    btr
1e7c0 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
1e7d0 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c  ->apPage[iPage],
1e7e0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61   pCur->aiIdx[iPa
1e7f0 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ge], &info);.   
1e800 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
1e810 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 69  _DB || memcmp(&i
1e820 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  nfo, &pCur->info
1e830 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d  , sizeof(info))=
1e840 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  =0 );.  }.#else.
1e850 20 20 23 64 65 66 69 6e 65 20 61 73 73 65 72 74    #define assert
1e860 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64  CellInfo(x).#end
1e870 69 66 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56  if.#ifdef _MSC_V
1e880 45 52 0a 20 20 2f 2a 20 55 73 65 20 61 20 72 65  ER.  /* Use a re
1e890 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d  al function in M
1e8a0 53 56 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75  SVC to work arou
1e8b0 6e 64 20 62 75 67 73 20 69 6e 20 74 68 61 74 20  nd bugs in that 
1e8c0 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73  compiler. */.  s
1e8d0 74 61 74 69 63 20 76 6f 69 64 20 67 65 74 43 65  tatic void getCe
1e8e0 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
1e8f0 2a 70 43 75 72 29 7b 0a 20 20 20 20 69 66 28 20  *pCur){.    if( 
1e900 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1e910 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
1e920 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
1e930 50 61 67 65 3b 0a 20 20 20 20 20 20 62 74 72 65  Page;.      btre
1e940 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
1e950 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70  >apPage[iPage],p
1e960 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
1e970 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a  ],&pCur->info);.
1e980 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
1e990 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
1e9a0 69 64 4e 4b 65 79 3b 0a 20 20 20 20 7d 65 6c 73  idNKey;.    }els
1e9b0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 43  e{.      assertC
1e9c0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1e9d0 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f     }.  }.#else /
1e9e0 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45  * if not _MSC_VE
1e9f0 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20  R */.  /* Use a 
1ea00 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68  macro in all oth
1ea10 65 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20  er compilers so 
1ea20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f  that the functio
1ea30 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a  n is inlined */.
1ea40 23 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49  #define getCellI
1ea50 6e 66 6f 28 70 43 75 72 29 20 20 20 20 20 20 20  nfo(pCur)       
1ea60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1ea90 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66  .  if( pCur->inf
1eaa0 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20  o.nSize==0 ){   
1eab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eae0 5c 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20  \.    int iPage 
1eaf0 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 20  = pCur->iPage;  
1eb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb30 20 5c 0a 20 20 20 20 62 74 72 65 65 50 61 72 73   \.    btreePars
1eb40 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
1eb50 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e  ge[iPage],pCur->
1eb60 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43  aiIdx[iPage],&pC
1eb70 75 72 2d 3e 69 6e 66 6f 29 3b 20 20 20 20 20 20  ur->info);      
1eb80 20 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 63 75    \.    pCur->cu
1eb90 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56  rFlags |= BTCF_V
1eba0 61 6c 69 64 4e 4b 65 79 3b 20 20 20 20 20 20 20  alidNKey;       
1ebb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebd0 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20     \.  }else{   
1ebe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec20 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74      \.    assert
1ec30 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20  CellInfo(pCur); 
1ec40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec70 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69       \.  }.#endi
1ec80 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f  f /* _MSC_VER */
1ec90 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
1eca0 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f    /* The next ro
1ecb0 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20  utine used only 
1ecc0 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
1ecd0 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a  statements */./*
1ece0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
1ecf0 69 66 20 74 68 65 20 67 69 76 65 6e 20 42 74 43  if the given BtC
1ed00 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20  ursor is valid. 
1ed10 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20   A valid cursor 
1ed20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69  is one.** that i
1ed30 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
1ed40 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e  ting to a row in
1ed50 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74   a (non-empty) t
1ed60 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73  able..** This is
1ed70 20 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20   a verification 
1ed80 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
1ed90 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
1eda0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e  rt() statements.
1edb0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1edc0 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
1edd0 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
1ede0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
1edf0 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
1ee00 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  ==CURSOR_VALID;.
1ee10 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42  }.#endif /* NDEB
1ee20 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  UG */../*.** Set
1ee30 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73   *pSize to the s
1ee40 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65  ize of the buffe
1ee50 72 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64  r needed to hold
1ee60 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a   the value of.**
1ee70 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65   the key for the
1ee80 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20   current entry. 
1ee90 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
1eea0 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a  s not pointing.*
1eeb0 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74  * to a valid ent
1eec0 72 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65  ry, *pSize is se
1eed0 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46  t to 0. .**.** F
1eee0 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  or a table with 
1eef0 74 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20  the INTKEY flag 
1ef00 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  set, this routin
1ef10 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65  e returns the ke
1ef20 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74  y.** itself, not
1ef30 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1ef40 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e  ytes in the key.
1ef50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
1ef60 72 20 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e 20  r must position 
1ef70 74 68 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72  the cursor prior
1ef80 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69   to invoking thi
1ef90 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a  s routine..** .*
1efa0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
1efb0 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74 20  annot fail.  It 
1efc0 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53  always returns S
1efd0 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69  QLITE_OK.  .*/.i
1efe0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
1eff0 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  eySize(BtCursor 
1f000 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a  *pCur, i64 *pSiz
1f010 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  e){.  assert( cu
1f020 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1f030 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1f040 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1f050 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c  CURSOR_INVALID |
1f060 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
1f070 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1f080 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1f090 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
1f0a0 20 29 7b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d   ){.    *pSize =
1f0b0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1f0c0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
1f0d0 72 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d  r);.    *pSize =
1f0e0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
1f0f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1f100 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1f110 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f  ** Set *pSize to
1f120 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1f130 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20  ytes of data in 
1f140 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a  the entry the.**
1f150 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c   cursor currentl
1f160 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a  y points to..**.
1f170 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
1f180 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  st guarantee tha
1f190 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
1f1a0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f  pointing to a no
1f1b0 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20  n-NULL.** valid 
1f1c0 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72  entry.  In other
1f1d0 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c   words, the call
1f1e0 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75  ing procedure mu
1f1f0 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20  st guarantee.** 
1f200 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
1f210 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74  has Cursor.eStat
1f220 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e  e==CURSOR_VALID.
1f230 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69  .**.** Failure i
1f240 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20  s not possible. 
1f250 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
1f260 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51  lways returns SQ
1f270 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d  LITE_OK..** It m
1f280 69 67 68 74 20 6a 75 73 74 20 61 73 20 77 65 6c  ight just as wel
1f290 6c 20 62 65 20 61 20 70 72 6f 63 65 64 75 72 65  l be a procedure
1f2a0 20 28 72 65 74 75 72 6e 69 6e 67 20 76 6f 69 64   (returning void
1f2b0 29 20 62 75 74 20 77 65 20 63 6f 6e 74 69 6e 75  ) but we continu
1f2c0 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20 61  e.** to return a
1f2d0 6e 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74  n integer result
1f2e0 20 63 6f 64 65 20 66 6f 72 20 68 69 73 74 6f 72   code for histor
1f2f0 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f  ical reasons..*/
1f300 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1f310 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73  eDataSize(BtCurs
1f320 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
1f330 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Size){.  assert(
1f340 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1f350 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1f360 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1f370 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1f380 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  );.  getCellInfo
1f390 28 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65  (pCur);.  *pSize
1f3a0 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44   = pCur->info.nD
1f3b0 61 74 61 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ata;.  return SQ
1f3c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1f3d0 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65  * Given the page
1f3e0 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76   number of an ov
1f3f0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
1f400 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61 72  he database (par
1f410 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c  ameter.** ovfl),
1f420 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
1f430 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e 75  inds the page nu
1f440 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
1f450 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a   page in the .**
1f460 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
1f470 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
1f480 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20  If possible, it 
1f490 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61  uses the auto-va
1f4a0 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d  cuum.** pointer-
1f4b0 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61 64  map data instead
1f4c0 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65 20   of reading the 
1f4d0 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20  content of page 
1f4e0 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a  ovfl to do so. .
1f4f0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
1f500 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69  r occurs an SQLi
1f510 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
1f520 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
1f530 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  wise:.**.** The 
1f540 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
1f550 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77  he next overflow
1f560 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e   page in the lin
1f570 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20  ked list is .** 
1f580 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e  written to *pPgn
1f590 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f  oNext. If page o
1f5a0 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20  vfl is the last 
1f5b0 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b  page in its link
1f5c0 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50  ed .** list, *pP
1f5d0 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74  gnoNext is set t
1f5e0 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  o zero. .**.** I
1f5f0 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20  f ppPage is not 
1f600 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65  NULL, and a refe
1f610 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d  rence to the Mem
1f620 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72  Page object corr
1f630 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
1f640 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66  page number pOvf
1f650 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20  l was obtained, 
1f660 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20  then *ppPage is 
1f670 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
1f680 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63  that.** referenc
1f690 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  e. It is the res
1f6a0 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
1f6b0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c  he caller to cal
1f6c0 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a  l releasePage().
1f6d0 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f  ** on *ppPage to
1f6e0 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72 65   free the refere
1f6f0 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72  nce. In no refer
1f700 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65  ence was obtaine
1f710 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  d (because.** th
1f720 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61  e pointer-map wa
1f730 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e  s used to obtain
1f740 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a   the value for *
1f750 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e  pPgnoNext), then
1f760 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73  .** *ppPage is s
1f770 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  et to zero..*/.s
1f780 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65  tatic int getOve
1f790 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53  rflowPage(.  BtS
1f7a0 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
1f7b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1f7c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1f7d0 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20  /.  Pgno ovfl,  
1f7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7f0 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72   /* Current over
1f800 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
1f810 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
1f820 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  ppPage,         
1f830 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61     /* OUT: MemPa
1f840 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62  ge handle (may b
1f850 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e  e NULL) */.  Pgn
1f860 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20  o *pPgnoNext    
1f870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1f880 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  : Next overflow 
1f890 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  page number */.)
1f8a0 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20  {.  Pgno next = 
1f8b0 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
1f8c0 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  age = 0;.  int r
1f8d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1f8e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1f8f0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1f900 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1f910 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b  sert(pPgnoNext);
1f920 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1f930 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1f940 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e  .  /* Try to fin
1f950 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  d the next page 
1f960 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
1f970 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20  list using the. 
1f980 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70   ** autovacuum p
1f990 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
1f9a0 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65  . Guess that the
1f9b0 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20   next page in . 
1f9c0 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   ** the overflow
1f9d0 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75   list is page nu
1f9e0 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49  mber (ovfl+1). I
1f9f0 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72  f that guess tur
1fa00 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20  ns .  ** out to 
1fa10 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62  be wrong, fall b
1fa20 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74  ack to loading t
1fa30 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20  he data of page 
1fa40 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66  .  ** number ovf
1fa50 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  l to determine t
1fa60 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d  he next page num
1fa70 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ber..  */.  if( 
1fa80 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1fa90 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
1faa0 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73  ;.    Pgno iGues
1fab0 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20  s = ovfl+1;.    
1fac0 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77  u8 eType;..    w
1fad0 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
1fae0 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29  AGE(pBt, iGuess)
1faf0 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44   || iGuess==PEND
1fb00 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1fb10 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65  t) ){.      iGue
1fb20 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ss++;.    }..   
1fb30 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74 72   if( iGuess<=btr
1fb40 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
1fb50 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1fb60 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47  trmapGet(pBt, iG
1fb70 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70  uess, &eType, &p
1fb80 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
1fb90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1fba0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1fbb0 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f  VERFLOW2 && pgno
1fbc0 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20  ==ovfl ){.      
1fbd0 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b    next = iGuess;
1fbe0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1fbf0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
1fc00 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
1fc10 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  dif..  assert( n
1fc20 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  ext==0 || rc==SQ
1fc30 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69  LITE_DONE );.  i
1fc40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1fc50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
1fc60 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f  eeGetPage(pBt, o
1fc70 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28 70 70  vfl, &pPage, (pp
1fc80 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47 45 52  Page==0) ? PAGER
1fc90 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  _GET_READONLY : 
1fca0 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
1fcb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
1fcc0 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20   pPage==0 );.   
1fcd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1fce0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74  OK ){.      next
1fcf0 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61 67   = get4byte(pPag
1fd00 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d  e->aData);.    }
1fd10 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65  .  }..  *pPgnoNe
1fd20 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28  xt = next;.  if(
1fd30 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a   ppPage ){.    *
1fd40 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a  ppPage = pPage;.
1fd50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c    }else{.    rel
1fd60 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
1fd70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72  .  }.  return (r
1fd80 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f  c==SQLITE_DONE ?
1fd90 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29   SQLITE_OK : rc)
1fda0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  ;.}../*.** Copy 
1fdb0 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
1fdc0 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72  er to a page, or
1fdd0 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20   from a page to 
1fde0 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  a buffer..**.** 
1fdf0 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f  pPayload is a po
1fe00 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73 74  inter to data st
1fe10 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65  ored on database
1fe20 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a   page pDbPage..*
1fe30 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f  * If argument eO
1fe40 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  p is false, then
1fe50 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
1fe60 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a  data are copied.
1fe70 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64  ** from pPayload
1fe80 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70   to the buffer p
1fe90 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42 75  ointed at by pBu
1fea0 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72 75  f. If eOp is tru
1feb0 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74  e,.** then sqlit
1fec0 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
1fed0 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50  s called on pDbP
1fee0 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79  age and nByte by
1fef0 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61  tes.** of data a
1ff00 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74  re copied from t
1ff10 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20 74  he buffer pBuf t
1ff20 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a  o pPayload..**.*
1ff30 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1ff40 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
1ff50 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e  ss, otherwise an
1ff60 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
1ff70 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50  static int copyP
1ff80 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a  ayload(.  void *
1ff90 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20  pPayload,       
1ffa0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1ffb0 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  o page data */. 
1ffc0 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
1ffd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1ffe0 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
1fff0 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20  */.  int nByte, 
20000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20010 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
20020 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69  s to copy */.  i
20030 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20  nt eOp,         
20040 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e           /* 0 ->
20050 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c   copy from page,
20060 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61   1 -> copy to pa
20070 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ge */.  DbPage *
20080 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20 20  pDbPage         
20090 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
200a0 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f  ning pPayload */
200b0 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b  .){.  if( eOp ){
200c0 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74  .    /* Copy dat
200d0 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f  a from buffer to
200e0 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20 6f   page (a write o
200f0 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
20100 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
20110 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
20120 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
20130 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
20140 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
20150 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
20160 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c  (pPayload, pBuf,
20170 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65   nByte);.  }else
20180 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
20190 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20  ta from page to 
201a0 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20 6f  buffer (a read o
201b0 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
201c0 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50   memcpy(pBuf, pP
201d0 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a  ayload, nByte);.
201e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
201f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
20200 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
20210 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f  s used to read o
20220 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c  r overwrite payl
20230 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  oad information.
20240 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79  ** for the entry
20250 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20 63   that the pCur c
20260 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
20270 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a 2a  g to. The eOp.**
20280 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 6e 74   argument is int
20290 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c  erpreted as foll
202a0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20  ows:.**.**   0: 
202b0 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  The operation is
202c0 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c 61 74   a read. Populat
202d0 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
202e0 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54 68  ache..**   1: Th
202f0 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
20300 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61 74 65   write. Populate
20310 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61   the overflow ca
20320 63 68 65 2e 0a 2a 2a 20 20 20 32 3a 20 54 68 65  che..**   2: The
20330 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20   operation is a 
20340 72 65 61 64 2e 20 44 6f 20 6e 6f 74 20 70 6f 70  read. Do not pop
20350 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  ulate the overfl
20360 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  ow cache..**.** 
20370 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22  A total of "amt"
20380 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64 20   bytes are read 
20390 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e  or written begin
203a0 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22  ning at "offset"
203b0 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61  ..** Data is rea
203c0 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65  d to or from the
203d0 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a   buffer pBuf..**
203e0 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  .** The content 
203f0 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77 72  being read or wr
20400 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70 65  itten might appe
20410 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70  ar on the main p
20420 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61  age.** or be sca
20430 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75  ttered out on mu
20440 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20  ltiple overflow 
20450 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pages..**.** If 
20460 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
20470 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e  or entry uses on
20480 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
20490 6f 77 20 70 61 67 65 73 20 61 6e 64 20 74 68 65  ow pages and the
204a0 0a 2a 2a 20 65 4f 70 20 61 72 67 75 6d 65 6e 74  .** eOp argument
204b0 20 69 73 20 6e 6f 74 20 32 2c 20 74 68 69 73 20   is not 2, this 
204c0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c 6c  function may all
204d0 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
204e0 61 6e 64 20 6c 61 7a 69 6c 79 20 0a 2a 2a 20 70  and lazily .** p
204f0 6f 70 6c 75 61 74 65 73 20 74 68 65 20 6f 76 65  opluates the ove
20500 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
20510 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74 43  cache array (BtC
20520 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29  ursor.aOverflow)
20530 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74  . .** Subsequent
20540 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 20   calls use this 
20550 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65  cache to make se
20560 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  eking to the sup
20570 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a 2a 2a  plied offset .**
20580 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e   more efficient.
20590 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f  .**.** Once an o
205a0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
205b0 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
205c0 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d   allocated, it m
205d0 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  ay be.** invalid
205e0 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68  ated if some oth
205f0 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65 73  er cursor writes
20600 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62   to the same tab
20610 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65  le, or if.** the
20620 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64   cursor is moved
20630 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
20640 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  row. Additionall
20650 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  y, in auto-vacuu
20660 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66  m.** mode, the f
20670 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20  ollowing events 
20680 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61  may invalidate a
20690 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  n overflow page-
206a0 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  list cache..**.*
206b0 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65  *   * An increme
206c0 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20  ntal vacuum,.** 
206d0 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20    * A commit in 
206e0 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c  auto_vacuum="ful
206f0 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20  l" mode,.**   * 
20700 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65  Creating a table
20710 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f   (may require mo
20720 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77  ving an overflow
20730 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69   page)..*/.stati
20740 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c  c int accessPayl
20750 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
20760 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
20770 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
20780 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
20790 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66  from */.  u32 of
207a0 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f  fset,          /
207b0 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20  * Begin reading 
207c0 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61  this far into pa
207d0 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61  yload */.  u32 a
207e0 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
207f0 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e  /* Read this man
20800 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73  y bytes */.  uns
20810 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66  igned char *pBuf
20820 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62  , /* Write the b
20830 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62  ytes into this b
20840 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20  uffer */ .  int 
20850 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20  eOp             
20860 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64   /* zero to read
20870 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72  . non-zero to wr
20880 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  ite. */.){.  uns
20890 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79  igned char *aPay
208a0 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  load;.  int rc =
208b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33   SQLITE_OK;.  u3
208c0 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49  2 nKey;.  int iI
208d0 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  dx = 0;.  MemPag
208e0 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
208f0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
20900 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70  age]; /* Btree p
20910 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65  age of current e
20920 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72  ntry */.  BtShar
20930 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
20940 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
20950 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74        /* Btree t
20960 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e  his cursor belon
20970 67 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 62  gs to */.  int b
20980 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
20990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
209a0 75 65 20 69 66 20 72 65 61 64 69 6e 67 20 74 6f  ue if reading to
209b0 20 65 6e 64 20 6f 66 20 64 61 74 61 20 2a 2f 0a   end of data */.
209c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
209d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
209e0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
209f0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
20a00 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
20a10 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
20a20 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
20a30 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
20a40 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
20a50 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66  );..  getCellInf
20a60 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c  o(pCur);.  aPayl
20a70 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  oad = pCur->info
20a80 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69  .pCell + pCur->i
20a90 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e  nfo.nHeader;.  n
20aa0 4b 65 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e  Key = (pPage->in
20ab0 74 4b 65 79 20 3f 20 30 20 3a 20 28 69 6e 74 29  tKey ? 0 : (int)
20ac0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29  pCur->info.nKey)
20ad0 3b 0a 20 20 62 45 6e 64 20 3d 20 28 6f 66 66 73  ;.  bEnd = (offs
20ae0 65 74 2b 61 6d 74 3d 3d 6e 4b 65 79 2b 70 43 75  et+amt==nKey+pCu
20af0 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 29 3b 0a  r->info.nData);.
20b00 0a 20 20 69 66 28 20 4e 45 56 45 52 28 6f 66 66  .  if( NEVER(off
20b10 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70  set+amt > nKey+p
20b20 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 29  Cur->info.nData)
20b30 20 0a 20 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61   .   || &aPayloa
20b40 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
20b50 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61  cal] > &pPage->a
20b60 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65  Data[pBt->usable
20b70 53 69 7a 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f  Size].  ){.    /
20b80 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64  * Trying to read
20b90 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74   or write past t
20ba0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
20bb0 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a  ta is an error *
20bc0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
20bd0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
20be0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
20bf0 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62  k if data must b
20c00 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74  e read/written t
20c10 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65  o/from the btree
20c20 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f   page itself. */
20c30 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43  .  if( offset<pC
20c40 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
20c50 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61  ){.    int a = a
20c60 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66  mt;.    if( a+of
20c70 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset>pCur->info.
20c80 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
20c90 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  a = pCur->info.n
20ca0 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a  Local - offset;.
20cb0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
20cc0 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
20cd0 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42  load[offset], pB
20ce0 75 66 2c 20 61 2c 20 28 65 4f 70 20 26 20 30 78  uf, a, (eOp & 0x
20cf0 30 31 29 2c 20 70 50 61 67 65 2d 3e 70 44 62 50  01), pPage->pDbP
20d00 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74  age);.    offset
20d10 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b   = 0;.    pBuf +
20d20 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  = a;.    amt -= 
20d30 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
20d40 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e  offset -= pCur->
20d50 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  info.nLocal;.  }
20d60 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
20d70 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
20d80 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20  {.    const u32 
20d90 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ovflSize = pBt->
20da0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20  usableSize - 4; 
20db0 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e   /* Bytes conten
20dc0 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20  t per ovfl page 
20dd0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  */.    Pgno next
20de0 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50  Page;..    nextP
20df0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
20e00 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
20e10 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20  nfo.nLocal]);.. 
20e20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 54 43     /* If the BTC
20e30 46 5f 49 6e 63 72 62 6c 6f 62 20 66 6c 61 67 20  F_Incrblob flag 
20e40 69 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 42  is set and the B
20e50 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
20e60 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e  w[].    ** has n
20e70 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ot been allocate
20e80 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e  d, allocate it n
20e90 6f 77 2e 20 54 68 65 20 61 72 72 61 79 20 69 73  ow. The array is
20ea0 20 73 69 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a   sized at.    **
20eb0 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65   one entry for e
20ec0 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ach overflow pag
20ed0 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
20ee0 77 20 63 68 61 69 6e 2e 20 54 68 65 0a 20 20 20  w chain. The.   
20ef0 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20   ** page number 
20f00 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  of the first ove
20f10 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 73 74  rflow page is st
20f20 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f  ored in aOverflo
20f30 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63  w[0],.    ** etc
20f40 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69  . A value of 0 i
20f50 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b  n the aOverflow[
20f60 5d 20 61 72 72 61 79 20 6d 65 61 6e 73 20 22 6e  ] array means "n
20f70 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20  ot yet known".  
20f80 20 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65 20    ** (the cache 
20f90 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61  is lazily popula
20fa0 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ted)..    */.   
20fb0 20 69 66 28 20 65 4f 70 21 3d 32 20 26 26 20 28   if( eOp!=2 && (
20fc0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
20fd0 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
20fe0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
20ff0 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e   nOvfl = (pCur->
21000 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43  info.nPayload-pC
21010 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b  ur->info.nLocal+
21020 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c  ovflSize-1)/ovfl
21030 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Size;.      if( 
21040 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76 66  nOvfl>pCur->nOvf
21050 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  lAlloc ){.      
21060 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20 28    Pgno *aNew = (
21070 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 44 62 52  Pgno*)sqlite3DbR
21080 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
21090 20 20 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65      pCur->pBtree
210a0 2d 3e 64 62 2c 20 70 43 75 72 2d 3e 61 4f 76 65  ->db, pCur->aOve
210b0 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73  rflow, nOvfl*2*s
210c0 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20  izeof(Pgno).    
210d0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
210e0 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
210f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
21100 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
21110 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21120 20 20 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c 41      pCur->nOvflA
21130 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a  lloc = nOvfl*2;.
21140 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
21150 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77  aOverflow = aNew
21160 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21170 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
21180 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21190 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43         memset(pC
211a0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30  ur->aOverflow, 0
211b0 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50  , nOvfl*sizeof(P
211c0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 70  gno));.        p
211d0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
211e0 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b   BTCF_ValidOvfl;
211f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
21200 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76      /* If the ov
21210 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
21220 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20   cache has been 
21230 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
21240 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66  e.    ** entry f
21250 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71  or the first req
21260 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70  uired overflow p
21270 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b  age is valid, sk
21280 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  ip.    ** direct
21290 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f  ly to it..    */
212a0 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e  .    if( (pCur->
212b0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
212c0 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 20 26 26  ValidOvfl)!=0 &&
212d0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
212e0 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  [offset/ovflSize
212f0 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20  ] ){.      iIdx 
21300 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  = (offset/ovflSi
21310 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50  ze);.      nextP
21320 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
21330 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20  rflow[iIdx];.   
21340 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66     offset = (off
21350 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set%ovflSize);. 
21360 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 20 3b     }..    for( ;
21370 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
21380 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50  & amt>0 && nextP
21390 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 20  age; iIdx++){.. 
213a0 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69       /* If requi
213b0 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  red, populate th
213c0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
213d0 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20  list cache. */. 
213e0 20 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e       if( (pCur->
213f0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
21400 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 20 29 7b  ValidOvfl)!=0 ){
21410 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
21420 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  !pCur->aOverflow
21430 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e  [iIdx] || pCur->
21440 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d  aOverflow[iIdx]=
21450 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  =nextPage);.    
21460 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
21470 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74  low[iIdx] = next
21480 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Page;.      }.. 
21490 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e       if( offset>
214a0 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20  =ovflSize ){.   
214b0 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79       /* The only
214c0 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20   reason to read 
214d0 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20  this page is to 
214e0 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a  obtain the page.
214f0 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
21500 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70  r for the next p
21510 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
21520 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
21530 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  age.        ** d
21540 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69  ata is not requi
21550 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72  red. So first tr
21560 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20  y to lookup the 
21570 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20  overflow.       
21580 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61   ** page-list ca
21590 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65  che, if any, the
215a0 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  n fall back to t
215b0 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  he getOverflowPa
215c0 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20  ge().        ** 
215d0 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  function..      
215e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
215f0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
21600 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
21610 6c 29 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  l)!=0 && pCur->a
21620 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
21630 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
21640 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  xtPage = pCur->a
21650 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
21660 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ;.        } else
21670 20 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d   .          rc =
21680 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
21690 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20  (pBt, nextPage, 
216a0 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20  0, &nextPage);. 
216b0 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d         offset -=
216c0 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20   ovflSize;.     
216d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
216e0 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20  /* Need to read 
216f0 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72  this page proper
21700 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20  ly. It contains 
21710 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20  some of the.    
21720 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20      ** range of 
21730 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69  data that is bei
21740 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29  ng read (eOp==0)
21750 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70   or written (eOp
21760 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f  !=0)..        */
21770 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
21780 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
21790 45 41 44 0a 20 20 20 20 20 20 20 20 73 71 6c 69  EAD.        sqli
217a0 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 23 65  te3_file *fd;.#e
217b0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e 74  ndif.        int
217c0 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20   a = amt;.      
217d0 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74    if( a + offset
217e0 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20   > ovflSize ){. 
217f0 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66           a = ovf
21800 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  lSize - offset;.
21810 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65          }..#ifde
21820 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
21830 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
21840 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20        /* If all 
21850 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
21860 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20 20  e true:.        
21870 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
21880 31 29 20 74 68 69 73 20 69 73 20 61 20 72 65 61  1) this is a rea
21890 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64  d operation, and
218a0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 32   .        **   2
218b0 29 20 64 61 74 61 20 69 73 20 72 65 71 75 69 72  ) data is requir
218c0 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72  ed from the star
218d0 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66 6c  t of this overfl
218e0 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20 20  ow page, and.   
218f0 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68 65       **   3) the
21900 20 64 61 74 61 62 61 73 65 20 69 73 20 66 69 6c   database is fil
21910 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20  e-backed, and.  
21920 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68        **   4) th
21930 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77  ere is no open w
21940 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
21950 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  , and.        **
21960 20 20 20 35 29 20 74 68 65 20 64 61 74 61 62 61     5) the databa
21970 73 65 20 69 73 20 6e 6f 74 20 61 20 57 41 4c 20  se is not a WAL 
21980 64 61 74 61 62 61 73 65 2c 0a 20 20 20 20 20 20  database,.      
21990 20 20 2a 2a 20 20 20 36 29 20 61 6c 6c 20 64 61    **   6) all da
219a0 74 61 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ta from the page
219b0 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 2e 0a   is being read..
219c0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
219d0 20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20     ** then data 
219e0 63 61 6e 20 62 65 20 72 65 61 64 20 64 69 72 65  can be read dire
219f0 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61  ctly from the da
21a00 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f  tabase file into
21a10 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
21a20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c 20 62  output buffer, b
21a30 79 70 61 73 73 69 6e 67 20 74 68 65 20 70 61 67  ypassing the pag
21a40 65 2d 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68  e-cache altogeth
21a50 65 72 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a  er. This speeds.
21a60 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f          ** up lo
21a70 61 64 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f  ading large reco
21a80 72 64 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61  rds that span ma
21a90 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
21aa0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
21ab0 20 20 20 20 20 20 69 66 28 20 28 65 4f 70 26 30        if( (eOp&0
21ac0 78 30 31 29 3d 3d 30 20 20 20 20 20 20 20 20 20  x01)==0         
21ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21af0 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (1) */.         
21b00 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20  && offset==0    
21b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b30 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a        /* (2) */.
21b40 20 20 20 20 20 20 20 20 20 26 26 20 28 62 45 6e           && (bEn
21b50 64 20 7c 7c 20 61 3d 3d 6f 76 66 6c 53 69 7a 65  d || a==ovflSize
21b60 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
21b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21b80 2a 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (6) */.       
21b90 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e    && pBt->inTran
21ba0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52  saction==TRANS_R
21bb0 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20 20  EAD             
21bc0 20 20 20 20 20 20 20 20 2f 2a 20 28 34 29 20 2a          /* (4) *
21bd0 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 66  /.         && (f
21be0 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
21bf0 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72  File(pBt->pPager
21c00 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20 20  ))->pMethods    
21c10 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20   /* (3) */.     
21c20 20 20 20 20 26 26 20 70 42 74 2d 3e 70 50 61 67      && pBt->pPag
21c30 65 31 2d 3e 61 44 61 74 61 5b 31 39 5d 3d 3d 30  e1->aData[19]==0
21c40 78 30 31 20 20 20 20 20 20 20 20 20 20 20 20 20  x01             
21c50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 35 29            /* (5)
21c60 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20   */.        ){. 
21c70 20 20 20 20 20 20 20 20 20 75 38 20 61 53 61 76           u8 aSav
21c80 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  e[4];.          
21c90 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42  u8 *aWrite = &pB
21ca0 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20  uf[-4];.        
21cb0 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20    memcpy(aSave, 
21cc0 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20  aWrite, 4);.    
21cd0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21ce0 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72  e3OsRead(fd, aWr
21cf0 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70  ite, a+4, (i64)p
21d00 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65  Bt->pageSize*(ne
21d10 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20  xtPage-1));.    
21d20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
21d30 20 67 65 74 34 62 79 74 65 28 61 57 72 69 74 65   get4byte(aWrite
21d40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
21d50 63 70 79 28 61 57 72 69 74 65 2c 20 61 53 61 76  cpy(aWrite, aSav
21d60 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d  e, 4);.        }
21d70 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20  else.#endif..   
21d80 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
21d90 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
21da0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
21db0 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
21dc0 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72  uire(pBt->pPager
21dd0 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62  , nextPage, &pDb
21de0 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Page,.          
21df0 20 20 20 20 28 28 65 4f 70 26 30 78 30 31 29 3d      ((eOp&0x01)=
21e00 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52  =0 ? PAGER_GET_R
21e10 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20  EADONLY : 0).   
21e20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
21e30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
21e40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
21e50 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20       aPayload = 
21e60 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
21e70 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ata(pDbPage);.  
21e80 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
21e90 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50  ge = get4byte(aP
21ea0 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20  ayload);.       
21eb0 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61       rc = copyPa
21ec0 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b  yload(&aPayload[
21ed0 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c  offset+4], pBuf,
21ee0 20 61 2c 20 28 65 4f 70 26 30 78 30 31 29 2c 20   a, (eOp&0x01), 
21ef0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
21f00 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
21f10 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
21f20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 66  ;.            of
21f30 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
21f40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
21f50 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61          amt -= a
21f60 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66 20 2b  ;.        pBuf +
21f70 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = a;.      }.   
21f80 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
21f90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
21fa0 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  mt>0 ){.    retu
21fb0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
21fc0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
21fd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
21fe0 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74  * Read part of t
21ff0 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65  he key associate
22000 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43  d with cursor pC
22010 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20  ur.  Exactly.** 
22020 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
22030 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69   be transfered i
22040 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
22050 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
22060 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
22070 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
22080 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
22090 61 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  at pCur is point
220a0 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72  ing to a valid r
220b0 6f 77 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61 62  ow.** in the tab
220c0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  le..**.** Return
220d0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
220e0 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
220f0 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
22100 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
22110 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72  .  An error is r
22120 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73  eturned if "offs
22130 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65  et+amt" is large
22140 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76  r than.** the av
22150 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e  ailable payload.
22160 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
22170 74 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72  treeKey(BtCursor
22180 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
22190 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
221a0 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65  d *pBuf){.  asse
221b0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
221c0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
221d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
221e0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
221f0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
22200 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
22210 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
22220 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
22230 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
22240 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
22250 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ]<pCur->apPage[p
22260 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
22270 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  ll );.  return a
22280 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
22290 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
222a0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
222b0 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  pBuf, 0);.}../*.
222c0 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20  ** Read part of 
222d0 74 68 65 20 64 61 74 61 20 61 73 73 6f 63 69 61  the data associa
222e0 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
222f0 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
22300 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
22310 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64  ll be transfered
22320 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
22330 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
22340 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
22350 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  "..**.** Return 
22360 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
22370 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
22380 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
22390 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
223a0 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
223b0 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
223c0 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
223d0 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
223e0 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
223f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
22400 72 65 65 44 61 74 61 28 42 74 43 75 72 73 6f 72  reeData(BtCursor
22410 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
22420 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
22430 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20  d *pBuf){.  int 
22440 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  rc;..#ifndef SQL
22450 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
22460 42 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65  B.  if ( pCur->e
22470 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
22480 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
22490 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  urn SQLITE_ABORT
224a0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
224b0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
224c0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
224d0 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
224e0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
224f0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
22500 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22510 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
22520 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
22530 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72  LID );.    asser
22540 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
22550 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
22560 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
22570 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
22580 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
22590 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
225a0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
225b0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72  ->nCell );.    r
225c0 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
225d0 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
225e0 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20  amt, pBuf, 0);. 
225f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
22600 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
22610 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79  a pointer to pay
22620 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
22630 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20   from the entry 
22640 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75  that the .** pCu
22650 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
22660 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f  ting to.  The po
22670 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20  inter is to the 
22680 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20  beginning of.** 
22690 74 68 65 20 6b 65 79 20 69 66 20 69 6e 64 65 78  the key if index
226a0 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e   btrees (pPage->
226b0 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69  intKey==0) and i
226c0 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 0a 2a  s the data for.*
226d0 2a 20 74 61 62 6c 65 20 62 74 72 65 65 73 20 28  * table btrees (
226e0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31  pPage->intKey==1
226f0 29 2e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ). The number of
22700 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61   bytes of availa
22710 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20  ble.** key/data 
22720 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
22730 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74  *pAmt.  If *pAmt
22740 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ==0, then the va
22750 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  lue.** returned 
22760 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76 61  will not be a va
22770 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  lid pointer..**.
22780 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
22790 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
227a0 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f  on.  It is commo
227b0 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65  n for the entire
227c0 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61   key.** and data
227d0 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c   to fit on the l
227e0 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f  ocal page and fo
227f0 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f  r there to be no
22800 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67   overflow.** pag
22810 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69  es.  When that i
22820 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69  s so, this routi
22830 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ne can be used t
22840 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20  o access the.** 
22850 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74  key and data wit
22860 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f  hout making a co
22870 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20  py.  If the key 
22880 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c  and/or data spil
22890 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66  ls.** onto overf
228a0 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20  low pages, then 
228b0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20  accessPayload() 
228c0 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20  must be used to 
228d0 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68  reassemble.** th
228e0 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63  e key/data and c
228f0 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72  opy it into a pr
22900 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65  eallocated buffe
22910 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  r..**.** The poi
22920 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79  nter returned by
22930 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f   this routine lo
22940 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74  oks directly int
22950 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20  o the cached.** 
22960 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
22970 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20  base.  The data 
22980 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20  might change or 
22990 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69  move the next ti
229a0 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20  me.** any btree 
229b0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
229c0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  d..*/.static con
229d0 73 74 20 76 6f 69 64 20 2a 66 65 74 63 68 50 61  st void *fetchPa
229e0 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
229f0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
22a00 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
22a10 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
22a20 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
22a30 2a 70 41 6d 74 20 20 20 20 20 20 20 20 20 20 20  *pAmt           
22a40 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
22a50 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
22a60 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a  e bytes here */.
22a70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ){.  assert( pCu
22a80 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50  r!=0 && pCur->iP
22a90 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
22aa0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
22ab0 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge]);.  assert( 
22ac0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
22ad0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
22ae0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
22af0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
22b00 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
22b10 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
22b20 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
22b30 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
22b40 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
22b50 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
22b60 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
22b70 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
22b80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
22b90 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20 29  ->info.nSize>0 )
22ba0 3b 0a 23 69 66 20 30 0a 20 20 69 66 28 20 70 43  ;.#if 0.  if( pC
22bb0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
22bc0 30 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50 61  0 ){.    btreePa
22bd0 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70  rseCell(pCur->ap
22be0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
22bf0 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  ], pCur->aiIdx[p
22c00 43 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20 20  Cur->iPage],.   
22c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
22c30 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 41 6d 74  }.#endif.  *pAmt
22c40 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
22c50 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 28  ocal;.  return (
22c60 76 6f 69 64 2a 29 28 70 43 75 72 2d 3e 69 6e 66  void*)(pCur->inf
22c70 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e  o.pCell + pCur->
22c80 69 6e 66 6f 2e 6e 48 65 61 64 65 72 29 3b 0a 7d  info.nHeader);.}
22c90 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  .../*.** For the
22ca0 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73   entry that curs
22cb0 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  or pCur is point
22cc0 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a   to, return as.*
22cd0 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20  * many bytes of 
22ce0 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20  the key or data 
22cf0 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  as are available
22d00 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a   on the local.**
22d10 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57   b-tree page.  W
22d20 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
22d30 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74  of available byt
22d40 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a  es into *pAmt..*
22d50 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
22d60 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68   returned is eph
22d70 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79  emeral.  The key
22d80 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a  /data may move.*
22d90 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65  * or be destroye
22da0 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61  d on the next ca
22db0 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20  ll to any Btree 
22dc0 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c  routine,.** incl
22dd0 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d  uding calls from
22de0 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61   other threads a
22df0 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20  gainst the same 
22e00 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c  cache..** Hence,
22e10 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20   a mutex on the 
22e20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20  BtShared should 
22e30 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f  be held prior to
22e40 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73   calling.** this
22e50 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
22e60 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69  These routines i
22e70 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75  s used to get qu
22e80 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65  ick access to ke
22e90 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e  y and data.** in
22ea0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
22eb0 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c   where no overfl
22ec0 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65  ow pages are use
22ed0 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64  d..*/.const void
22ee0 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65   *sqlite3BtreeKe
22ef0 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  yFetch(BtCursor 
22f00 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74  *pCur, u32 *pAmt
22f10 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63  ){.  return fetc
22f20 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
22f30 41 6d 74 29 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f  Amt);.}.const vo
22f40 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
22f50 44 61 74 61 46 65 74 63 68 28 42 74 43 75 72 73  DataFetch(BtCurs
22f60 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
22f70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66  Amt){.  return f
22f80 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
22f90 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  , pAmt);.}.../*.
22fa0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
22fb0 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77  or down to a new
22fc0 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68   child page.  Th
22fd0 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65  e newPgno argume
22fe0 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67  nt is the.** pag
22ff0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
23000 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f  child page to mo
23010 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ve to..**.** Thi
23020 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
23030 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ns SQLITE_CORRUP
23040 54 20 69 66 20 74 68 65 20 70 61 67 65 2d 68 65  T if the page-he
23050 61 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64  ader flags field
23060 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63   of.** the new c
23070 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e  hild page does n
23080 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61  ot match the fla
23090 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  gs field of the 
230a0 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20  parent (i.e..** 
230b0 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67  if an intkey pag
230c0 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  e appears to be 
230d0 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20  the parent of a 
230e0 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c  non-intkey page,
230f0 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73   or.** vice-vers
23100 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  a)..*/.static in
23110 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74  t moveToChild(Bt
23120 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
23130 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e  2 newPgno){.  in
23140 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20  t rc;.  int i = 
23150 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d  pCur->iPage;.  M
23160 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65  emPage *pNewPage
23170 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
23180 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a  t = pCur->pBt;..
23190 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
231a0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
231b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
231c0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
231d0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
231e0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
231f0 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44  e<BTCURSOR_MAX_D
23200 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  EPTH );.  assert
23210 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
23220 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
23230 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52  iPage>=(BTCURSOR
23240 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b  _MAX_DEPTH-1) ){
23250 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
23260 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
23270 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41  .  }.  rc = getA
23280 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
23290 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61  newPgno, &pNewPa
232a0 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge,.            
232b0 20 20 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61     (pCur->curFla
232c0 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46  gs & BTCF_WriteF
232d0 6c 61 67 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f  lag)==0 ? PAGER_
232e0 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30  GET_READONLY : 0
232f0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
23300 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d  turn rc;.  pCur-
23310 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70  >apPage[i+1] = p
23320 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d  NewPage;.  pCur-
23330 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b  >aiIdx[i+1] = 0;
23340 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b  .  pCur->iPage++
23350 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ;..  pCur->info.
23360 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
23370 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
23380 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
23390 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
233a0 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d  .  if( pNewPage-
233b0 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e 65 77  >nCell<1 || pNew
233c0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 21 3d 70 43  Page->intKey!=pC
233d0 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 69  ur->apPage[i]->i
233e0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74  ntKey ){.    ret
233f0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
23400 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
23410 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
23420 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20  .}..#if 0./*.** 
23430 50 61 67 65 20 70 50 61 72 65 6e 74 20 69 73 20  Page pParent is 
23440 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e  an internal (non
23450 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61 67 65  -leaf) tree page
23460 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
23470 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74  .** asserts that
23480 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68   page number iCh
23490 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d  ild is the left-
234a0 63 68 69 6c 64 20 69 66 20 74 68 65 20 69 49 64  child if the iId
234b0 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20  x'th.** cell in 
234c0 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72  page pParent. Or
234d0 2c 20 69 66 20 69 49 64 78 20 69 73 20 65 71 75  , if iIdx is equ
234e0 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20  al to the total 
234f0 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c  number of.** cel
23500 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74  ls in pParent, t
23510 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  hat page number 
23520 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 72 69  iChild is the ri
23530 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20  ght-child of.** 
23540 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
23550 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 50  tic void assertP
23560 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61  arentIndex(MemPa
23570 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74  ge *pParent, int
23580 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69   iIdx, Pgno iChi
23590 6c 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  ld){.  assert( i
235a0 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  Idx<=pParent->nC
235b0 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64  ell );.  if( iId
235c0 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  x==pParent->nCel
235d0 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  l ){.    assert(
235e0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65   get4byte(&pPare
235f0 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
23600 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
23610 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65  ==iChild );.  }e
23620 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
23630 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
23640 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78  ll(pParent, iIdx
23650 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20  ))==iChild );.  
23660 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66  }.}.#else.#  def
23670 69 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e 74  ine assertParent
23680 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65  Index(x,y,z) .#e
23690 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ndif../*.** Move
236a0 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74   the cursor up t
236b0 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
236c0 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69  e..**.** pCur->i
236d0 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  dx is set to the
236e0 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74   cell index that
236f0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f   contains the po
23700 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
23710 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69  page we are comi
23720 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20  ng from.  If we 
23730 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20  are coming from 
23740 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73  the.** right-mos
23750 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65  t child page the
23760 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  n pCur->idx is s
23770 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74  et to one more t
23780 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65  han.** the large
23790 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a  st cell index..*
237a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f  /.static void mo
237b0 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72  veToParent(BtCur
237c0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
237d0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
237e0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
237f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23800 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
23810 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
23820 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20  ( pCur->iPage>0 
23830 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
23840 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
23850 69 50 61 67 65 5d 20 29 3b 0a 0a 20 20 2f 2a 20  iPage] );..  /* 
23860 55 50 44 41 54 45 3a 20 49 74 20 69 73 20 61 63  UPDATE: It is ac
23870 74 75 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20  tually possible 
23880 66 6f 72 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  for the conditio
23890 6e 20 74 65 73 74 65 64 20 62 79 20 74 68 65 20  n tested by the 
238a0 61 73 73 65 72 74 0a 20 20 2a 2a 20 62 65 6c 6f  assert.  ** belo
238b0 77 20 74 6f 20 62 65 20 75 6e 74 72 75 65 20 69  w to be untrue i
238c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
238d0 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2e 20  ile is corrupt. 
238e0 54 68 69 73 20 63 61 6e 20 6f 63 63 75 72 20 69  This can occur i
238f0 66 0a 20 20 2a 2a 20 6f 6e 65 20 63 75 72 73 6f  f.  ** one curso
23900 72 20 68 61 73 20 6d 6f 64 69 66 69 65 64 20 70  r has modified p
23910 61 67 65 20 70 50 61 72 65 6e 74 20 77 68 69 6c  age pParent whil
23920 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  e a reference to
23930 20 69 74 20 69 73 20 68 65 6c 64 20 0a 20 20 2a   it is held .  *
23940 2a 20 62 79 20 61 20 73 65 63 6f 6e 64 20 63 75  * by a second cu
23950 72 73 6f 72 2e 20 57 68 69 63 68 20 63 61 6e 20  rsor. Which can 
23960 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61  only happen if a
23970 20 73 69 6e 67 6c 65 20 70 61 67 65 20 69 73 20   single page is 
23980 6c 69 6e 6b 65 64 0a 20 20 2a 2a 20 69 6e 74 6f  linked.  ** into
23990 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62   more than one b
239a0 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
239b0 69 6e 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  in a corrupt dat
239c0 61 62 61 73 65 2e 20 20 2a 2f 0a 23 69 66 20 30  abase.  */.#if 0
239d0 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  .  assertParentI
239e0 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e  ndex(.    pCur->
239f0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
23a00 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72  ge-1], .    pCur
23a10 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
23a20 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75  age-1], .    pCu
23a30 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
23a40 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29  iPage]->pgno.  )
23a50 3b 0a 23 65 6e 64 69 66 0a 20 20 74 65 73 74 63  ;.#endif.  testc
23a60 61 73 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ase( pCur->aiIdx
23a70 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20  [pCur->iPage-1] 
23a80 3e 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  > pCur->apPage[p
23a90 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e  Cur->iPage-1]->n
23aa0 43 65 6c 6c 20 29 3b 0a 0a 20 20 72 65 6c 65 61  Cell );..  relea
23ab0 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
23ac0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
23ad0 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  );.  pCur->iPage
23ae0 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  --;.  pCur->info
23af0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
23b00 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
23b10 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
23b20 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
23b30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
23b40 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f  the cursor to po
23b50 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  int to the root 
23b60 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72  page of its b-tr
23b70 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ee structure..**
23b80 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65  .** If the table
23b90 20 68 61 73 20 61 20 76 69 72 74 75 61 6c 20 72   has a virtual r
23ba0 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74  oot page, then t
23bb0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
23bc0 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74  ed to point.** t
23bd0 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f  o the virtual ro
23be0 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61 64 20  ot page instead 
23bf0 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f  of the actual ro
23c00 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65  ot page. A table
23c10 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61   has a.** virtua
23c20 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e  l root page when
23c30 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74   the actual root
23c40 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
23c50 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a  o cells and a .*
23c60 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70  * single child p
23c70 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e  age. This can on
23c80 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68 20 74  ly happen with t
23c90 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20  he table rooted 
23ca0 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a  at page 1..**.**
23cb0 20 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 73   If the b-tree s
23cc0 74 72 75 63 74 75 72 65 20 69 73 20 65 6d 70 74  tructure is empt
23cd0 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  y, the cursor st
23ce0 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a  ate is set to .*
23cf0 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  * CURSOR_INVALID
23d00 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
23d10 20 63 75 72 73 6f 72 20 69 73 20 73 65 74 20 74   cursor is set t
23d20 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  o point to the f
23d30 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63  irst.** cell loc
23d40 61 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74  ated on the root
23d50 20 28 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f   (or virtual roo
23d60 74 29 20 70 61 67 65 20 61 6e 64 20 74 68 65 20  t) page and the 
23d70 63 75 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20  cursor state.** 
23d80 69 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52  is set to CURSOR
23d90 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66  _VALID..**.** If
23da0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
23db0 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75  eturns successfu
23dc0 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61  lly, it may be a
23dd0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a  ssumed that the.
23de0 2a 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20 66  ** page-header f
23df0 6c 61 67 73 20 69 6e 64 69 63 61 74 65 20 74 68  lags indicate th
23e00 61 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d  at the [virtual]
23e10 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68   root-page is th
23e20 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b  e expected .** k
23e30 69 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61  ind of b-tree pa
23e40 67 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e  ge (i.e. if when
23e50 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72   opening the cur
23e60 73 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64  sor the caller d
23e70 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66  id not.** specif
23e80 79 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  y a KeyInfo stru
23e90 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20  cture the flags 
23ea0 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30  byte is set to 0
23eb0 78 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20  x05 or 0x0D,.** 
23ec0 69 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61 62  indicating a tab
23ed0 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66  le b-tree, or if
23ee0 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20   the caller did 
23ef0 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66  specify a KeyInf
23f00 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  o .** structure 
23f10 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69  the flags byte i
23f20 73 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72  s set to 0x02 or
23f30 20 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e   0x0A, indicatin
23f40 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d  g an index.** b-
23f50 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  tree)..*/.static
23f60 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28   int moveToRoot(
23f70 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
23f80 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  .  MemPage *pRoo
23f90 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
23fa0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
23fb0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
23fc0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
23fd0 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49  assert( CURSOR_I
23fe0 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f  NVALID < CURSOR_
23ff0 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
24000 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
24010 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52  VALID   < CURSOR
24020 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
24030 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
24040 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f  _FAULT   > CURSO
24050 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
24060 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
24070 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
24080 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69  IRESEEK ){.    i
24090 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
240a0 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
240b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
240c0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53  Cur->skipNext!=S
240d0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
240e0 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
240f0 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  kipNext;.    }. 
24100 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
24110 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29  learCursor(pCur)
24120 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75  ;.  }..  if( pCu
24130 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20  r->iPage>=0 ){. 
24140 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
24150 69 50 61 67 65 20 29 20 72 65 6c 65 61 73 65 50  iPage ) releaseP
24160 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
24170 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29  [pCur->iPage--])
24180 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43  ;.  }else if( pC
24190 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
241a0 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  ){.    pCur->eSt
241b0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
241c0 41 4c 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  ALID;.    return
241d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
241e0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 67 65  lse{.    rc = ge
241f0 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 43 75  tAndInitPage(pCu
24200 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c 20  r->pBtree->pBt, 
24210 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
24220 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  &pCur->apPage[0]
24230 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24240 20 20 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61     (pCur->curFla
24250 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46  gs & BTCF_WriteF
24260 6c 61 67 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f  lag)==0 ? PAGER_
24270 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30  GET_READONLY : 0
24280 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
24290 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
242a0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
242b0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
242c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
242d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
242e0 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d  ->iPage = 0;.  }
242f0 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d  .  pRoot = pCur-
24300 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73  >apPage[0];.  as
24310 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e  sert( pRoot->pgn
24320 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  o==pCur->pgnoRoo
24330 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43  t );..  /* If pC
24340 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20  ur->pKeyInfo is 
24350 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
24360 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f  he caller that o
24370 70 65 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f  pened this curso
24380 72 0a 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20  r.  ** expected 
24390 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e  to open it on an
243a0 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f   index b-tree. O
243b0 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65  therwise, if pKe
243c0 79 49 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55  yInfo is.  ** NU
243d0 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65  LL, the caller e
243e0 78 70 65 63 74 73 20 61 20 74 61 62 6c 65 20 62  xpects a table b
243f0 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73 20 69  -tree. If this i
24400 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a  s not the case,.
24410 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53    ** return an S
24420 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72  QLITE_CORRUPT er
24430 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ror. .  **.  ** 
24440 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73  Earlier versions
24450 20 6f 66 20 53 51 4c 69 74 65 20 61 73 73 75 6d   of SQLite assum
24460 65 64 20 74 68 61 74 20 74 68 69 73 20 74 65 73  ed that this tes
24470 74 20 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c  t could not fail
24480 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f  .  ** if the roo
24490 74 20 70 61 67 65 20 77 61 73 20 61 6c 72 65 61  t page was alrea
244a0 64 79 20 6c 6f 61 64 65 64 20 77 68 65 6e 20 74  dy loaded when t
244b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  his function was
244c0 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20   called (i.e..  
244d0 2a 2a 20 69 66 20 70 43 75 72 2d 3e 69 50 61 67  ** if pCur->iPag
244e0 65 3e 3d 30 29 2e 20 42 75 74 20 74 68 69 73 20  e>=0). But this 
244f0 69 73 20 6e 6f 74 20 73 6f 20 69 66 20 74 68 65  is not so if the
24500 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72   database is cor
24510 72 75 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20  rupted .  ** in 
24520 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74 20  such a way that 
24530 70 61 67 65 20 70 52 6f 6f 74 20 69 73 20 6c 69  page pRoot is li
24540 6e 6b 65 64 20 69 6e 74 6f 20 61 20 73 65 63 6f  nked into a seco
24550 6e 64 20 62 2d 74 72 65 65 20 74 61 62 6c 65 20  nd b-tree table 
24560 0a 20 20 2a 2a 20 28 6f 72 20 74 68 65 20 66 72  .  ** (or the fr
24570 65 65 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61  eelist).  */.  a
24580 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e  ssert( pRoot->in
24590 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74  tKey==1 || pRoot
245a0 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20  ->intKey==0 );. 
245b0 20 69 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e   if( pRoot->isIn
245c0 69 74 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e  it==0 || (pCur->
245d0 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52  pKeyInfo==0)!=pR
245e0 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  oot->intKey ){. 
245f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
24600 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
24610 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49 64   }..  pCur->aiId
24620 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72  x[0] = 0;.  pCur
24630 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
24640 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
24650 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c  gs &= ~(BTCF_AtL
24660 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b  ast|BTCF_ValidNK
24670 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
24680 6c 29 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74  l);..  if( pRoot
24690 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20  ->nCell>0 ){.   
246a0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
246b0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
246c0 7d 65 6c 73 65 20 69 66 28 20 21 70 52 6f 6f 74  }else if( !pRoot
246d0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
246e0 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20  no subpage;.    
246f0 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21  if( pRoot->pgno!
24700 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =1 ) return SQLI
24710 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
24720 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67  .    subpage = g
24730 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e  et4byte(&pRoot->
24740 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72  aData[pRoot->hdr
24750 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
24760 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
24770 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
24780 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
24790 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29  d(pCur, subpage)
247a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
247b0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
247c0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
247d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
247e0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
247f0 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
24800 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  the left-most le
24810 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
24820 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f   the.** entry to
24830 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
24840 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
24850 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d  .**.** The left-
24860 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65  most leaf is the
24870 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d   one with the sm
24880 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65  allest key - the
24890 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63   first.** in asc
248a0 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
248b0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
248c0 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72  ToLeftmost(BtCur
248d0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
248e0 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
248f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
24900 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
24910 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
24920 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
24930 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
24940 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
24950 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
24960 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
24970 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20  E_OK && !(pPage 
24980 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
24990 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
249a0 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  af ){.    assert
249b0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
249c0 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65  ur->iPage]<pPage
249d0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70  ->nCell );.    p
249e0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66  gno = get4byte(f
249f0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
24a00 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
24a10 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72  >iPage]));.    r
24a20 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
24a30 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
24a40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24a50 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
24a60 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
24a70 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65  he right-most le
24a80 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
24a90 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
24aa0 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
24ab0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20  ently pointing. 
24ac0 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66   Notice the diff
24ad0 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65  erence.** betwee
24ae0 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
24af0 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67  () and moveToRig
24b00 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54  htmost().  moveT
24b10 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  oLeftmost().** f
24b20 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  inds the left-mo
24b30 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
24b40 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65   the *entry* whe
24b50 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74  reas moveToRight
24b60 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
24b70 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
24b80 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
24b90 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54   *page*..**.** T
24ba0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
24bb0 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77  try is the one w
24bc0 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
24bd0 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a  key - the last.*
24be0 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69  * key in ascendi
24bf0 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
24c00 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69  tic int moveToRi
24c10 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  ghtmost(BtCursor
24c20 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
24c30 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
24c40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
24c50 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
24c60 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
24c70 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
24c80 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
24c90 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
24ca0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
24cb0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
24cc0 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65  TE_OK && !(pPage
24cd0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
24ce0 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c  pCur->iPage])->l
24cf0 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20  eaf ){.    pgno 
24d00 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
24d10 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
24d20 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
24d30 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
24d40 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50  Cur->iPage] = pP
24d50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  age->nCell;.    
24d60 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
24d70 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
24d80 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
24d90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75  TE_OK ){.    pCu
24da0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
24db0 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e  Page] = pPage->n
24dc0 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43 75 72  Cell-1;.    pCur
24dd0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
24de0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46  ;.    pCur->curF
24df0 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 56 61  lags &= ~BTCF_Va
24e00 6c 69 64 4e 4b 65 79 3b 0a 20 20 7d 0a 20 20 72  lidNKey;.  }.  r
24e10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
24e20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
24e30 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
24e40 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ry in the table.
24e50 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
24e60 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
24e70 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20  .  Set *pRes to 
24e80 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  0 if the cursor 
24e90 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20  actually points 
24ea0 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
24eb0 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  or set *pRes to 
24ec0 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  1 if the table i
24ed0 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
24ee0 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73  sqlite3BtreeFirs
24ef0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
24f00 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
24f10 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
24f20 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
24f30 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
24f40 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
24f50 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
24f60 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
24f70 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76  x) );.  rc = mov
24f80 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
24f90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24fa0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  OK ){.    if( pC
24fb0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
24fc0 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
24fd0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
24fe0 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
24ff0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
25000 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
25010 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  l==0 );.      *p
25020 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Res = 1;.    }el
25030 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
25040 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
25050 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
25060 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  ll>0 );.      *p
25070 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
25080 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
25090 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  st(pCur);.    }.
250a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
250b0 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
250c0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61  cursor to the la
250d0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
250e0 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
250f0 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
25100 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
25110 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
25120 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
25130 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
25140 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
25150 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
25160 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
25170 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
25180 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20  eeLast(BtCursor 
25190 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
251a0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20  ){.  int rc;. . 
251b0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
251c0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
251d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
251e0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
251f0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
25200 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
25210 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
25220 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74  already points t
25230 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
25240 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
25250 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53  p. */.  if( CURS
25260 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
25270 65 53 74 61 74 65 20 26 26 20 28 70 43 75 72 2d  eState && (pCur-
25280 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
25290 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 23  _AtLast)!=0 ){.#
252a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
252b0 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62  UG.    /* This b
252c0 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61  lock serves to a
252d0 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65  ssert() that the
252e0 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64   cursor really d
252f0 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a  oes point .    *
25300 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  * to the last en
25310 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65  try in the b-tre
25320 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  e. */.    int ii
25330 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
25340 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  ii<pCur->iPage; 
25350 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  ii++){.      ass
25360 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
25370 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61  [ii]==pCur->apPa
25380 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  ge[ii]->nCell );
25390 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
253a0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
253b0 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75  Cur->iPage]==pCu
253c0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
253d0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20  iPage]->nCell-1 
253e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
253f0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
25400 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29  ->iPage]->leaf )
25410 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
25420 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
25430 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
25440 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
25450 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
25460 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53   ){.    if( CURS
25470 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
25480 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
25490 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
254a0 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
254b0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
254c0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d  ->iPage]->nCell=
254d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  =0 );.      *pRe
254e0 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  s = 1;.    }else
254f0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
25500 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
25510 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
25520 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
25530 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
25540 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
25550 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
25560 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25570 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
25580 67 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c 61 73  gs |= BTCF_AtLas
25590 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
255a0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75          pCur->cu
255b0 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
255c0 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 0a  AtLast;.      }.
255d0 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20     .    }.  }.  
255e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
255f0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
25600 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
25610 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e  ts to an entry n
25620 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20  ear the key .** 
25630 73 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64  specified by pId
25640 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20  xKey or intKey. 
25650 20 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65    Return a succe
25660 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46  ss code..**.** F
25670 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73  or INTKEY tables
25680 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72  , the intKey par
25690 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20  ameter is used. 
256a0 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73   pIdxKey .** mus
256b0 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20  t be NULL.  For 
256c0 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49  index tables, pI
256d0 64 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e  dxKey is used an
256e0 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69  d intKey.** is i
256f0 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  gnored..**.** If
25700 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20   an exact match 
25710 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68  is not found, th
25720 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
25730 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20   always.** left 
25740 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65  pointing at a le
25750 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f  af page which wo
25760 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74  uld hold the ent
25770 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65  ry if it.** were
25780 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63   present.  The c
25790 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e  ursor might poin
257a0 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68  t to an entry th
257b0 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f  at comes.** befo
257c0 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20  re or after the 
257d0 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e  key..**.** An in
257e0 74 65 67 65 72 20 69 73 20 77 72 69 74 74 65 6e  teger is written
257f0 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63   into *pRes whic
25800 68 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20  h is the result 
25810 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20  of.** comparing 
25820 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65  the key with the
25830 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
25840 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a  the cursor is .*
25850 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65  * pointing.  The
25860 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20   meaning of the 
25870 69 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e 20  integer written 
25880 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73  into.** *pRes is
25890 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
258a0 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20  **     *pRes<0  
258b0 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
258c0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
258d0 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
258e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
258f0 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20       is smaller 
25900 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
25910 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61  Key or if the ta
25920 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20  ble is empty.** 
25930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25940 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
25950 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66  is therefore lef
25960 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69  t point to nothi
25970 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ng..**.**     *p
25980 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63  Res==0     The c
25990 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
259a0 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
259b0 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
259c0 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63              exac
259d0 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b  tly matches intK
259e0 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a  ey/pIdxKey..**.*
259f0 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20  *     *pRes>0   
25a00 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
25a10 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
25a20 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
25a30 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
25a40 20 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68      is larger th
25a50 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  an intKey/pIdxKe
25a60 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c  y..**.*/.int sql
25a70 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
25a80 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72  npacked(.  BtCur
25a90 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
25aa0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
25ab0 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f  r to be moved */
25ac0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
25ad0 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55  d *pIdxKey, /* U
25ae0 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65  npacked index ke
25af0 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65  y */.  i64 intKe
25b00 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
25b10 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79  /* The table key
25b20 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69   */.  int biasRi
25b30 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ght,           /
25b40 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20  * If true, bias 
25b50 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68  the search to th
25b60 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20  e high end */.  
25b70 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
25b80 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
25b90 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73  e search results
25ba0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
25bb0 74 20 72 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f  t rc;.  RecordCo
25bc0 6d 70 61 72 65 20 78 52 65 63 6f 72 64 43 6f 6d  mpare xRecordCom
25bd0 70 61 72 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  pare;..  assert(
25be0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
25bf0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
25c00 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
25c10 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
25c20 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
25c30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
25c40 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  es );.  assert( 
25c50 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70  (pIdxKey==0)==(p
25c60 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
25c70 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
25c80 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65  e cursor is alre
25c90 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61  ady positioned a
25ca0 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61  t the point we a
25cb0 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74  re trying.  ** t
25cc0 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20  o move to, then 
25cd0 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69 74 68  just return with
25ce0 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f  out doing any wo
25cf0 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72  rk */.  if( pCur
25d00 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
25d10 5f 56 41 4c 49 44 20 26 26 20 28 70 43 75 72 2d  _VALID && (pCur-
25d20 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
25d30 5f 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20  _ValidNKey)!=0. 
25d40 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67    && pCur->apPag
25d50 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20  e[0]->intKey .  
25d60 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
25d70 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b  >info.nKey==intK
25d80 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
25d90 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
25da0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
25db0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 43     }.    if( (pC
25dc0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
25dd0 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 26  TCF_AtLast)!=0 &
25de0 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  & pCur->info.nKe
25df0 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y<intKey ){.    
25e00 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
25e10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25e20 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
25e30 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79 20 29  .  if( pIdxKey )
25e40 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d  {.    xRecordCom
25e50 70 61 72 65 20 3d 20 73 71 6c 69 74 65 33 56 64  pare = sqlite3Vd
25e60 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 70 49  beFindCompare(pI
25e70 64 78 4b 65 79 29 3b 0a 20 20 20 20 70 49 64 78  dxKey);.    pIdx
25e80 4b 65 79 2d 3e 69 73 43 6f 72 72 75 70 74 20 3d  Key->isCorrupt =
25e90 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
25ea0 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74  pIdxKey->default
25eb0 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20 20 20 20  _rc==1 .        
25ec0 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66   || pIdxKey->def
25ed0 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20  ault_rc==0 .    
25ee0 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d       || pIdxKey-
25ef0 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a  >default_rc==-1.
25f00 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a      );.  }else{.
25f10 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61      xRecordCompa
25f20 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b  re = 0; /* All k
25f30 65 79 73 20 61 72 65 20 69 6e 74 65 67 65 72 73  eys are integers
25f40 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20   */.  }..  rc = 
25f50 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
25f60 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
25f70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
25f80 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
25f90 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
25fa0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
25fb0 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
25fc0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
25fd0 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
25fe0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
25ff0 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b  Page]->isInit );
26000 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
26010 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
26020 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  INVALID || pCur-
26030 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
26040 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  age]->nCell>0 );
26050 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
26060 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
26070 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  LID ){.    *pRes
26080 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72   = -1;.    asser
26090 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
260a0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
260b0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
260c0 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
260d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
260e0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  _OK;.  }.  asser
260f0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
26100 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49  0]->intKey || pI
26110 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b  dxKey );.  for(;
26120 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c  ;){.    int lwr,
26130 20 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20 20   upr, idx, c;.  
26140 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20    Pgno chldPg;. 
26150 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
26160 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
26170 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
26180 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20     u8 *pCell;   
26190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261a0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
261b0 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c  r to current cel
261c0 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20  l in pPage */.. 
261d0 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65     /* pPage->nCe
261e0 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61 74  ll must be great
261f0 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66  er than zero. If
26200 20 74 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f   this is the roo
26210 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68  t-page.    ** th
26220 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68  e cursor would h
26230 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44  ave been INVALID
26240 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20   above and this 
26250 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20  for(;;) loop.   
26260 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20   ** not run. If 
26270 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
26280 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20  root-page, then 
26290 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  the moveToChild(
262a0 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  ) routine.    **
262b0 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65   would have alre
262c0 61 64 79 20 64 65 74 65 63 74 65 64 20 64 62 20  ady detected db 
262d0 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69  corruption. Simi
262e0 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73  larly, pPage mus
262f0 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20  t.    ** be the 
26300 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65  right kind (inde
26310 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62  x or table) of b
26320 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65  -tree page. Othe
26330 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d  rwise.    ** a m
26340 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20  oveToChild() or 
26350 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c  moveToRoot() cal
26360 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74  l would have det
26370 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e  ected corruption
26380 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
26390 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ( pPage->nCell>0
263a0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
263b0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28  pPage->intKey==(
263c0 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20  pIdxKey==0) );. 
263d0 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20     lwr = 0;.    
263e0 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  upr = pPage->nCe
263f0 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  ll-1;.    assert
26400 28 20 62 69 61 73 52 69 67 68 74 3d 3d 30 20 7c  ( biasRight==0 |
26410 7c 20 62 69 61 73 52 69 67 68 74 3d 3d 31 20 29  | biasRight==1 )
26420 3b 0a 20 20 20 20 69 64 78 20 3d 20 75 70 72 3e  ;.    idx = upr>
26430 3e 28 31 2d 62 69 61 73 52 69 67 68 74 29 3b 20  >(1-biasRight); 
26440 2f 2a 20 69 64 78 20 3d 20 62 69 61 73 52 69 67  /* idx = biasRig
26450 68 74 20 3f 20 75 70 72 20 3a 20 28 6c 77 72 2b  ht ? upr : (lwr+
26460 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 70  upr)/2; */.    p
26470 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
26480 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69  >iPage] = (u16)i
26490 64 78 3b 0a 20 20 20 20 69 66 28 20 78 52 65 63  dx;.    if( xRec
264a0 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b  ordCompare==0 ){
264b0 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a  .      for(;;){.
264c0 20 20 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c          i64 nCel
264d0 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70 43  lKey;.        pC
264e0 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
264f0 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61  Page, idx) + pPa
26500 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
26510 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
26520 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
26530 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
26540 20 30 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c   0x80 <= *(pCell
26550 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ++) ){.         
26560 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50     if( pCell>=pP
26570 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 20  age->aDataEnd ) 
26580 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
26590 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
265a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
265b0 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72  }.        getVar
265c0 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a  int(pCell, (u64*
265d0 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  )&nCellKey);.   
265e0 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65       if( nCellKe
265f0 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y<intKey ){.    
26600 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b        lwr = idx+
26610 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  1;.          if(
26620 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20   lwr>upr ){ c = 
26630 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20  -1; break; }.   
26640 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
26650 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29  CellKey>intKey )
26660 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20  {.          upr 
26670 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20  = idx-1;.       
26680 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
26690 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b  { c = +1; break;
266a0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
266b0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
266c0 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e  rt( nCellKey==in
266d0 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20  tKey );.        
266e0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
266f0 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b   |= BTCF_ValidNK
26700 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  ey;.          pC
26710 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20  ur->info.nKey = 
26720 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
26730 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
26740 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
26750 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
26760 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
26770 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
26780 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20     lwr = idx;.  
26790 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
267a0 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72  oveto_next_layer
267b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
267c0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  e{.            *
267d0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
267e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
267f0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
26800 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
26810 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
26820 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
26830 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b      assert( lwr+
26840 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  upr>=0 );.      
26850 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72    idx = (lwr+upr
26860 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20  )>>1;  /* idx = 
26870 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a  (lwr+upr)/2; */.
26880 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
26890 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29  e{.      for(;;)
268a0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  {.        int nC
268b0 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 65  ell;.        pCe
268c0 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
268d0 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67  age, idx) + pPag
268e0 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
268f0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ..        /* The
26900 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74   maximum support
26910 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20  ed page-size is 
26920 36 35 35 33 36 20 62 79 74 65 73 2e 20 54 68 69  65536 bytes. Thi
26930 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20  s means that.   
26940 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69       ** the maxi
26950 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  mum number of re
26960 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72 65  cord bytes store
26970 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d  d on an index B-
26980 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  Tree.        ** 
26990 70 61 67 65 20 69 73 20 6c 65 73 73 20 74 68 61  page is less tha
269a0 6e 20 31 36 33 38 34 20 62 79 74 65 73 20 61 6e  n 16384 bytes an
269b0 64 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20  d may be stored 
269c0 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20  as a 2-byte.    
269d0 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54      ** varint. T
269e0 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
269f0 69 73 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d  is used to attem
26a00 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73  pt to avoid pars
26a10 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ing .        ** 
26a20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20  the entire cell 
26a30 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  by checking for 
26a40 74 68 65 20 63 61 73 65 73 20 77 68 65 72 65 20  the cases where 
26a50 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20  the record is . 
26a60 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64         ** stored
26a70 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e   entirely within
26a80 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65   the b-tree page
26a90 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74   by inspecting t
26aa0 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 20 20  he first .      
26ab0 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20    ** 2 bytes of 
26ac0 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20  the cell..      
26ad0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43 65    */.        nCe
26ae0 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20  ll = pCell[0];. 
26af0 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
26b00 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74  <=pPage->max1byt
26b10 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20  ePayload ){.    
26b20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
26b30 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68 65  anch runs if the
26b40 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65   record-size fie
26b50 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69  ld of the cell i
26b60 73 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  s a.          **
26b70 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72   single byte var
26b80 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f  int and the reco
26b90 72 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79  rd fits entirely
26ba0 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20   on the main.   
26bb0 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65         ** b-tree
26bc0 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
26bd0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
26be0 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50  Cell+nCell+1==pP
26bf0 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b  age->aDataEnd );
26c00 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78  .          c = x
26c10 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
26c20 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
26c30 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 2c 20  ll[1], pIdxKey, 
26c40 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0);.        }els
26c50 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d  e if( !(pCell[1]
26c60 20 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20   & 0x80) .      
26c70 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20      && (nCell = 
26c80 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37  ((nCell&0x7f)<<7
26c90 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70  ) + pCell[1])<=p
26ca0 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20  Page->maxLocal. 
26cb0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
26cc0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72      /* The recor
26cd0 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20  d-size field is 
26ce0 61 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20  a 2 byte varint 
26cf0 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a  and the record .
26d00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74            ** fit
26d10 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68  s entirely on th
26d20 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61  e main b-tree pa
26d30 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
26d40 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c    testcase( pCel
26d50 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65  l+nCell+2==pPage
26d60 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20  ->aDataEnd );.  
26d70 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
26d80 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
26d90 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
26da0 32 5d 2c 20 70 49 64 78 4b 65 79 2c 20 30 29 3b  2], pIdxKey, 0);
26db0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
26dc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
26dd0 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76   record flows ov
26de0 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d  er onto one or m
26df0 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
26e00 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20  es. In.         
26e10 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74 68   ** this case th
26e20 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65  e whole cell nee
26e30 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c  ds to be parsed,
26e40 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61   a buffer alloca
26e50 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ted.          **
26e60 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f   and accessPaylo
26e70 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65 74  ad() used to ret
26e80 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72 64  rieve the record
26e90 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
26ea0 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65      ** buffer be
26eb0 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64 43  fore VdbeRecordC
26ec0 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65 20  ompare() can be 
26ed0 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20  called. */.     
26ee0 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c       void *pCell
26ef0 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75  Key;.          u
26f00 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42  8 * const pCellB
26f10 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50  ody = pCell - pP
26f20 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
26f30 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62 74 72  e;.          btr
26f40 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
26f50 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c  Page, pCellBody,
26f60 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20   &pCur->info);. 
26f70 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d           nCell =
26f80 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f   (int)pCur->info
26f90 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  .nKey;.         
26fa0 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69   pCellKey = sqli
26fb0 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c  te3Malloc( nCell
26fc0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
26fd0 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b  ( pCellKey==0 ){
26fe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
26ff0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
27000 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
27010 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
27020 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27030 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
27040 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
27050 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20   (u16)idx;.     
27060 20 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73       rc = access
27070 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c  Payload(pCur, 0,
27080 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65   nCell, (unsigne
27090 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79  d char*)pCellKey
270a0 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 2);.          
270b0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
270c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
270d0 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  ee(pCellKey);.  
270e0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
270f0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
27100 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27110 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43      c = xRecordC
27120 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43  ompare(nCell, pC
27130 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 2c  ellKey, pIdxKey,
27140 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
27150 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c  qlite3_free(pCel
27160 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  lKey);.        }
27170 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
27180 20 70 49 64 78 4b 65 79 2d 3e 69 73 43 6f 72 72   pIdxKey->isCorr
27190 75 70 74 3d 3d 30 20 7c 7c 20 63 3d 3d 30 20 29  upt==0 || c==0 )
271a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3c  ;.        if( c<
271b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  0 ){.          l
271c0 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20  wr = idx+1;.    
271d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e      }else if( c>
271e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
271f0 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20  pr = idx-1;.    
27200 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27210 20 20 20 20 20 61 73 73 65 72 74 28 20 63 3d 3d       assert( c==
27220 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a  0 );.          *
27230 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
27240 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
27250 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  OK;.          pC
27260 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
27270 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64  iPage] = (u16)id
27280 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  x;.          if(
27290 20 70 49 64 78 4b 65 79 2d 3e 69 73 43 6f 72 72   pIdxKey->isCorr
272a0 75 70 74 20 29 20 72 63 20 3d 20 53 51 4c 49 54  upt ) rc = SQLIT
272b0 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  E_CORRUPT;.     
272c0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
272d0 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
272e0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c   }.        if( l
272f0 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b 0a  wr>upr ) break;.
27300 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
27310 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20  lwr+upr>=0 );.  
27320 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72        idx = (lwr
27330 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64  +upr)>>1;  /* id
27340 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 20  x = (lwr+upr)/2 
27350 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
27360 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72  .    assert( lwr
27370 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61 67  ==upr+1 || (pPag
27380 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50  e->intKey && !pP
27390 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20  age->leaf) );.  
273a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
273b0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69  >isInit );.    i
273c0 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
273d0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
273e0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
273f0 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
27400 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
27410 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  e]->nCell );.   
27420 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
27430 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
27440 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 2a 70  16)idx;.      *p
27450 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72  Res = c;.      r
27460 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
27470 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
27480 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d  _finish;.    }.m
27490 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72  oveto_next_layer
274a0 3a 0a 20 20 20 20 69 66 28 20 6c 77 72 3e 3d 70  :.    if( lwr>=p
274b0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
274c0 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
274d0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
274e0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
274f0 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d  ffset+8]);.    }
27500 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64  else{.      chld
27510 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  Pg = get4byte(fi
27520 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77  ndCell(pPage, lw
27530 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  r));.    }.    p
27540 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
27550 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c  >iPage] = (u16)l
27560 77 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  wr;.    rc = mov
27570 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63  eToChild(pCur, c
27580 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20  hldPg);.    if( 
27590 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  rc ) break;.  }.
275a0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20  moveto_finish:. 
275b0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
275c0 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
275d0 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
275e0 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
275f0 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 72  _ValidOvfl);.  r
27600 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
27610 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
27620 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
27630 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74   not pointing at
27640 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
27650 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52   table..**.** TR
27660 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  UE will be retur
27670 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ned after a call
27680 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
27690 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20  Next() moves.** 
276a0 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e  past the last en
276b0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
276c0 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65   or sqlite3Btree
276d0 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73  Prev() moves pas
276e0 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65  t.** the first e
276f0 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61  ntry.  TRUE is a
27700 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
27710 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
27720 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
27730 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72  e3BtreeEof(BtCur
27740 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a  sor *pCur){.  /*
27750 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74   TODO: What if t
27760 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20  he cursor is in 
27770 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
27780 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65  EK but all table
27790 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61   entries.  ** ha
277a0 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f  ve been deleted?
277b0 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e   This API will n
277c0 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f  eed to change to
277d0 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
277e0 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65   code.  ** as we
277f0 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61  ll as the boolea
27800 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a  n result value..
27810 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43    */.  return (C
27820 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75  URSOR_VALID!=pCu
27830 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f  r->eState);.}../
27840 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
27850 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
27860 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ext entry in the
27870 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
27880 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
27890 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
278a0 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
278b0 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
278c0 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  nting to the las
278d0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
278e0 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
278f0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
27900 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
27910 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a  set *pRes=1..**.
27920 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  ** The calling f
27930 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74  unction will set
27940 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31   *pRes to 0 or 1
27950 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a  .  The initial *
27960 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69  pRes value.** wi
27970 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65 20 63  ll be 1 if the c
27980 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70  ursor being step
27990 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  ped corresponds 
279a0 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20  to an SQL index 
279b0 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72  and.** if this r
279c0 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76  outine could hav
279d0 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69  e been skipped i
279e0 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78  f that SQL index
279f0 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75   had been.** a u
27a00 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74  nique index.  Ot
27a10 68 65 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c  herwise the call
27a20 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74  er will have set
27a30 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a   *pRes to zero..
27a40 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63  ** Zero is the c
27a50 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20  ommon case. The 
27a60 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
27a70 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20  tion is free to 
27a80 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69  use the.** initi
27a90 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61  al *pRes value a
27aa0 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72  s a hint to impr
27ab0 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c  ove performance,
27ac0 20 62 75 74 20 74 68 65 20 63 75 72 72 65 6e 74   but the current
27ad0 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65  .** SQLite btree
27ae0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
27af0 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20  does not. (Note 
27b00 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20  that the comdb2 
27b10 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  btree.** impleme
27b20 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65  ntation does use
27b30 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65   this hint, howe
27b40 76 65 72 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ver.).*/.int sql
27b50 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74  ite3BtreeNext(Bt
27b60 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
27b70 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
27b80 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  rc;.  int idx;. 
27b90 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
27ba0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
27bb0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
27bc0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
27bd0 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73  pRes!=0 );.  ass
27be0 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c  ert( *pRes==0 ||
27bf0 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61   *pRes==1 );.  a
27c00 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
27c10 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
27c20 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
27c30 5f 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20  _VALID );.  if( 
27c40 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
27c50 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
27c60 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
27c70 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b  flowCache(pCur);
27c80 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72  .    rc = restor
27c90 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
27ca0 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72  pCur);.    if( r
27cb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
27cc0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
27cd0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
27ce0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
27cf0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
27d00 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
27d10 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
27d20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
27d30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
27d40 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
27d50 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61  pNext ){.      a
27d60 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
27d70 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
27d80 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
27d90 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  e==CURSOR_SKIPNE
27da0 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72  XT );.      pCur
27db0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
27dc0 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69  R_VALID;.      i
27dd0 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
27de0 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  t>0 ){.        p
27df0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
27e00 30 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  0;.        *pRes
27e10 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
27e20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27e30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43        }.      pC
27e40 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
27e50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
27e60 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
27e70 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
27e80 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72  ;.  idx = ++pCur
27e90 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
27ea0 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
27eb0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
27ec0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  ..  /* If the da
27ed0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 63  tabase file is c
27ee0 6f 72 72 75 70 74 2c 20 69 74 20 69 73 20 70 6f  orrupt, it is po
27ef0 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 76  ssible for the v
27f00 61 6c 75 65 20 6f 66 20 69 64 78 20 0a 20 20 2a  alue of idx .  *
27f10 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 20  * to be invalid 
27f20 68 65 72 65 2e 20 54 68 69 73 20 63 61 6e 20 6f  here. This can o
27f30 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 61 20 73  nly occur if a s
27f40 65 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64  econd cursor mod
27f50 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 65 20 70  ifies.  ** the p
27f60 61 67 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72  age while cursor
27f70 20 70 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67   pCur is holding
27f80 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
27f90 69 74 2e 20 57 68 69 63 68 20 63 61 6e 0a 20 20  it. Which can.  
27fa0 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  ** only happen i
27fb0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
27fc0 73 20 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63  s corrupt in suc
27fd0 68 20 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69  h a way as to li
27fe0 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65  nk the.  ** page
27ff0 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20   into more than 
28000 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75 63  one b-tree struc
28010 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63  ture. */.  testc
28020 61 73 65 28 20 69 64 78 3e 70 50 61 67 65 2d 3e  ase( idx>pPage->
28030 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72  nCell );..  pCur
28040 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
28050 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
28060 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c  gs &= ~(BTCF_Val
28070 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
28080 64 4f 76 66 6c 29 3b 0a 20 20 69 66 28 20 69 64  dOvfl);.  if( id
28090 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x>=pPage->nCell 
280a0 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ){.    if( !pPag
280b0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
280c0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
280d0 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
280e0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
280f0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
28100 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  8]));.      if( 
28110 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  rc ){.        *p
28120 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
28130 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
28140 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 6d    }.      rc = m
28150 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
28160 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  ur);.      *pRes
28170 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
28180 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
28190 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70   do{.      if( p
281a0 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
281b0 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
281c0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72   1;.        pCur
281d0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
281e0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
281f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28200 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
28210 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28     moveToParent(
28220 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61  pCur);.      pPa
28230 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
28240 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
28250 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72      }while( pCur
28260 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
28270 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65  age]>=pPage->nCe
28280 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20  ll );.    *pRes 
28290 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61  = 0;.    if( pPa
282a0 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
282b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
282c0 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20  BtreeNext(pCur, 
282d0 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
282e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
282f0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
28300 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
28310 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20  .  *pRes = 0;.  
28320 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
28330 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
28340 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
28350 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
28360 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  st(pCur);.  retu
28370 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
28380 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72   Step the cursor
28390 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20   to the back to 
283a0 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74  the previous ent
283b0 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
283c0 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65  se.  If.** succe
283d0 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a  ssful then set *
283e0 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20  pRes=0.  If the 
283f0 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c  cursor.** was al
28400 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
28410 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
28420 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
28430 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
28440 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
28450 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
28460 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Res=1..**.** The
28470 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
28480 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73  n will set *pRes
28490 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65   to 0 or 1.  The
284a0 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76   initial *pRes v
284b0 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  alue.** will be 
284c0 31 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  1 if the cursor 
284d0 62 65 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f  being stepped co
284e0 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
284f0 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a  SQL index and.**
28500 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
28510 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   could have been
28520 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 61 74   skipped if that
28530 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62   SQL index had b
28540 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20  een.** a unique 
28550 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73  index.  Otherwis
28560 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  e the caller wil
28570 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52 65 73  l have set *pRes
28580 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72   to zero..** Zer
28590 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  o is the common 
285a0 63 61 73 65 2e 20 54 68 65 20 62 74 72 65 65 20  case. The btree 
285b0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
285c0 73 20 66 72 65 65 20 74 6f 20 75 73 65 20 74 68  s free to use th
285d0 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52  e.** initial *pR
285e0 65 73 20 76 61 6c 75 65 20 61 73 20 61 20 68 69  es value as a hi
285f0 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65  nt to improve pe
28600 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74  rformance, but t
28610 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51  he current.** SQ
28620 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65  Lite btree imple
28630 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e  mentation does n
28640 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74  ot. (Note that t
28650 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a  he comdb2 btree.
28660 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
28670 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69 73 20  n does use this 
28680 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a  hint, however.).
28690 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
286a0 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
286b0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
286c0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
286d0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
286e0 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
286f0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
28700 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
28710 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20  t( pRes!=0 );.  
28720 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30  assert( *pRes==0
28730 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a   || *pRes==1 );.
28740 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
28750 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
28760 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
28770 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70  SOR_VALID );.  p
28780 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
28790 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42   ~(BTCF_AtLast|B
287a0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
287b0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
287c0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
287d0 20 29 7b 0a 20 20 20 20 69 66 28 20 41 4c 57 41   ){.    if( ALWA
287e0 59 53 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  YS(pCur->eState>
287f0 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
28800 45 45 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 63  EEK) ){.      rc
28810 20 3d 20 62 74 72 65 65 52 65 73 74 6f 72 65 43   = btreeRestoreC
28820 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
28830 75 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ur);.      if( r
28840 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
28850 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
28860 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
28870 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
28880 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53    }.    if( CURS
28890 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
288a0 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
288b0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
288c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
288d0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
288e0 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
288f0 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t ){.      asser
28900 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
28910 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
28920 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
28930 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29  URSOR_SKIPNEXT )
28940 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  ;.      pCur->eS
28950 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
28960 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70  LID;.      if( p
28970 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20  Cur->skipNext<0 
28980 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
28990 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
289a0 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30         *pRes = 0
289b0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
289c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
289d0 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
289e0 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
289f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
28a00 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
28a10 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
28a20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
28a30 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21  sInit );.  if( !
28a40 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
28a50 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75     int idx = pCu
28a60 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
28a70 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20  Page];.    rc = 
28a80 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
28a90 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  , get4byte(findC
28aa0 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29  ell(pPage, idx))
28ab0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
28ac0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
28ad0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
28ae0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
28af0 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
28b00 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  t(pCur);.  }else
28b10 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75  {.    while( pCu
28b20 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
28b30 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  Page]==0 ){.    
28b40 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
28b50 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
28b60 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
28b70 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
28b80 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
28b90 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
28ba0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
28bb0 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f    }.      moveTo
28bc0 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
28bd0 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e    }.    pCur->in
28be0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
28bf0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
28c00 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
28c10 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
28c20 76 66 6c 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d  vfl);..    pCur-
28c30 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
28c40 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65  ge]--;.    pPage
28c50 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
28c60 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
28c70 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
28c80 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  Key && !pPage->l
28c90 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
28ca0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  = sqlite3BtreePr
28cb0 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65  evious(pCur, pRe
28cc0 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
28cd0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
28ce0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
28cf0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65   *pRes = 0;.  re
28d00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
28d10 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
28d20 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
28d30 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
28d40 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65  .** The new page
28d50 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69   is marked as di
28d60 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20  rty.  (In other 
28d70 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61  words, sqlite3Pa
28d80 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61  gerWrite().** ha
28d90 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
28da0 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77  alled on the new
28db0 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77   page.)  The new
28dc0 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a   page has also.*
28dd0 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65  * been reference
28de0 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e  d and the callin
28df0 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73  g routine is res
28e00 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c  ponsible for cal
28e10 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ling.** sqlite3P
28e20 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74  agerUnref() on t
28e30 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e  he new page when
28e40 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a   it is done..**.
28e50 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
28e60 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
28e70 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20  ess.  Any other 
28e80 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64  return value ind
28e90 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72  icates.** an err
28ea0 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64  or.  *ppPage and
28eb0 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65   *pPgno are unde
28ec0 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65  fined in the eve
28ed0 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a  nt of an error..
28ee0 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65  ** Do not invoke
28ef0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
28f00 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20  ef() on *ppPage 
28f10 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  if an error is r
28f20 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
28f30 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70  f the "nearby" p
28f40 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
28f50 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72  0, then an effor
28f60 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a  t is made to .**
28f70 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63   locate a page c
28f80 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65  lose to the page
28f90 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22   number "nearby"
28fa0 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  .  This can be u
28fb0 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74  sed in an.** att
28fc0 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c  empt to keep rel
28fd0 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65  ated pages close
28fe0 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69   to each other i
28ff0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
29000 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e  ile,.** which in
29010 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64   turn can make d
29020 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66  atabase access f
29030 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aster..**.** If 
29040 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65  the eMode parame
29050 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45  ter is BTALLOC_E
29060 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61  XACT and the nea
29070 72 62 79 20 70 61 67 65 20 65 78 69 73 74 73 0a  rby page exists.
29080 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  ** anywhere on t
29090 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
290a0 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  en it is guarant
290b0 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e  eed to be return
290c0 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65  ed.  If.** eMode
290d0 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74   is BTALLOC_LT t
290e0 68 65 6e 20 74 68 65 20 70 61 67 65 20 72 65 74  hen the page ret
290f0 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65  urned will be le
29100 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
29110 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66  .** to nearby if
29120 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 20 65   any such page e
29130 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65  xists.  If eMode
29140 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20   is BTALLOC_ANY 
29150 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72  then there.** ar
29160 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e  e no restriction
29170 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20  s on which page 
29180 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
29190 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
291a0 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20  ateBtreePage(.  
291b0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
291c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
291d0 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
291e0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
291f0 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72  /* Store pointer
29200 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   to the allocate
29210 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  d page here */. 
29220 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20   Pgno *pPgno,   
29230 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
29240 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
29250 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   here */.  Pgno 
29260 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20 20 20  nearby,         
29270 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
29280 61 20 70 61 67 65 20 6e 65 61 72 20 74 68 69 73  a page near this
29290 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f   one */.  u8 eMo
292a0 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  de              
292b0 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43   /* BTALLOC_EXAC
292c0 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f  T, BTALLOC_LT, o
292d0 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f  r BTALLOC_ANY */
292e0 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
292f0 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b  Page1;.  int rc;
29300 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a  .  u32 n;     /*
29310 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
29320 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
29330 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20   */.  u32 k;    
29340 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
29350 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e  aves on the trun
29360 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  k of the freelis
29370 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
29380 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65  pTrunk = 0;.  Me
29390 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e  mPage *pPrevTrun
293a0 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78  k = 0;.  Pgno mx
293b0 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74  Page;     /* Tot
293c0 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  al size of the d
293d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
293e0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
293f0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
29400 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
29410 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54  ssert( eMode==BT
29420 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65  ALLOC_ANY || (ne
29430 61 72 62 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f  arby>0 && IfNotO
29440 6d 69 74 41 56 28 70 42 74 2d 3e 61 75 74 6f 56  mitAV(pBt->autoV
29450 61 63 75 75 6d 29 29 20 29 3b 0a 20 20 70 50 61  acuum)) );.  pPa
29460 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
29470 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74  1;.  mxPage = bt
29480 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
29490 29 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74  );.  n = get4byt
294a0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
294b0 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73  [36]);.  testcas
294c0 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29  e( n==mxPage-1 )
294d0 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67  ;.  if( n>=mxPag
294e0 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
294f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
29500 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  KPT;.  }.  if( n
29510 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  >0 ){.    /* The
29520 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20  re are pages on 
29530 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52  the freelist.  R
29540 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73  euse one of thos
29550 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20  e pages. */.    
29560 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20  Pgno iTrunk;.   
29570 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d   u8 searchList =
29580 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72   0; /* If the fr
29590 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20  ee-list must be 
295a0 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65  searched for 'ne
295b0 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20  arby' */.    .  
295c0 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42    /* If eMode==B
295d0 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64  TALLOC_EXACT and
295e0 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20   a query of the 
295f0 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
29600 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68  ** shows that th
29610 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
29620 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20  is somewhere on 
29630 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
29640 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65  hen.    ** the e
29650 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20  ntire-list will 
29660 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
29670 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  that page..    *
29680 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
29690 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
296a0 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d  .    if( eMode==
296b0 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b  BTALLOC_EXACT ){
296c0 0a 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62  .      if( nearb
296d0 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  y<=mxPage ){.   
296e0 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20       u8 eType;. 
296f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
29700 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20  earby>0 );.     
29710 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
29720 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
29730 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
29740 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79  pGet(pBt, nearby
29750 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20  , &eType, 0);.  
29760 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
29770 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
29780 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
29790 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
297a0 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68            search
297b0 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  List = 1;.      
297c0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
297d0 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65 3d  }else if( eMode=
297e0 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20  =BTALLOC_LE ){. 
297f0 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
29800 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
29810 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  f..    /* Decrem
29820 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73  ent the free-lis
29830 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65  t count by 1. Se
29840 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20  t iTrunk to the 
29850 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20  index of the.   
29860 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c   ** first free-l
29870 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
29880 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e  iPrevTrunk is in
29890 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a  itially 1..    *
298a0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
298b0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
298c0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
298d0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
298e0 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62  rn rc;.    put4b
298f0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
29900 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20  ta[36], n-1);.. 
29910 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77     /* The code w
29920 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20  ithin this loop 
29930 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65  is run only once
29940 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c   if the 'searchL
29950 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20  ist' variable.  
29960 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65    ** is not true
29970 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
29980 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61  runs once for ea
29990 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e  ch trunk-page on
299a0 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65   the.    ** free
299b0 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20  -list until the 
299c0 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73  page 'nearby' is
299d0 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d   located (eMode=
299e0 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a  =BTALLOC_EXACT).
299f0 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20      ** or until 
29a00 61 20 70 61 67 65 20 6c 65 73 73 20 74 68 61 6e  a page less than
29a10 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
29a20 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41  ated (eMode==BTA
29a30 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a  LLOC_LT).    */.
29a40 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70      do {.      p
29a50 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75  PrevTrunk = pTru
29a60 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  nk;.      if( pP
29a70 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
29a80 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
29a90 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
29aa0 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  k->aData[0]);.  
29ab0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29ac0 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
29ad0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
29ae0 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20  ata[32]);.      
29af0 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
29b00 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  ( iTrunk==mxPage
29b10 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54   );.      if( iT
29b20 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a 20  runk>mxPage ){. 
29b30 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
29b40 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
29b50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
29b60 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
29b70 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72  GetPage(pBt, iTr
29b80 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
29b90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29ba0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
29bb0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
29bc0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
29bd0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
29be0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
29bf0 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b  rt( pTrunk!=0 );
29c00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
29c10 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20  Trunk->aData!=0 
29c20 29 3b 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65  );..      k = ge
29c30 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
29c40 61 44 61 74 61 5b 34 5d 29 3b 20 2f 2a 20 23 20  aData[4]); /* # 
29c50 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 69  of leaves on thi
29c60 73 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  s trunk page */.
29c70 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26        if( k==0 &
29c80 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b  & !searchList ){
29c90 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
29ca0 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61  trunk has no lea
29cb0 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74  ves and the list
29cc0 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65   is not being se
29cd0 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20  arched. .       
29ce0 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74   ** So extract t
29cf0 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74  he trunk page it
29d00 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20  self and use it 
29d10 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20  as the newly .  
29d20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
29d30 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ed page */.     
29d40 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76     assert( pPrev
29d50 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  Trunk==0 );.    
29d60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
29d70 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
29d80 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
29d90 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
29da0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
29db0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
29dc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29dd0 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75     *pPgno = iTru
29de0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  nk;.        memc
29df0 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
29e00 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
29e10 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
29e20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
29e30 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
29e40 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
29e50 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
29e60 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
29e70 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
29e80 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
29e90 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  n-1));.      }el
29ea0 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70  se if( k>(u32)(p
29eb0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
29ec0 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20   - 2) ){.       
29ed0 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69   /* Value of k i
29ee0 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20  s out of range. 
29ef0 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
29f00 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
29f10 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
29f20 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
29f30 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
29f40 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65  ate_page;.#ifnde
29f50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
29f60 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d  TOVACUUM.      }
29f70 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c  else if( searchL
29f80 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20  ist .           
29f90 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72   && (nearby==iTr
29fa0 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e  unk || (iTrunk<n
29fb0 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d  earby && eMode==
29fc0 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20  BTALLOC_LE)) .  
29fd0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f      ){.        /
29fe0 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65  * The list is be
29ff0 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64  ing searched and
2a000 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65   this trunk page
2a010 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20   is the page.   
2a020 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63       ** to alloc
2a030 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20  ate, regardless 
2a040 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61  of whether it ha
2a050 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20  s leaves..      
2a060 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50    */.        *pP
2a070 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20  gno = iTrunk;.  
2a080 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
2a090 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
2a0a0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
2a0b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2a0c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2a0d0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
2a0e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
2a0f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
2a100 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2a110 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
2a120 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20         if( k==0 
2a130 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2a140 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
2a150 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
2a160 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
2a170 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
2a180 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
2a190 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2a1a0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2a1b0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2a1c0 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
2a1d0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2a1e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2a1f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2a200 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2a210 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2a220 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2a230 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
2a240 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
2a250 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
2a260 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
2a270 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a280 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2a290 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
2a2a0 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64  page is required
2a2b0 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62   by the caller b
2a2c0 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a  ut it contains .
2a2d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69            ** poi
2a2e0 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69  nters to free-li
2a2f0 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66  st leaves. The f
2a300 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65  irst leaf become
2a310 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20  s a trunk.      
2a320 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74      ** page in t
2a330 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20  his case..      
2a340 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
2a350 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72   MemPage *pNewTr
2a360 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50  unk;.          P
2a370 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20  gno iNewTrunk = 
2a380 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
2a390 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20  ->aData[8]);.   
2a3a0 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54         if( iNewT
2a3b0 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a  runk>mxPage ){ .
2a3c0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2a3d0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2a3e0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
2a3f0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2a400 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2a410 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2a420 74 65 73 74 63 61 73 65 28 20 69 4e 65 77 54 72  testcase( iNewTr
2a430 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  unk==mxPage );. 
2a440 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74           rc = bt
2a450 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2a460 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77  iNewTrunk, &pNew
2a470 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
2a480 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2a490 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2a4a0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2a4b0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2a4c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a4d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2a4e0 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54  PagerWrite(pNewT
2a4f0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
2a500 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2a510 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2a520 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
2a530 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b  sePage(pNewTrunk
2a540 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
2a550 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2a560 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
2a570 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d   }.          mem
2a580 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
2a590 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
2a5a0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
2a5b0 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
2a5c0 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  yte(&pNewTrunk->
2a5d0 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
2a5e0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
2a5f0 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
2a600 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[8], &pTrunk->
2a610 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29  aData[12], (k-1)
2a620 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  *4);.          r
2a630 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
2a640 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
2a650 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
2a660 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2a670 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2a680 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2a690 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
2a6a0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2a6b0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
2a6c0 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65  ->aData[32], iNe
2a6d0 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
2a6e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a6f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2a700 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72  e3PagerWrite(pPr
2a710 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  evTrunk->pDbPage
2a720 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2a730 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2a740 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2a750 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2a760 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2a770 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
2a780 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  e(&pPrevTrunk->a
2a790 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75  Data[0], iNewTru
2a7a0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nk);.          }
2a7b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2a7c0 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
2a7d0 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
2a7e0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e  LLOCATE: %d trun
2a7f0 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65  k - %d free page
2a800 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e  s left\n", *pPgn
2a810 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66  o, n-1));.#endif
2a820 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2a830 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   k>0 ){.        
2a840 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61  /* Extract a lea
2a850 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b  f from the trunk
2a860 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20   */.        u32 
2a870 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20  closest;.       
2a880 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20   Pgno iPage;.   
2a890 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
2a8a0 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75  ar *aData = pTru
2a8b0 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  nk->aData;.     
2a8c0 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20     if( nearby>0 
2a8d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  ){.          u32
2a8e0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c   i;.          cl
2a8f0 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
2a900 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d       if( eMode==
2a910 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20  BTALLOC_LE ){.  
2a920 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
2a930 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<k; i++){.  
2a940 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61 67              iPag
2a950 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
2a960 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20  ata[8+i*4]);.   
2a970 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
2a980 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a  Page<=nearby ){.
2a990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a9a0 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20  closest = i;.   
2a9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
2a9c0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
2a9d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2a9e0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
2a9f0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e{.            i
2aa00 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20  nt dist;.       
2aa10 20 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69       dist = sqli
2aa20 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34  te3AbsInt32(get4
2aa30 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20  byte(&aData[8]) 
2aa40 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20  - nearby);.     
2aa50 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
2aa60 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<k; i++){.     
2aa70 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20           int d2 
2aa80 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33  = sqlite3AbsInt3
2aa90 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74  2(get4byte(&aDat
2aaa0 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72  a[8+i*4]) - near
2aab0 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  by);.           
2aac0 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29     if( d2<dist )
2aad0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2aae0 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20    closest = i;. 
2aaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
2ab00 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20  ist = d2;.      
2ab10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ab20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ab30 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
2ab40 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  e{.          clo
2ab50 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
2ab60 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61    }..        iPa
2ab70 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
2ab80 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
2ab90 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
2aba0 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50  case( iPage==mxP
2abb0 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  age );.        i
2abc0 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20  f( iPage>mxPage 
2abd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2abe0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2abf0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
2ac00 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2ac10 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2ac20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63   }.        testc
2ac30 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61  ase( iPage==mxPa
2ac40 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ge );.        if
2ac50 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 0a 20  ( !searchList . 
2ac60 20 20 20 20 20 20 20 20 7c 7c 20 28 69 50 61 67          || (iPag
2ac70 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69 50  e==nearby || (iP
2ac80 61 67 65 3c 6e 65 61 72 62 79 20 26 26 20 65 4d  age<nearby && eM
2ac90 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29  ode==BTALLOC_LE)
2aca0 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  ) .        ){.  
2acb0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f          int noCo
2acc0 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20  ntent;.         
2acd0 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b   *pPgno = iPage;
2ace0 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45  .          TRACE
2acf0 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
2ad00 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25  was leaf %d of %
2ad10 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20  d on trunk %d". 
2ad20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad30 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20  ": %d more free 
2ad40 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  pages\n",.      
2ad50 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e             *pPgn
2ad60 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c  o, closest+1, k,
2ad70 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e   pTrunk->pgno, n
2ad80 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1));.          
2ad90 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2ada0 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
2adb0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2adc0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2add0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2ade0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ge;.          if
2adf0 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b  ( closest<k-1 ){
2ae00 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
2ae10 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  cpy(&aData[8+clo
2ae20 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b  sest*4], &aData[
2ae30 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20  4+k*4], 4);.    
2ae40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ae50 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74    put4byte(&aDat
2ae60 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20  a[4], k-1);.    
2ae70 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20        noContent 
2ae80 3d 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f  = !btreeGetHasCo
2ae90 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e  ntent(pBt, *pPgn
2aea0 6f 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e  o) ? PAGER_GET_N
2aeb0 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20 20  OCONTENT : 0;.  
2aec0 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
2aed0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a  eeGetPage(pBt, *
2aee0 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e  pPgno, ppPage, n
2aef0 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20  oContent);.     
2af00 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2af10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2af20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2af30 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
2af40 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
2af50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2af60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2af70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2af80 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
2af90 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2afa0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2afb0 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63  .          searc
2afc0 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
2afd0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2afe0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2aff0 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20  PrevTrunk);.    
2b000 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30    pPrevTrunk = 0
2b010 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65  ;.    }while( se
2b020 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65  archList );.  }e
2b030 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  lse{.    /* Ther
2b040 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f  e are no pages o
2b050 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  n the freelist, 
2b060 73 6f 20 61 70 70 65 6e 64 20 61 20 6e 65 77 20  so append a new 
2b070 70 61 67 65 20 74 6f 20 74 68 65 0a 20 20 20 20  page to the.    
2b080 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  ** database imag
2b090 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
2b0a0 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70   Normally, new p
2b0b0 61 67 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ages allocated b
2b0c0 79 20 74 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e  y this block can
2b0d0 20 62 65 20 72 65 71 75 65 73 74 65 64 20 66 72   be requested fr
2b0e0 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61  om the.    ** pa
2b0f0 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74  ger layer with t
2b100 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20  he 'no-content' 
2b110 66 6c 61 67 20 73 65 74 2e 20 54 68 69 73 20 70  flag set. This p
2b120 72 65 76 65 6e 74 73 20 74 68 65 20 70 61 67 65  revents the page
2b130 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72  r.    ** from tr
2b140 79 69 6e 67 20 74 6f 20 72 65 61 64 20 74 68 65  ying to read the
2b150 20 70 61 67 65 73 20 63 6f 6e 74 65 6e 74 20 66   pages content f
2b160 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76 65  rom disk. Howeve
2b170 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a  r, if the.    **
2b180 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
2b190 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
2b1a0 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   run one or more
2b1b0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63   incremental-vac
2b1c0 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70 73  uum.    ** steps
2b1d0 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
2b1e0 77 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20  we are about to 
2b1f0 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e  allocate may con
2b200 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20  tain content.   
2b210 20 2a 2a 20 74 68 61 74 20 69 73 20 72 65 71 75   ** that is requ
2b220 69 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ired in the even
2b230 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  t of a rollback.
2b240 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 64   In this case, d
2b250 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74  o.    ** not set
2b260 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20   the no-content 
2b270 66 6c 61 67 2e 20 54 68 69 73 20 63 61 75 73 65  flag. This cause
2b280 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 6c  s the pager to l
2b290 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a  oad and journal.
2b2a0 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65      ** the curre
2b2b0 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  nt page content 
2b2c0 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69  before overwriti
2b2d0 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  ng it..    **.  
2b2e0 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
2b2f0 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f  he pager will no
2b300 74 20 61 63 74 75 61 6c 6c 79 20 61 74 74 65 6d  t actually attem
2b310 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f  pt to load or jo
2b320 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f  urnal .    ** co
2b330 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 70 61  ntent for any pa
2b340 67 65 20 74 68 61 74 20 72 65 61 6c 6c 79 20 64  ge that really d
2b350 6f 65 73 20 6c 69 65 20 70 61 73 74 20 74 68 65  oes lie past the
2b360 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
2b370 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
2b380 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68 65   on disk. So the
2b390 20 65 66 66 65 63 74 73 20 6f 66 20 64 69 73 61   effects of disa
2b3a0 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e  bling the no-con
2b3b0 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f  tent optimizatio
2b3c0 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65 20 61 72  n.    ** here ar
2b3d0 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68  e confined to th
2b3e0 6f 73 65 20 70 61 67 65 73 20 74 68 61 74 20 6c  ose pages that l
2b3f0 69 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 65  ie between the e
2b400 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  nd of the.    **
2b410 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
2b420 61 6e 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74  and the end of t
2b430 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b440 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
2b450 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30   bNoContent = (0
2b460 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  ==IfNotOmitAV(pB
2b470 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 29  t->bDoTruncate))
2b480 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43   ? PAGER_GET_NOC
2b490 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 0a 20 20 20  ONTENT : 0;..   
2b4a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2b4b0 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
2b4c0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
2b4d0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2b4e0 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e  rn rc;.    pBt->
2b4f0 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28  nPage++;.    if(
2b500 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e   pBt->nPage==PEN
2b510 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
2b520 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65  Bt) ) pBt->nPage
2b530 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ++;..#ifndef SQL
2b540 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2b550 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
2b560 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50  >autoVacuum && P
2b570 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
2b580 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b  , pBt->nPage) ){
2b590 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50  .      /* If *pP
2b5a0 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20  gno refers to a 
2b5b0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
2b5c0 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e  , allocate two n
2b5d0 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  ew pages.      *
2b5e0 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
2b5f0 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64  the file instead
2b600 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72   of one. The fir
2b610 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  st allocated pag
2b620 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d  e.      ** becom
2b630 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72  es a new pointer
2b640 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20 73  -map page, the s
2b650 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79  econd is used by
2b660 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20   the caller..   
2b670 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50     */.      MemP
2b680 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  age *pPg = 0;.  
2b690 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
2b6a0 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
2b6b0 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74  d of file (point
2b6c0 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c  er-map page)\n",
2b6d0 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20   pBt->nPage));. 
2b6e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
2b6f0 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47  ->nPage!=PENDING
2b700 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2b710 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  );.      rc = bt
2b720 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2b730 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67  pBt->nPage, &pPg
2b740 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  , bNoContent);. 
2b750 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2b760 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b770 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2b780 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44  gerWrite(pPg->pD
2b790 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2b7a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29  releasePage(pPg)
2b7b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2b7c0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2b7d0 72 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  rc;.      pBt->n
2b7e0 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  Page++;.      if
2b7f0 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45  ( pBt->nPage==PE
2b800 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2b810 70 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61  pBt) ){ pBt->nPa
2b820 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65  ge++; }.    }.#e
2b830 6e 64 69 66 0a 20 20 20 20 70 75 74 34 62 79 74  ndif.    put4byt
2b840 65 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d  e(28 + (u8*)pBt-
2b850 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20  >pPage1->aData, 
2b860 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
2b870 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e   *pPgno = pBt->n
2b880 50 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72  Page;..    asser
2b890 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
2b8a0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
2b8b0 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  ) );.    rc = bt
2b8c0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2b8d0 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
2b8e0 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  bNoContent);.   
2b8f0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2b900 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
2b910 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2b920 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
2b930 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
2b940 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b950 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2b960 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  *ppPage);.    }.
2b970 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
2b980 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
2b990 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70  d of file\n", *p
2b9a0 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61  Pgno));.  }..  a
2b9b0 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
2b9c0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2b9d0 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c  (pBt) );..end_al
2b9e0 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72  locate_page:.  r
2b9f0 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
2ba00 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  k);.  releasePag
2ba10 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
2ba20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ba30 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  OK ){.    if( sq
2ba40 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
2ba50 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29  fcount((*ppPage)
2ba60 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a  ->pDbPage)>1 ){.
2ba70 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2ba80 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
2ba90 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
2baa0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2bab0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2bac0 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50  .    }.    (*ppP
2bad0 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30  age)->isInit = 0
2bae0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
2baf0 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  ppPage = 0;.  }.
2bb00 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
2bb10 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74  LITE_OK || sqlit
2bb20 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2bb30 6c 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  le((*ppPage)->pD
2bb40 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
2bb50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2bb60 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2bb70 20 75 73 65 64 20 74 6f 20 61 64 64 20 70 61 67   used to add pag
2bb80 65 20 69 50 61 67 65 20 74 6f 20 74 68 65 20 64  e iPage to the d
2bb90 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 65  atabase file fre
2bba0 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69  e-list. .** It i
2bbb0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
2bbc0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
2bbd0 6c 72 65 61 64 79 20 61 20 70 61 72 74 20 6f 66  lready a part of
2bbe0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
2bbf0 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
2bc00 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
2bc10 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
2bc20 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2bc30 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49  s optional..** I
2bc40 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70  f the caller hap
2bc50 70 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70  pens to have a p
2bc60 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65  ointer to the Me
2bc70 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a  mPage object .**
2bc80 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
2bc90 6f 20 70 61 67 65 20 69 50 61 67 65 20 68 61 6e  o page iPage han
2bca0 64 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20  dy, it may pass 
2bcb0 69 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  it as the second
2bcc0 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65   value. .** Othe
2bcd0 72 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61  rwise, it may pa
2bce0 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  ss NULL..**.** I
2bcf0 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  f a pointer to a
2bd00 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
2bd10 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  is passed as the
2bd20 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
2bd30 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e  ,.** its referen
2bd40 63 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20  ce count is not 
2bd50 61 6c 74 65 72 65 64 20 62 79 20 74 68 69 73 20  altered by this 
2bd60 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
2bd70 74 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65  tic int freePage
2bd80 32 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  2(BtShared *pBt,
2bd90 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61   MemPage *pMemPa
2bda0 67 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b  ge, Pgno iPage){
2bdb0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75  .  MemPage *pTru
2bdc0 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nk = 0;         
2bdd0 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c         /* Free-l
2bde0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a  ist trunk page *
2bdf0 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20  /.  Pgno iTrunk 
2be00 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2be10 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
2be20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c  number of free-l
2be30 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a  ist trunk page *
2be40 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  / .  MemPage *pP
2be50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
2be60 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  e1;      /* Loca
2be70 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  l reference to p
2be80 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61  age 1 */.  MemPa
2be90 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20  ge *pPage;      
2bea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2beb0 2a 20 50 61 67 65 20 62 65 69 6e 67 20 66 72 65  * Page being fre
2bec0 65 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e  ed. May be NULL.
2bed0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
2bee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2bf00 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn Code */.  in
2bf10 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
2bf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf30 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d    /* Initial num
2bf40 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
2bf50 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20  free-list */..  
2bf60 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2bf70 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
2bf80 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
2bf90 72 74 28 20 69 50 61 67 65 3e 31 20 29 3b 0a 20  rt( iPage>1 );. 
2bfa0 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61   assert( !pMemPa
2bfb0 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e  ge || pMemPage->
2bfc0 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a  pgno==iPage );..
2bfd0 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29    if( pMemPage )
2bfe0 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d  {.    pPage = pM
2bff0 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69  emPage;.    sqli
2c000 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61 67  te3PagerRef(pPag
2c010 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  e->pDbPage);.  }
2c020 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20  else{.    pPage 
2c030 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75  = btreePageLooku
2c040 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20  p(pBt, iPage);. 
2c050 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65   }..  /* Increme
2c060 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67 65  nt the free page
2c070 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31   count on pPage1
2c080 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
2c090 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2c0a0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
2c0b0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66   if( rc ) goto f
2c0c0 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e  reepage_out;.  n
2c0d0 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
2c0e0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2c0f0 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  6]);.  put4byte(
2c100 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2c110 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20  6], nFree+1);.. 
2c120 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61   if( pBt->btsFla
2c130 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
2c140 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a  DELETE ){.    /*
2c150 20 49 66 20 74 68 65 20 73 65 63 75 72 65 5f 64   If the secure_d
2c160 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73 20  elete option is 
2c170 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20  enabled, then.  
2c180 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c    ** always full
2c190 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65  y overwrite dele
2c1a0 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
2c1b0 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20  with zeros..    
2c1c0 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50 61  */.    if( (!pPa
2c1d0 67 65 20 26 26 20 28 28 72 63 20 3d 20 62 74 72  ge && ((rc = btr
2c1e0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
2c1f0 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
2c200 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c 20  )!=0) ).     || 
2c210 20 20 20 20 20 20 20 20 20 20 20 28 28 72 63 20             ((rc 
2c220 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2c230 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
2c240 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a  ge))!=0).    ){.
2c250 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
2c260 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
2c270 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d     memset(pPage-
2c280 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >aData, 0, pPage
2c290 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  ->pBt->pageSize)
2c2a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
2c2b0 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
2c2c0 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
2c2d0 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79  , write an entry
2c2e0 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   in the pointer-
2c2f0 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  map.  ** to indi
2c300 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61  cate that the pa
2c310 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f  ge is free..  */
2c320 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43  .  if( ISAUTOVAC
2c330 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d 61  UUM ){.    ptrma
2c340 70 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c  pPut(pBt, iPage,
2c350 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45   PTRMAP_FREEPAGE
2c360 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  , 0, &rc);.    i
2c370 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65  f( rc ) goto fre
2c380 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  epage_out;.  }..
2c390 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c    /* Now manipul
2c3a0 61 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 64  ate the actual d
2c3b0 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73  atabase free-lis
2c3c0 74 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65  t structure. The
2c3d0 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20  re are two.  ** 
2c3e0 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49  possibilities. I
2c3f0 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
2c400 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70  is currently emp
2c410 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69  ty, or if the fi
2c420 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70  rst.  ** trunk p
2c430 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d  age in the free-
2c440 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68  list is full, th
2c450 65 6e 20 74 68 69 73 20 70 61 67 65 20 77 69 6c  en this page wil
2c460 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20  l become a.  ** 
2c470 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72  new free-list tr
2c480 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77  unk page. Otherw
2c490 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63  ise, it will bec
2c4a0 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68  ome a leaf of th
2c4b0 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75  e.  ** first tru
2c4c0 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  nk page in the c
2c4d0 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74  urrent free-list
2c4e0 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73  . This block tes
2c4f0 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73  ts if it.  ** is
2c500 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64   possible to add
2c510 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20 6e   the page as a n
2c520 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  ew free-list lea
2c530 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46  f..  */.  if( nF
2c540 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33  ree!=0 ){.    u3
2c550 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20  2 nLeaf;        
2c560 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
2c570 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61  al number of lea
2c580 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b  f cells on trunk
2c590 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54   page */..    iT
2c5a0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
2c5b0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2c5c0 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  2]);.    rc = bt
2c5d0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2c5e0 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  iTrunk, &pTrunk,
2c5f0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
2c600 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c610 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
2c620 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_out;.    }..  
2c630 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79    nLeaf = get4by
2c640 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
2c650 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  a[4]);.    asser
2c660 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
2c670 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28  ze>32 );.    if(
2c680 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42   nLeaf > (u32)pB
2c690 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
2c6a0 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20  - 2 ){.      rc 
2c6b0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2c6c0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
2c6d0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2c6e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c      }.    if( nL
2c6f0 65 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e  eaf < (u32)pBt->
2c700 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
2c710 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20   ){.      /* In 
2c720 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20  this case there 
2c730 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74  is room on the t
2c740 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73  runk page to ins
2c750 65 72 74 20 74 68 65 20 70 61 67 65 0a 20 20 20  ert the page.   
2c760 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65     ** being free
2c770 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e  d as a new leaf.
2c780 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2c790 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
2c7a0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e   trunk page is n
2c7b0 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75  ot really full u
2c7c0 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ntil it contains
2c7d0 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  .      ** usable
2c7e0 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69  Size/4 - 2 entri
2c7f0 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69  es, not usableSi
2c800 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
2c810 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20   as we have.    
2c820 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74    ** coded.  But
2c830 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67   due to a coding
2c840 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f   error in versio
2c850 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69  ns of SQLite pri
2c860 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33  or to.      ** 3
2c870 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20  .6.0, databases 
2c880 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72  with freelist tr
2c890 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e  unk pages holdin
2c8a0 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20  g more than.    
2c8b0 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
2c8c0 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69  4 - 8 entries wi
2c8d0 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61  ll be reported a
2c8e0 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f  s corrupt.  In o
2c8f0 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f  rder.      ** to
2c900 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61   maintain backwa
2c910 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
2c920 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72  y with older ver
2c930 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c  sions of SQLite,
2c940 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c  .      ** we wil
2c950 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65  l continue to re
2c960 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65  strict the numbe
2c970 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20  r of entries to 
2c980 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
2c990 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f  .      ** for no
2c9a0 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e  w.  At some poin
2c9b0 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  t in the future 
2c9c0 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68  (once everyone h
2c9d0 61 73 20 75 70 67 72 61 64 65 64 0a 20 20 20 20  as upgraded.    
2c9e0 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72    ** to 3.6.0 or
2c9f0 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c   later) we shoul
2ca00 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e  d consider fixin
2ca10 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61  g the conditiona
2ca20 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a  l above.      **
2ca30 20 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65   to read "usable
2ca40 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61  Size/4-2" instea
2ca50 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65  d of "usableSize
2ca60 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2f 0a  /4-8"..      */.
2ca70 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2ca80 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
2ca90 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2caa0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2cab0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2cac0 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
2cad0 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c  nk->aData[4], nL
2cae0 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  eaf+1);.        
2caf0 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  put4byte(&pTrunk
2cb00 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a  ->aData[8+nLeaf*
2cb10 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  4], iPage);.    
2cb20 20 20 20 20 69 66 28 20 70 50 61 67 65 20 26 26      if( pPage &&
2cb30 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
2cb40 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
2cb50 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ETE)==0 ){.     
2cb60 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
2cb70 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65  rDontWrite(pPage
2cb80 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2cb90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
2cba0 20 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f   = btreeSetHasCo
2cbb0 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65  ntent(pBt, iPage
2cbc0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2cbd0 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
2cbe0 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74  GE: %d leaf on t
2cbf0 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c  runk page %d\n",
2cc00 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75  pPage->pgno,pTru
2cc10 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  nk->pgno));.    
2cc20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
2cc30 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
2cc40 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20    /* If control 
2cc50 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f  flows to this po
2cc60 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73  int, then it was
2cc70 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
2cc80 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68   add the.  ** th
2cc90 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65  e page being fre
2cca0 65 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67  ed as a leaf pag
2ccb0 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74  e of the first t
2ccc0 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65  runk in the free
2ccd0 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73  -list..  ** Poss
2cce0 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65  ibly because the
2ccf0 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d   free-list is em
2cd00 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79  pty, or possibly
2cd10 20 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20   because the .  
2cd20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69  ** first trunk i
2cd30 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
2cd40 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20  is full. Either 
2cd50 77 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65  way, the page be
2cd60 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77  ing freed.  ** w
2cd70 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e  ill become the n
2cd80 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70  ew first trunk p
2cd90 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d  age in the free-
2cda0 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
2cdb0 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c   pPage==0 && SQL
2cdc0 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74  ITE_OK!=(rc = bt
2cdd0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2cde0 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
2cdf0 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  )) ){.    goto f
2ce00 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
2ce10 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
2ce20 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
2ce30 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
2ce40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2ce50 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70  {.    goto freep
2ce60 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70  age_out;.  }.  p
2ce70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
2ce80 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20  Data, iTrunk);. 
2ce90 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
2cea0 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a  ->aData[4], 0);.
2ceb0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
2cec0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69  e1->aData[32], i
2ced0 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28  Page);.  TRACE((
2cee0 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e  "FREE-PAGE: %d n
2cef0 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65  ew trunk page re
2cf00 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70  placing %d\n", p
2cf10 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75  Page->pgno, iTru
2cf20 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f  nk));..freepage_
2cf30 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65  out:.  if( pPage
2cf40 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   ){.    pPage->i
2cf50 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  sInit = 0;.  }. 
2cf60 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
2cf70 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  ge);.  releasePa
2cf80 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65  ge(pTrunk);.  re
2cf90 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69  turn rc;.}.stati
2cfa0 63 20 76 6f 69 64 20 66 72 65 65 50 61 67 65 28  c void freePage(
2cfb0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
2cfc0 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28  int *pRC){.  if(
2cfd0 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f   (*pRC)==SQLITE_
2cfe0 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  OK ){.    *pRC =
2cff0 20 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65   freePage2(pPage
2d000 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50  ->pBt, pPage, pP
2d010 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  age->pgno);.  }.
2d020 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e  }../*.** Free an
2d030 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
2d040 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2d050 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e   the given Cell.
2d060 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
2d070 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65  learCell(MemPage
2d080 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65   *pPage, unsigne
2d090 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a  d char *pCell){.
2d0a0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2d0b0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
2d0c0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
2d0d0 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a   Pgno ovflPgno;.
2d0e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
2d0f0 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66  nOvfl;.  u32 ovf
2d100 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73  lPageSize;..  as
2d110 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2d120 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2d130 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2d140 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
2d150 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
2d160 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69   &info);.  if( i
2d170 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30  nfo.iOverflow==0
2d180 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2d190 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f  QLITE_OK;  /* No
2d1a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
2d1b0 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
2d1c0 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a  doing anything *
2d1d0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 65 6c  /.  }.  if( pCel
2d1e0 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l+info.iOverflow
2d1f0 2b 33 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74  +3 > pPage->aDat
2d200 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67  a+pPage->maskPag
2d210 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
2d220 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2d230 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65 78  KPT;  /* Cell ex
2d240 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f  tends past end o
2d250 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20 20  f page */.  }.  
2d260 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62  ovflPgno = get4b
2d270 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
2d280 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61  iOverflow]);.  a
2d290 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62  ssert( pBt->usab
2d2a0 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20  leSize > 4 );.  
2d2b0 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70  ovflPageSize = p
2d2c0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
2d2d0 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69   4;.  nOvfl = (i
2d2e0 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69  nfo.nPayload - i
2d2f0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66  nfo.nLocal + ovf
2d300 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f  lPageSize - 1)/o
2d310 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61  vflPageSize;.  a
2d320 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d  ssert( ovflPgno=
2d330 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b  =0 || nOvfl>0 );
2d340 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d  .  while( nOvfl-
2d350 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e  - ){.    Pgno iN
2d360 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d  ext = 0;.    Mem
2d370 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
2d380 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e  .    if( ovflPgn
2d390 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e  o<2 || ovflPgno>
2d3a0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
2d3b0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
2d3c0 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c  0 is not a legal
2d3d0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
2d3e0 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62   page 1 cannot b
2d3f0 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f  e an .      ** o
2d400 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68  verflow page. Th
2d410 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50  erefore if ovflP
2d420 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68  gno<2 or past th
2d430 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20  e end of the .  
2d440 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20      ** file the 
2d450 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
2d460 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20   corrupt. */.   
2d470 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2d480 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2d490 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76     }.    if( nOv
2d4a0 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fl ){.      rc =
2d4b0 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
2d4c0 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20  (pBt, ovflPgno, 
2d4d0 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b  &pOvfl, &iNext);
2d4e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2d4f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2d500 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76 66  ..    if( ( pOvf
2d510 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62  l || ((pOvfl = b
2d520 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
2d530 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d  Bt, ovflPgno))!=
2d540 30 29 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c  0) ).     && sql
2d550 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
2d560 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62  count(pOvfl->pDb
2d570 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a  Page)!=1.    ){.
2d580 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69        /* There i
2d590 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20  s no reason any 
2d5a0 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61  cursor should ha
2d5b0 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  ve an outstandin
2d5c0 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20  g reference .   
2d5d0 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72     ** to an over
2d5e0 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67  flow page belong
2d5f0 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68  ing to a cell th
2d600 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65  at is being dele
2d610 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20  ted/updated..   
2d620 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72     ** So if ther
2d630 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68  e exists more th
2d640 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65  an one reference
2d650 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74   to this page, t
2d660 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a  hen it .      **
2d670 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79   must not really
2d680 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
2d690 70 61 67 65 20 61 6e 64 20 74 68 65 20 64 61 74  page and the dat
2d6a0 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
2d6b0 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a  rrupt. .      **
2d6c0 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74   It is helpful t
2d6d0 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 62 65  o detect this be
2d6e0 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65  fore calling fre
2d6f0 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20  ePage2(), as .  
2d700 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32      ** freePage2
2d710 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20  () may zero the 
2d720 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66  page contents if
2d730 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d   secure-delete m
2d740 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ode is.      ** 
2d750 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73  enabled. If this
2d760 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65   'overflow' page
2d770 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61   happens to be a
2d780 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a 20   page that the. 
2d790 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69       ** caller i
2d7a0 73 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  s iterating thro
2d7b0 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20  ugh or using in 
2d7c0 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20  some other way, 
2d7d0 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61  this.      ** ca
2d7e0 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63  n be problematic
2d7f0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2d800 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2d810 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
2d820 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
2d830 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c 20   freePage2(pBt, 
2d840 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29  pOvfl, ovflPgno)
2d850 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
2d860 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   pOvfl ){.      
2d870 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
2d880 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  f(pOvfl->pDbPage
2d890 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2d8a0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2d8b0 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20  .    ovflPgno = 
2d8c0 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  iNext;.  }.  ret
2d8d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2d8e0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
2d8f0 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  he byte sequence
2d900 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65   used to represe
2d910 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67  nt a cell on pag
2d920 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77  e pPage.** and w
2d930 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73  rite that byte s
2d940 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65  equence into pCe
2d950 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20  ll[].  Overflow 
2d960 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  pages are.** all
2d970 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65  ocated and fille
2d980 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72  d in as necessar
2d990 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  y.  The calling 
2d9a0 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20  procedure.** is 
2d9b0 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
2d9c0 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66  making sure suff
2d9d0 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73  icient space has
2d9e0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a   been allocated.
2d9f0 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a  ** for pCell[]..
2da00 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
2da10 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e  pCell does not n
2da20 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f  ecessary need to
2da30 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50   point to the pP
2da40 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72  age->aData.** ar
2da50 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74  ea.  pCell might
2da60 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74   point to some t
2da70 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
2da80 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c  .  The cell will
2da90 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74  .** be construct
2daa0 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f  ed in this tempo
2dab0 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63  rary area then c
2dac0 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65  opied into pPage
2dad0 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72  ->aData.** later
2dae0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2daf0 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65  fillInCell(.  Me
2db00 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
2db10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2db20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
2db30 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20  ntains the cell 
2db40 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
2db50 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  ar *pCell,      
2db60 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20      /* Complete 
2db70 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  text of the cell
2db80 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
2db90 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79   *pKey, i64 nKey
2dba0 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20  ,    /* The key 
2dbb0 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
2dbc0 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61  *pData,int nData
2dbd0 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  ,   /* The data 
2dbe0 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20  */.  int nZero, 
2dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc00 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72      /* Extra zer
2dc10 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e  o bytes to appen
2dc20 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20  d to pData */.  
2dc30 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20  int *pnSize     
2dc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2dc50 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a  * Write cell siz
2dc60 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
2dc70 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63  nt nPayload;.  c
2dc80 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20  onst u8 *pSrc;. 
2dc90 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63   int nSrc, n, rc
2dca0 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66  ;.  int spaceLef
2dcb0 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  t;.  MemPage *pO
2dcc0 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  vfl = 0;.  MemPa
2dcd0 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d  ge *pToRelease =
2dce0 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   0;.  unsigned c
2dcf0 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75  har *pPrior;.  u
2dd00 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
2dd10 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72  ayload;.  BtShar
2dd20 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
2dd30 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  >pBt;.  Pgno pgn
2dd40 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  oOvfl = 0;.  int
2dd50 20 6e 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c   nHeader;.  Cell
2dd60 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73  Info info;..  as
2dd70 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2dd80 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2dd90 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
2dda0 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f    /* pPage is no
2ddb0 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72  t necessarily wr
2ddc0 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43  iteable since pC
2ddd0 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78  ell might be aux
2dde0 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66  iliary.  ** buff
2ddf0 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73  er space that is
2de00 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74   separate from t
2de10 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20  he pPage buffer 
2de20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74  area */.  assert
2de30 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61  ( pCell<pPage->a
2de40 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26  Data || pCell>=&
2de50 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
2de60 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
2de70 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
2de80 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2de90 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2dea0 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  e) );..  /* Fill
2deb0 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20   in the header. 
2dec0 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30  */.  nHeader = 0
2ded0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
2dee0 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61  leaf ){.    nHea
2def0 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20  der += 4;.  }.  
2df00 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
2df10 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  ta ){.    nHeade
2df20 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32  r += putVarint32
2df30 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
2df40 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a  , nData+nZero);.
2df50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61    }else{.    nDa
2df60 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a  ta = nZero = 0;.
2df70 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d    }.  nHeader +=
2df80 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c   putVarint(&pCel
2df90 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36  l[nHeader], *(u6
2dfa0 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 62 74 72  4*)&nKey);.  btr
2dfb0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
2dfc0 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
2dfd0 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  fo);.  assert( i
2dfe0 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65  nfo.nHeader==nHe
2dff0 61 64 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  ader );.  assert
2e000 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65  ( info.nKey==nKe
2e010 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  y );.  assert( i
2e020 6e 66 6f 2e 6e 44 61 74 61 3d 3d 28 75 33 32 29  nfo.nData==(u32)
2e030 28 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 20 29 3b  (nData+nZero) );
2e040 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  .  .  /* Fill in
2e050 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a   the payload */.
2e060 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61    nPayload = nDa
2e070 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66  ta + nZero;.  if
2e080 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
2e090 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44  ){.    pSrc = pD
2e0a0 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  ata;.    nSrc = 
2e0b0 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61  nData;.    nData
2e0c0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a   = 0;.  }else{ .
2e0d0 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 6e 4b      if( NEVER(nK
2e0e0 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c  ey>0x7fffffff ||
2e0f0 20 70 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20 20   pKey==0) ){.   
2e100 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2e110 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2e120 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61     }.    nPayloa
2e130 64 20 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a  d += (int)nKey;.
2e140 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b      pSrc = pKey;
2e150 0a 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74  .    nSrc = (int
2e160 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e  )nKey;.  }.  *pn
2e170 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a  Size = info.nSiz
2e180 65 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d  e;.  spaceLeft =
2e190 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20   info.nLocal;.  
2e1a0 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c  pPayload = &pCel
2e1b0 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50  l[nHeader];.  pP
2e1c0 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e  rior = &pCell[in
2e1d0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a  fo.iOverflow];..
2e1e0 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61    while( nPayloa
2e1f0 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  d>0 ){.    if( s
2e200 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23  paceLeft==0 ){.#
2e210 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2e220 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2e230 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72      Pgno pgnoPtr
2e240 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20  map = pgnoOvfl; 
2e250 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  /* Overflow page
2e260 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
2e270 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ry page */.     
2e280 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
2e290 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
2e2a0 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67  do{.          pg
2e2b0 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20  noOvfl++;.      
2e2c0 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20    } while( .    
2e2d0 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50        PTRMAP_ISP
2e2e0 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  AGE(pBt, pgnoOvf
2e2f0 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d  l) || pgnoOvfl==
2e300 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2e310 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20  E(pBt) .        
2e320 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
2e330 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  f.      rc = all
2e340 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
2e350 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e  Bt, &pOvfl, &pgn
2e360 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c  oOvfl, pgnoOvfl,
2e370 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
2e380 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2e390 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
2e3a0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
2e3b0 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
2e3c0 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  m, and the secon
2e3d0 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a  d or subsequent.
2e3e0 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
2e3f0 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  w page is being 
2e400 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61  allocated, add a
2e410 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70  n entry to the p
2e420 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20  ointer-map.     
2e430 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67   ** for that pag
2e440 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a  e now. .      **
2e450 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69  .      ** If thi
2e460 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f  s is the first o
2e470 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
2e480 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69  en write a parti
2e490 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20  al entry .      
2e4a0 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ** to the pointe
2e4b0 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69  r-map. If we wri
2e4c0 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68  te nothing to th
2e4d0 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73  is pointer-map s
2e4e0 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  lot,.      ** th
2e4f0 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69  en the optimisti
2e500 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  c overflow chain
2e510 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63   processing in c
2e520 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20  learCell().     
2e530 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72   ** may misinter
2e540 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69  pret the uniniti
2e550 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e  alized values an
2e560 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20  d delete the.   
2e570 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65     ** wrong page
2e580 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  s from the datab
2e590 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ase..      */.  
2e5a0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
2e5b0 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53  oVacuum && rc==S
2e5c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e5d0 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28      u8 eType = (
2e5e0 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41  pgnoPtrmap?PTRMA
2e5f0 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d  P_OVERFLOW2:PTRM
2e600 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20  AP_OVERFLOW1);. 
2e610 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
2e620 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  (pBt, pgnoOvfl, 
2e630 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61  eType, pgnoPtrma
2e640 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  p, &rc);.       
2e650 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2e660 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2e670 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20  (pOvfl);.       
2e680 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
2e690 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  f.      if( rc )
2e6a0 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
2e6b0 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
2e6c0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2e6d0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
2e6e0 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65       /* If pToRe
2e6f0 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72  lease is not zer
2e700 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f  o than pPrior po
2e710 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
2e720 74 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a  ta area.      **
2e730 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20   of pToRelease. 
2e740 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65   Make sure pToRe
2e750 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  lease is still w
2e760 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  riteable. */.   
2e770 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
2e780 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
2e790 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2e7a0 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
2e7b0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
2e7c0 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20     /* If pPrior 
2e7d0 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
2e7e0 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
2e7f0 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
2e800 65 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a  e pPage.      **
2e810 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
2e820 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ble */.      ass
2e830 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67  ert( pPrior<pPag
2e840 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69  e->aData || pPri
2e850 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  or>=&pPage->aDat
2e860 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
2e870 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
2e880 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2e890 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2e8a0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
2e8b0 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
2e8c0 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20  r, pgnoOvfl);.  
2e8d0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2e8e0 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
2e8f0 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20     pToRelease = 
2e900 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72  pOvfl;.      pPr
2e910 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61  ior = pOvfl->aDa
2e920 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  ta;.      put4by
2e930 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20  te(pPrior, 0);. 
2e940 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20       pPayload = 
2e950 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d  &pOvfl->aData[4]
2e960 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66  ;.      spaceLef
2e970 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t = pBt->usableS
2e980 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20  ize - 4;.    }. 
2e990 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b     n = nPayload;
2e9a0 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65  .    if( n>space
2e9b0 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65  Left ) n = space
2e9c0 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  Left;..    /* If
2e9d0 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
2e9e0 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61  ot zero than pPa
2e9f0 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74  yload points int
2ea00 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a  o the data area.
2ea10 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
2ea20 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
2ea30 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
2ea40 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
2ea50 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
2ea60 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20  ToRelease==0 || 
2ea70 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2ea80 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61  iteable(pToRelea
2ea90 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  se->pDbPage) );.
2eaa0 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c  .    /* If pPayl
2eab0 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74  oad is part of t
2eac0 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  he data area of 
2ead0 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65  pPage, then make
2eae0 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20   sure pPage.    
2eaf0 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  ** is still writ
2eb00 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73  eable */.    ass
2eb10 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50  ert( pPayload<pP
2eb20 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50  age->aData || pP
2eb30 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e  ayload>=&pPage->
2eb40 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
2eb50 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
2eb60 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
2eb70 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
2eb80 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
2eb90 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29      if( nSrc>0 )
2eba0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53  {.      if( n>nS
2ebb0 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20  rc ) n = nSrc;. 
2ebc0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72       assert( pSr
2ebd0 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  c );.      memcp
2ebe0 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63  y(pPayload, pSrc
2ebf0 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
2ec00 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
2ec10 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20  ayload, 0, n);. 
2ec20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61     }.    nPayloa
2ec30 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79  d -= n;.    pPay
2ec40 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70  load += n;.    p
2ec50 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53  Src += n;.    nS
2ec60 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61  rc -= n;.    spa
2ec70 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20  ceLeft -= n;.   
2ec80 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a   if( nSrc==0 ){.
2ec90 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61        nSrc = nDa
2eca0 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d  ta;.      pSrc =
2ecb0 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20   pData;.    }.  
2ecc0 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
2ecd0 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72  pToRelease);.  r
2ece0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2ecf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
2ed00 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66   the i-th cell f
2ed10 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73  rom pPage.  This
2ed20 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73   routine effects
2ed30 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20   pPage only..** 
2ed40 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  The cell content
2ed50 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72   is not freed or
2ed60 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49   deallocated.  I
2ed70 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
2ed80 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f  t.** the cell co
2ed90 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63  ntent has been c
2eda0 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20  opied someplace 
2edb0 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  else.  This rout
2edc0 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f  ine just.** remo
2edd0 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63  ves the referenc
2ede0 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72  e to the cell fr
2edf0 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  om pPage..**.** 
2ee00 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65  "sz" must be the
2ee10 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
2ee20 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f   in the cell..*/
2ee30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f  .static void dro
2ee40 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  pCell(MemPage *p
2ee50 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69  Page, int idx, i
2ee60 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29  nt sz, int *pRC)
2ee70 7b 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20 20  {.  u32 pc;     
2ee80 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
2ee90 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
2eea0 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
2eeb0 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ted */.  u8 *dat
2eec0 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  a;       /* pPag
2eed0 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38  e->aData */.  u8
2eee0 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a   *ptr;        /*
2eef0 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79   Used to move by
2ef00 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69  tes around withi
2ef10 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
2ef20 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t rc;         /*
2ef30 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
2ef40 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
2ef50 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69        /* Beginni
2ef60 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ng of the header
2ef70 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e  .  0 most pages.
2ef80 20 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a    100 page 1 */.
2ef90 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
2efa0 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
2efb0 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70   idx>=0 && idx<p
2efc0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2efd0 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c   assert( sz==cel
2efe0 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78  lSize(pPage, idx
2eff0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2f000 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2f010 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2f020 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
2f030 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2f040 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2f050 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  t->mutex) );.  d
2f060 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
2f070 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61  ta;.  ptr = &pPa
2f080 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69  ge->aCellIdx[2*i
2f090 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32  dx];.  pc = get2
2f0a0 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72  byte(ptr);.  hdr
2f0b0 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
2f0c0 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28  set;.  testcase(
2f0d0 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64   pc==get2byte(&d
2f0e0 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20  ata[hdr+5]) );. 
2f0f0 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a   testcase( pc+sz
2f100 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ==pPage->pBt->us
2f110 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66  ableSize );.  if
2f120 28 20 70 63 20 3c 20 28 75 33 32 29 67 65 74 32  ( pc < (u32)get2
2f130 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
2f140 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50  ]) || pc+sz > pP
2f150 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
2f160 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43  Size ){.    *pRC
2f170 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2f180 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  T_BKPT;.    retu
2f190 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66  rn;.  }.  rc = f
2f1a0 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  reeSpace(pPage, 
2f1b0 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72  pc, sz);.  if( r
2f1c0 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  c ){.    *pRC = 
2f1d0 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
2f1e0 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65    }.  pPage->nCe
2f1f0 6c 6c 2d 2d 3b 0a 20 20 6d 65 6d 6d 6f 76 65 28  ll--;.  memmove(
2f200 70 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70  ptr, ptr+2, 2*(p
2f210 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64  Page->nCell - id
2f220 78 29 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  x));.  put2byte(
2f230 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50  &data[hdr+3], pP
2f240 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70  age->nCell);.  p
2f250 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32  Page->nFree += 2
2f260 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
2f270 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20  t a new cell on 
2f280 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e  pPage at cell in
2f290 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20  dex "i".  pCell 
2f2a0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
2f2b0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
2f2c0 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cell..**.** If t
2f2d0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
2f2e0 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
2f2f0 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69  page, then put i
2f300 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a  t there.  If it.
2f310 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c  ** will not fit,
2f320 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70   then make a cop
2f330 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  y of the cell co
2f340 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70  ntent into pTemp
2f350 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20   if.** pTemp is 
2f360 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72  not null.  Regar
2f370 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20  dless of pTemp, 
2f380 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65  allocate a new e
2f390 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65  ntry.** in pPage
2f3a0 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d  ->apOvfl[] and m
2f3b0 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20  ake it point to 
2f3c0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
2f3d0 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70   (either.** in p
2f3e0 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67  Temp or the orig
2f3f0 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20  inal pCell) and 
2f400 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20  also record its 
2f410 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63  index. .** Alloc
2f420 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72  ating a new entr
2f430 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c  y in pPage->aCel
2f440 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74  l[] implies that
2f450 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65   .** pPage->nOve
2f460 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65  rflow is increme
2f470 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  nted..**.** If n
2f480 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Skip is non-zero
2f490 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f  , then do not co
2f4a0 70 79 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b  py the first nSk
2f4b0 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a  ip bytes of the.
2f4c0 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c  ** cell. The cal
2f4d0 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69  ler will overwri
2f4e0 74 65 20 74 68 65 6d 20 61 66 74 65 72 20 74 68  te them after th
2f4f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
2f500 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70  rns. If.** nSkip
2f510 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
2f520 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74  en pCell may not
2f530 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76   point to an inv
2f540 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  alid memory loca
2f550 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43  tion .** (but pC
2f560 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77  ell+nSkip is alw
2f570 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73  ays valid)..*/.s
2f580 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72  tatic void inser
2f590 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  tCell(.  MemPage
2f5a0 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61   *pPage,   /* Pa
2f5b0 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  ge into which we
2f5c0 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a   are copying */.
2f5d0 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20    int i,        
2f5e0 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20      /* New cell 
2f5f0 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68  becomes the i-th
2f600 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67   cell of the pag
2f610 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  e */.  u8 *pCell
2f620 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  ,        /* Cont
2f630 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ent of the new c
2f640 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c  ell */.  int sz,
2f650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
2f660 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69  tes of content i
2f670 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  n pCell */.  u8 
2f680 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  *pTemp,        /
2f690 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73  * Temp storage s
2f6a0 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20  pace for pCell, 
2f6b0 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50  if needed */.  P
2f6c0 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20  gno iChild,     
2f6d0 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c   /* If non-zero,
2f6e0 20 72 65 70 6c 61 63 65 20 66 69 72 73 74 20 34   replace first 4
2f6f0 20 62 79 74 65 73 20 77 69 74 68 20 74 68 69 73   bytes with this
2f700 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
2f710 2a 70 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a  *pRC          /*
2f720 20 52 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   Read and write 
2f730 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  return code from
2f740 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
2f750 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20  t idx = 0;      
2f760 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
2f770 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65  e new cell conte
2f780 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  nt in data[] */.
2f790 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
2f7a0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2f7b0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64  ter */.  int end
2f7c0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
2f7d0 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
2f7e0 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e  e last cell poin
2f7f0 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ter in data[] */
2f800 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20  .  int ins;     
2f810 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
2f820 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65   data[] where ne
2f830 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  w cell pointer i
2f840 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20  s inserted */.  
2f850 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
2f860 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
2f870 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
2f880 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  er in data[] */.
2f890 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
2f8a0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65      /* The conte
2f8b0 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20  nt of the whole 
2f8c0 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  page */.  int nS
2f8d0 6b 69 70 20 3d 20 28 69 43 68 69 6c 64 20 3f 20  kip = (iChild ? 
2f8e0 34 20 3a 20 30 29 3b 0a 0a 20 20 69 66 28 20 2a  4 : 0);..  if( *
2f8f0 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  pRC ) return;.. 
2f900 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
2f910 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   i<=pPage->nCell
2f920 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  +pPage->nOverflo
2f930 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  w );.  assert( p
2f940 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f  Page->nCell<=MX_
2f950 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
2f960 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67   && MX_CELL(pPag
2f970 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 20 29  e->pBt)<=10921 )
2f980 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2f990 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72  e->nOverflow<=Ar
2f9a0 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
2f9b0 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65  pOvfl) );.  asse
2f9c0 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 70 50  rt( ArraySize(pP
2f9d0 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41 72  age->apOvfl)==Ar
2f9e0 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
2f9f0 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65  iOvfl) );.  asse
2fa00 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2fa10 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2fa20 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f  t->mutex) );.  /
2fa30 2a 20 54 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c  * The cell shoul
2fa40 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69  d normally be si
2fa50 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20  zed correctly.  
2fa60 48 6f 77 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f  However, when mo
2fa70 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66  ving a.  ** malf
2fa80 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20  ormed cell from 
2fa90 61 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20 61  a leaf page to a
2faa0 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 2c  n interior page,
2fab0 20 69 66 20 74 68 65 20 63 65 6c 6c 20 73 69 7a   if the cell siz
2fac0 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f  e.  ** wanted to
2fad0 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 20   be less than 4 
2fae0 62 75 74 20 67 6f 74 20 72 6f 75 6e 64 65 64 20  but got rounded 
2faf0 75 70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c  up to 4 on the l
2fb00 65 61 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20  eaf, then size. 
2fb10 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c 65 73   ** might be les
2fb20 73 20 74 68 61 6e 20 38 20 28 6c 65 61 66 2d 73  s than 8 (leaf-s
2fb30 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f  ize + pointer) o
2fb40 6e 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e  n the interior n
2fb50 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a  ode.  Hence.  **
2fb60 20 74 68 65 20 74 65 72 6d 20 61 66 74 65 72 20   the term after 
2fb70 74 68 65 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f  the || in the fo
2fb80 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29  llowing assert()
2fb90 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  . */.  assert( s
2fba0 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  z==cellSizePtr(p
2fbb0 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20  Page, pCell) || 
2fbc0 28 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64  (sz==8 && iChild
2fbd0 3e 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  >0) );.  if( pPa
2fbe0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c  ge->nOverflow ||
2fbf0 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72   sz+2>pPage->nFr
2fc00 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54  ee ){.    if( pT
2fc10 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  emp ){.      mem
2fc20 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c  cpy(pTemp+nSkip,
2fc30 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a   pCell+nSkip, sz
2fc40 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70  -nSkip);.      p
2fc50 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20  Cell = pTemp;.  
2fc60 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69    }.    if( iChi
2fc70 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34  ld ){.      put4
2fc80 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69  byte(pCell, iChi
2fc90 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  ld);.    }.    j
2fca0 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66   = pPage->nOverf
2fcb0 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  low++;.    asser
2fcc0 74 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f  t( j<(int)(sizeo
2fcd0 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29  f(pPage->apOvfl)
2fce0 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  /sizeof(pPage->a
2fcf0 70 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20  pOvfl[0])) );.  
2fd00 20 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b    pPage->apOvfl[
2fd10 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20  j] = pCell;.    
2fd20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d  pPage->aiOvfl[j]
2fd30 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d 65 6c   = (u16)i;.  }el
2fd40 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  se{.    int rc =
2fd50 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2fd60 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
2fd70 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
2fd80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2fd90 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
2fda0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
2fdb0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  }.    assert( sq
2fdc0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2fdd0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
2fde0 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74  Page) );.    dat
2fdf0 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
2fe00 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74  ;.    cellOffset
2fe10 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
2fe20 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20  fset;.    end = 
2fe30 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
2fe40 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
2fe50 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65   ins = cellOffse
2fe60 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 72 63 20  t + 2*i;.    rc 
2fe70 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  = allocateSpace(
2fe80 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29  pPage, sz, &idx)
2fe90 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 20  ;.    if( rc ){ 
2fea0 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72  *pRC = rc; retur
2feb0 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20  n; }.    /* The 
2fec0 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29 20  allocateSpace() 
2fed0 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74 65  routine guarante
2fee0 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
2fef0 20 74 77 6f 20 70 72 6f 70 65 72 74 69 65 73 0a   two properties.
2ff00 20 20 20 20 2a 2a 20 69 66 20 69 74 20 72 65 74      ** if it ret
2ff10 75 72 6e 73 20 73 75 63 63 65 73 73 20 2a 2f 0a  urns success */.
2ff20 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 20      assert( idx 
2ff30 3e 3d 20 65 6e 64 2b 32 20 29 3b 0a 20 20 20 20  >= end+2 );.    
2ff40 61 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20 3c  assert( idx+sz <
2ff50 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42  = (int)pPage->pB
2ff60 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
2ff70 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  .    pPage->nCel
2ff80 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  l++;.    pPage->
2ff90 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32  nFree -= (u16)(2
2ffa0 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63   + sz);.    memc
2ffb0 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b  py(&data[idx+nSk
2ffc0 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  ip], pCell+nSkip
2ffd0 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20  , sz-nSkip);.   
2ffe0 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20   if( iChild ){. 
2fff0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 64       put4byte(&d
30000 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64  ata[idx], iChild
30010 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  );.    }.    mem
30020 6d 6f 76 65 28 26 64 61 74 61 5b 69 6e 73 2b 32  move(&data[ins+2
30030 5d 2c 20 26 64 61 74 61 5b 69 6e 73 5d 2c 20 65  ], &data[ins], e
30040 6e 64 2d 69 6e 73 29 3b 0a 20 20 20 20 70 75 74  nd-ins);.    put
30050 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d  2byte(&data[ins]
30060 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32  , idx);.    put2
30070 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65  byte(&data[pPage
30080 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20  ->hdrOffset+3], 
30090 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23  pPage->nCell);.#
300a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
300b0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
300c0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74    if( pPage->pBt
300d0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
300e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
300f0 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20  l may contain a 
30100 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76  pointer to an ov
30110 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
30120 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20  so, write.      
30130 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ** the entry for
30140 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
30150 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ge into the poin
30160 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a  ter map..      *
30170 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  /.      ptrmapPu
30180 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20  tOvflPtr(pPage, 
30190 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20  pCell, pRC);.   
301a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a   }.#endif.  }.}.
301b0 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73  ./*.** Add a lis
301c0 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 20  t of cells to a 
301d0 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20  page.  The page 
301e0 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61  should be initia
301f0 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68  lly empty..** Th
30200 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61 72  e cells are guar
30210 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f 6e  anteed to fit on
30220 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
30230 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62  atic void assemb
30240 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67  lePage(.  MemPag
30250 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54  e *pPage,   /* T
30260 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 61 73  he page to be as
30270 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e  semblied */.  in
30280 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t nCell,        
30290 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
302a0 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f   cells to add to
302b0 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
302c0 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20  u8 **apCell,    
302d0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f    /* Pointers to
302e0 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a   cell bodies */.
302f0 20 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20 20    u16 *aSize    
30300 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20      /* Sizes of 
30310 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a  the cells */.){.
30320 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
30330 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
30340 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ter */.  u8 *pCe
30350 6c 6c 70 74 72 3b 20 20 20 20 20 2f 2a 20 41 64  llptr;     /* Ad
30360 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65  dress of next ce
30370 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
30380 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20  int cellbody;   
30390 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
303a0 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a  next cell body *
303b0 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64  /.  u8 * const d
303c0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
303d0 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
303e0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61  /* Pointer to da
303f0 74 61 20 66 6f 72 20 70 50 61 67 65 20 2a 2f 0a  ta for pPage */.
30400 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20    const int hdr 
30410 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
30420 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  et;           /*
30430 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
30440 72 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20  r on pPage */.  
30450 63 6f 6e 73 74 20 69 6e 74 20 6e 55 73 61 62 6c  const int nUsabl
30460 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
30470 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55  usableSize; /* U
30480 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 70 61  sable size of pa
30490 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ge */..  assert(
304a0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
304b0 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
304c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
304d0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
304e0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
304f0 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26 26  ert( nCell>=0 &&
30500 20 6e 43 65 6c 6c 3c 3d 28 69 6e 74 29 4d 58 5f   nCell<=(int)MX_
30510 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
30520 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
30530 28 69 6e 74 29 4d 58 5f 43 45 4c 4c 28 70 50 61  (int)MX_CELL(pPa
30540 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 29  ge->pBt)<=10921)
30550 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
30560 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
30570 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
30580 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ge) );..  /* Che
30590 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ck that the page
305a0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 7a   has just been z
305b0 65 72 6f 65 64 20 62 79 20 7a 65 72 6f 50 61 67  eroed by zeroPag
305c0 65 28 29 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e() */.  assert(
305d0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30   pPage->nCell==0
305e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 67 65   );.  assert( ge
305f0 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
30600 61 74 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55 73  ata[hdr+5])==nUs
30610 61 62 6c 65 20 29 3b 0a 0a 20 20 70 43 65 6c 6c  able );..  pCell
30620 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61 43  ptr = &pPage->aC
30630 65 6c 6c 49 64 78 5b 6e 43 65 6c 6c 2a 32 5d 3b  ellIdx[nCell*2];
30640 0a 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 6e 55  .  cellbody = nU
30650 73 61 62 6c 65 3b 0a 20 20 66 6f 72 28 69 3d 6e  sable;.  for(i=n
30660 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Cell-1; i>=0; i-
30670 2d 29 7b 0a 20 20 20 20 75 31 36 20 73 7a 20 3d  -){.    u16 sz =
30680 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 70   aSize[i];.    p
30690 43 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20 20  Cellptr -= 2;.  
306a0 20 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 73 7a    cellbody -= sz
306b0 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
306c0 43 65 6c 6c 70 74 72 2c 20 63 65 6c 6c 62 6f 64  Cellptr, cellbod
306d0 79 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  y);.    memcpy(&
306e0 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20  data[cellbody], 
306f0 61 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b 0a  apCell[i], sz);.
30700 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65 28 26    }.  put2byte(&
30710 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65  data[hdr+3], nCe
30720 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  ll);.  put2byte(
30730 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 65  &data[hdr+5], ce
30740 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65  llbody);.  pPage
30750 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 6e 43 65 6c  ->nFree -= (nCel
30760 6c 2a 32 20 2b 20 6e 55 73 61 62 6c 65 20 2d 20  l*2 + nUsable - 
30770 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61  cellbody);.  pPa
30780 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 31 36  ge->nCell = (u16
30790 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )nCell;.}../*.**
307a0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
307b0 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d  arameters determ
307c0 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a  ine how many adj
307d0 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74 20  acent pages get 
307e0 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61  involved.** in a
307f0 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61   balancing opera
30800 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65  tion.  NN is the
30810 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68   number of neigh
30820 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
30830 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  ide.** of the pa
30840 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69 70  ge that particip
30850 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ate in the balan
30860 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20  cing operation. 
30870 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f   NB is the.** to
30880 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
30890 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63 69  ges that partici
308a0 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20  pate, including 
308b0 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65 20  the target page 
308c0 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62  and.** NN neighb
308d0 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
308e0 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69  de..**.** The mi
308f0 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e  nimum value of N
30900 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73  N is 1 (of cours
30910 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20  e).  Increasing 
30920 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74  NN above 1.** (t
30930 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73 20  o 2 or 3) gives 
30940 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65  a modest improve
30950 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61  ment in SELECT a
30960 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72  nd DELETE perfor
30970 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68  mance.** in exch
30980 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65  ange for a large
30990 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e  r degradation in
309a0 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41   INSERT and UPDA
309b0 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a  TE performance..
309c0 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  ** The value of 
309d0 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67 69  NN appears to gi
309e0 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73 75  ve the best resu
309f0 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a  lts overall..*/.
30a00 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20  #define NN 1    
30a10 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
30a20 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20  er of neighbors 
30a30 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  on either side o
30a40 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69  f pPage */.#defi
30a50 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20  ne NB (NN*2+1)  
30a60 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67      /* Total pag
30a70 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
30a80 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a  he balance */...
30a90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
30aa0 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
30ab0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73  ./*.** This vers
30ac0 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29  ion of balance()
30ad0 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d   handles the com
30ae0 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65  mon special case
30af0 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20   where.** a new 
30b00 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20 69  entry is being i
30b10 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65  nserted on the e
30b20 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64  xtreme right-end
30b30 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c   of the.** tree,
30b40 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   in other words,
30b50 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e   when the new en
30b60 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  try will become 
30b70 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65  the largest.** e
30b80 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65  ntry in the tree
30b90 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20  ..**.** Instead 
30ba0 6f 66 20 74 72 79 69 6e 67 20 74 6f 20 62 61 6c  of trying to bal
30bb0 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68 74  ance the 3 right
30bc0 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73  -most leaf pages
30bd0 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20  , just add.** a 
30be0 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 20  new page to the 
30bf0 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
30c00 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20  and put the one 
30c10 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20  new entry in.** 
30c20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69 73  that page.  This
30c30 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67 68   leaves the righ
30c40 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74 72  t side of the tr
30c50 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75  ee somewhat.** u
30c60 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20  nbalanced.  But 
30c70 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77 65  odds are that we
30c80 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69   will be inserti
30c90 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a  ng new entries.*
30ca0 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f  * at the end soo
30cb0 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f 20  n afterwards so 
30cc0 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79  the nearly empty
30cd0 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b   page will quick
30ce0 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20  ly.** fill up.  
30cf0 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a  On average..**.*
30d00 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6c  * pPage is the l
30d10 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 69  eaf page which i
30d20 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
30d30 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72 65   page in the tre
30d40 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73  e..** pParent is
30d50 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50   its parent.  pP
30d60 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 20  age must have a 
30d70 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20  single overflow 
30d80 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69  entry.** which i
30d90 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74  s also the right
30da0 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74  -most entry on t
30db0 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  he page..**.** T
30dc0 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
30dd0 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72   is used to stor
30de0 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 6f  e a temporary co
30df0 70 79 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  py of the divide
30e00 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20 77  r.** cell that w
30e10 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20  ill be inserted 
30e20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 53 75  into pParent. Su
30e30 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73  ch a cell consis
30e40 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79 74  ts of a 4.** byt
30e50 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
30e60 6c 6c 6f 77 65 64 20 62 79 20 61 20 76 61 72 69  llowed by a vari
30e70 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65  able length inte
30e80 67 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a  ger. In other.**
30e90 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74 20   words, at most 
30ea0 31 33 20 62 79 74 65 73 2e 20 48 65 6e 63 65 20  13 bytes. Hence 
30eb0 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  the pSpace buffe
30ec0 72 20 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a 20  r must be at.** 
30ed0 6c 65 61 73 74 20 31 33 20 62 79 74 65 73 20 69  least 13 bytes i
30ee0 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  n size..*/.stati
30ef0 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75  c int balance_qu
30f00 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ick(MemPage *pPa
30f10 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70  rent, MemPage *p
30f20 50 61 67 65 2c 20 75 38 20 2a 70 53 70 61 63 65  Page, u8 *pSpace
30f30 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 63  ){.  BtShared *c
30f40 6f 6e 73 74 20 70 42 74 20 3d 20 70 50 61 67 65  onst pBt = pPage
30f50 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d 54  ->pBt;    /* B-T
30f60 72 65 65 20 44 61 74 61 62 61 73 65 20 2a 2f 0a  ree Database */.
30f70 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b    MemPage *pNew;
30f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f90 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20         /* Newly 
30fa0 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
30fb0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
30fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
30fe0 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 6e  rn Code */.  Pgn
30ff0 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20 20  o pgnoNew;      
31000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31010 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
31020 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20 61   of pNew */..  a
31030 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
31040 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
31050 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
31060 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
31070 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
31080 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
31090 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
310a0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
310b0 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  w==1 );..  /* Th
310c0 69 73 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69  is error conditi
310d0 6f 6e 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74  on is now caught
310e0 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69   prior to reachi
310f0 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
31100 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d   */.  if( pPage-
31110 3e 6e 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75  >nCell==0 ) retu
31120 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
31130 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c  T_BKPT;..  /* Al
31140 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
31150 65 2e 20 54 68 69 73 20 70 61 67 65 20 77 69 6c  e. This page wil
31160 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 69 67  l become the rig
31170 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a 20  ht-sibling of . 
31180 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65 20   ** pPage. Make 
31190 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
311a0 77 72 69 74 61 62 6c 65 2c 20 73 6f 20 74 68 61  writable, so tha
311b0 74 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65  t the new divide
311c0 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20  r cell.  ** may 
311d0 62 65 20 69 6e 73 65 72 74 65 64 2e 20 49 66 20  be inserted. If 
311e0 62 6f 74 68 20 74 68 65 73 65 20 6f 70 65 72 61  both these opera
311f0 74 69 6f 6e 73 20 61 72 65 20 73 75 63 63 65 73  tions are succes
31200 73 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a 20  sful, proceed.. 
31210 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63   */.  rc = alloc
31220 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
31230 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65  , &pNew, &pgnoNe
31240 77 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 69 66 28  w, 0, 0);..  if(
31250 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
31260 7b 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75 74 20  {..    u8 *pOut 
31270 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20 20  = &pSpace[4];.  
31280 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70 50    u8 *pCell = pP
31290 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 3b 0a  age->apOvfl[0];.
312a0 20 20 20 20 75 31 36 20 73 7a 43 65 6c 6c 20 3d      u16 szCell =
312b0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
312c0 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  ge, pCell);.    
312d0 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20 20 20 20  u8 *pStop;..    
312e0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
312f0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
31300 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 20 29  pNew->pDbPage) )
31310 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
31320 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d 28  age->aData[0]==(
31330 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
31340 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46  EAFDATA|PTF_LEAF
31350 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67  ) );.    zeroPag
31360 65 28 70 4e 65 77 2c 20 50 54 46 5f 49 4e 54 4b  e(pNew, PTF_INTK
31370 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c  EY|PTF_LEAFDATA|
31380 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20 61  PTF_LEAF);.    a
31390 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77  ssemblePage(pNew
313a0 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a  , 1, &pCell, &sz
313b0 43 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  Cell);..    /* I
313c0 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
313d0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
313e0 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f  e, update the po
313f0 69 6e 74 65 72 20 6d 61 70 0a 20 20 20 20 2a 2a  inter map.    **
31400 20 77 69 74 68 20 65 6e 74 72 69 65 73 20 66 6f   with entries fo
31410 72 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c 20  r the new page, 
31420 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72 20  and any pointer 
31430 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a 2a  from the .    **
31440 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67   cell on the pag
31450 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e to an overflow
31460 20 70 61 67 65 2e 20 49 66 20 65 69 74 68 65 72   page. If either
31470 20 6f 66 20 74 68 65 73 65 0a 20 20 20 20 2a 2a   of these.    **
31480 20 6f 70 65 72 61 74 69 6f 6e 73 20 66 61 69 6c   operations fail
31490 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  s, the return co
314a0 64 65 20 69 73 20 73 65 74 2c 20 62 75 74 20 74  de is set, but t
314b0 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20  he contents.    
314c0 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ** of the parent
314d0 20 70 61 67 65 20 61 72 65 20 73 74 69 6c 6c 20   page are still 
314e0 6d 61 6e 69 70 75 6c 61 74 65 64 20 62 79 20 74  manipulated by t
314f0 68 68 20 63 6f 64 65 20 62 65 6c 6f 77 2e 0a 20  hh code below.. 
31500 20 20 20 2a 2a 20 54 68 61 74 20 69 73 20 4f 6b     ** That is Ok
31510 2c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  , at this point 
31520 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
31530 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
31540 0a 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65  .    ** be marke
31550 64 20 61 73 20 64 69 72 74 79 2e 20 52 65 74 75  d as dirty. Retu
31560 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63  rning an error c
31570 6f 64 65 20 77 69 6c 6c 20 63 61 75 73 65 20 61  ode will cause a
31580 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b  .    ** rollback
31590 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 63 68  , undoing any ch
315a0 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68  anges made to th
315b0 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20  e parent page.. 
315c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53     */.    if( IS
315d0 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
315e0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
315f0 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d  t, pgnoNew, PTRM
31600 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e  AP_BTREE, pParen
31610 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  t->pgno, &rc);. 
31620 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 3e       if( szCell>
31630 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29  pNew->minLocal )
31640 7b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70  {.        ptrmap
31650 50 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c  PutOvflPtr(pNew,
31660 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 20 20   pCell, &rc);.  
31670 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
31680 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 64     /* Create a d
31690 69 76 69 64 65 72 20 63 65 6c 6c 20 74 6f 20 69  ivider cell to i
316a0 6e 73 65 72 74 20 69 6e 74 6f 20 70 50 61 72 65  nsert into pPare
316b0 6e 74 2e 20 54 68 65 20 64 69 76 69 64 65 72 20  nt. The divider 
316c0 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e 73  cell.    ** cons
316d0 69 73 74 73 20 6f 66 20 61 20 34 2d 62 79 74 65  ists of a 4-byte
316e0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 74 68   page number (th
316f0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
31700 20 70 50 61 67 65 29 20 61 6e 64 0a 20 20 20 20   pPage) and.    
31710 2a 2a 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65  ** a variable le
31720 6e 67 74 68 20 6b 65 79 20 76 61 6c 75 65 20 28  ngth key value (
31730 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 74 68  which must be th
31740 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73 20  e same value as 
31750 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65  the.    ** large
31760 73 74 20 6b 65 79 20 6f 6e 20 70 50 61 67 65 29  st key on pPage)
31770 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
31780 54 6f 20 66 69 6e 64 20 74 68 65 20 6c 61 72 67  To find the larg
31790 65 73 74 20 6b 65 79 20 76 61 6c 75 65 20 6f 6e  est key value on
317a0 20 70 50 61 67 65 2c 20 66 69 72 73 74 20 66 69   pPage, first fi
317b0 6e 64 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  nd the right-mos
317c0 74 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f  t .    ** cell o
317d0 6e 20 70 50 61 67 65 2e 20 54 68 65 20 66 69 72  n pPage. The fir
317e0 73 74 20 74 77 6f 20 66 69 65 6c 64 73 20 6f 66  st two fields of
317f0 20 74 68 69 73 20 63 65 6c 6c 20 61 72 65 20 74   this cell are t
31800 68 65 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72  he .    ** recor
31810 64 2d 6c 65 6e 67 74 68 20 28 61 20 76 61 72 69  d-length (a vari
31820 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65  able length inte
31830 67 65 72 20 61 74 20 6d 6f 73 74 20 33 32 2d 62  ger at most 32-b
31840 69 74 73 20 69 6e 20 73 69 7a 65 29 0a 20 20 20  its in size).   
31850 20 2a 2a 20 61 6e 64 20 74 68 65 20 6b 65 79 20   ** and the key 
31860 76 61 6c 75 65 20 28 61 20 76 61 72 69 61 62 6c  value (a variabl
31870 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72  e length integer
31880 2c 20 6d 61 79 20 68 61 76 65 20 61 6e 79 20 76  , may have any v
31890 61 6c 75 65 29 2e 0a 20 20 20 20 2a 2a 20 54 68  alue)..    ** Th
318a0 65 20 66 69 72 73 74 20 6f 66 20 74 68 65 20 77  e first of the w
318b0 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73 20  hile(...) loops 
318c0 62 65 6c 6f 77 20 73 6b 69 70 73 20 6f 76 65 72  below skips over
318d0 20 74 68 65 20 72 65 63 6f 72 64 2d 6c 65 6e 67   the record-leng
318e0 74 68 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 2e  th.    ** field.
318f0 20 54 68 65 20 73 65 63 6f 6e 64 20 77 68 69 6c   The second whil
31900 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70 69  e(...) loop copi
31910 65 73 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  es the key value
31920 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a   from the.    **
31930 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 69   cell on pPage i
31940 6e 74 6f 20 74 68 65 20 70 53 70 61 63 65 20 62  nto the pSpace b
31950 75 66 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  uffer..    */.  
31960 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
31970 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d  ll(pPage, pPage-
31980 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 70  >nCell-1);.    p
31990 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d  Stop = &pCell[9]
319a0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 28  ;.    while( (*(
319b0 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30 29 20 26  pCell++)&0x80) &
319c0 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b  & pCell<pStop );
319d0 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43  .    pStop = &pC
319e0 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c  ell[9];.    whil
319f0 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b 29 20 3d  e( ((*(pOut++) =
31a00 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26 30 78 38   *(pCell++))&0x8
31a10 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f  0) && pCell<pSto
31a20 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73  p );..    /* Ins
31a30 65 72 74 20 74 68 65 20 6e 65 77 20 64 69 76 69  ert the new divi
31a40 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 70 50  der cell into pP
31a50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 6e  arent. */.    in
31a60 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74  sertCell(pParent
31a70 2c 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  , pParent->nCell
31a80 2c 20 70 53 70 61 63 65 2c 20 28 69 6e 74 29 28  , pSpace, (int)(
31a90 70 4f 75 74 2d 70 53 70 61 63 65 29 2c 0a 20 20  pOut-pSpace),.  
31aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
31ab0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 26 72 63  pPage->pgno, &rc
31ac0 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74  );..    /* Set t
31ad0 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70  he right-child p
31ae0 6f 69 6e 74 65 72 20 6f 66 20 70 50 61 72 65 6e  ointer of pParen
31af0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
31b00 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20  e new page. */. 
31b10 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
31b20 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
31b30 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
31b40 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a  ], pgnoNew);.  .
31b50 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
31b60 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
31b70 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f  the new page. */
31b80 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
31b90 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72  (pNew);.  }..  r
31ba0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
31bb0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
31bc0 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a  T_QUICKBALANCE *
31bd0 2f 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54  /..#if 0./*.** T
31be0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
31bf0 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65  s not contribute
31c00 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65   anything to the
31c10 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 53 51   operation of SQ
31c20 4c 69 74 65 2e 0a 2a 2a 20 69 74 20 69 73 20 73  Lite..** it is s
31c30 6f 6d 65 74 69 6d 65 73 20 61 63 74 69 76 61 74  ometimes activat
31c40 65 64 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 77  ed temporarily w
31c50 68 69 6c 65 20 64 65 62 75 67 67 69 6e 67 20 63  hile debugging c
31c60 6f 64 65 20 72 65 73 70 6f 6e 73 69 62 6c 65 20  ode responsible 
31c70 0a 2a 2a 20 66 6f 72 20 73 65 74 74 69 6e 67 20  .** for setting 
31c80 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
31c90 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ies..*/.static i
31ca0 6e 74 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61  nt ptrmapCheckPa
31cb0 67 65 73 28 4d 65 6d 50 61 67 65 20 2a 2a 61 70  ges(MemPage **ap
31cc0 50 61 67 65 2c 20 69 6e 74 20 6e 50 61 67 65 29  Page, int nPage)
31cd0 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
31ce0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 61 67 65  for(i=0; i<nPage
31cf0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 67 6e 6f  ; i++){.    Pgno
31d00 20 6e 3b 0a 20 20 20 20 75 38 20 65 3b 0a 20 20   n;.    u8 e;.  
31d10 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
31d20 20 3d 20 61 70 50 61 67 65 5b 69 5d 3b 0a 20 20   = apPage[i];.  
31d30 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
31d40 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
31d50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
31d60 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 20 20  >isInit );..    
31d70 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 61 67 65  for(j=0; j<pPage
31d80 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20  ->nCell; j++){. 
31d90 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
31da0 66 6f 3b 0a 20 20 20 20 20 20 75 38 20 2a 7a 3b  fo;.      u8 *z;
31db0 0a 20 20 20 20 20 0a 20 20 20 20 20 20 7a 20 3d  .     .      z =
31dc0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
31dd0 20 6a 29 3b 0a 20 20 20 20 20 20 62 74 72 65 65   j);.      btree
31de0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
31df0 67 65 2c 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a 20  ge, z, &info);. 
31e00 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f       if( info.iO
31e10 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
31e20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67     Pgno ovfl = g
31e30 65 74 34 62 79 74 65 28 26 7a 5b 69 6e 66 6f 2e  et4byte(&z[info.
31e40 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
31e50 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70       ptrmapGet(p
31e60 42 74 2c 20 6f 76 66 6c 2c 20 26 65 2c 20 26 6e  Bt, ovfl, &e, &n
31e70 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
31e80 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  t( n==pPage->pgn
31e90 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 4f  o && e==PTRMAP_O
31ea0 56 45 52 46 4c 4f 57 31 20 29 3b 0a 20 20 20 20  VERFLOW1 );.    
31eb0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
31ec0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
31ed0 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
31ee0 20 3d 20 67 65 74 34 62 79 74 65 28 7a 29 3b 0a   = get4byte(z);.
31ef0 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 47 65          ptrmapGe
31f00 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65  t(pBt, child, &e
31f10 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61  , &n);.        a
31f20 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d  ssert( n==pPage-
31f30 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d  >pgno && e==PTRM
31f40 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20  AP_BTREE );.    
31f50 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
31f60 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
31f70 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69  {.      Pgno chi
31f80 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ld = get4byte(&p
31f90 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
31fa0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
31fb0 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 47 65  ;.      ptrmapGe
31fc0 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65  t(pBt, child, &e
31fd0 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 61 73 73  , &n);.      ass
31fe0 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70  ert( n==pPage->p
31ff0 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50  gno && e==PTRMAP
32000 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 7d 0a  _BTREE );.    }.
32010 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
32020 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
32030 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
32040 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 74 68   used to copy th
32050 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
32060 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 73 74  e b-tree node st
32070 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20 70 61 67 65  ored .** on page
32080 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70   pFrom to page p
32090 54 6f 2e 20 49 66 20 70 61 67 65 20 70 46 72 6f  To. If page pFro
320a0 6d 20 77 61 73 20 6e 6f 74 20 61 20 6c 65 61 66  m was not a leaf
320b0 20 70 61 67 65 2c 20 74 68 65 6e 0a 2a 2a 20 74   page, then.** t
320c0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
320d0 6e 74 72 69 65 73 20 66 6f 72 20 65 61 63 68 20  ntries for each 
320e0 63 68 69 6c 64 20 70 61 67 65 20 61 72 65 20 75  child page are u
320f0 70 64 61 74 65 64 20 73 6f 20 74 68 61 74 20 74  pdated so that t
32100 68 65 0a 2a 2a 20 70 61 72 65 6e 74 20 70 61 67  he.** parent pag
32110 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
32120 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20 70  pointer map is p
32130 61 67 65 20 70 54 6f 2e 20 49 66 20 70 46 72 6f  age pTo. If pFro
32140 6d 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 61  m contained.** a
32150 6e 79 20 63 65 6c 6c 73 20 77 69 74 68 20 6f 76  ny cells with ov
32160 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
32170 74 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ters, then the c
32180 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 69  orresponding poi
32190 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
321a0 69 65 73 20 61 72 65 20 61 6c 73 6f 20 75 70 64  ies are also upd
321b0 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  ated so that the
321c0 20 70 61 72 65 6e 74 20 70 61 67 65 20 69 73 20   parent page is 
321d0 70 61 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20  page pTo..**.** 
321e0 49 66 20 70 46 72 6f 6d 20 69 73 20 63 75 72 72  If pFrom is curr
321f0 65 6e 74 6c 79 20 63 61 72 72 79 69 6e 67 20 61  ently carrying a
32200 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ny overflow cell
32210 73 20 28 65 6e 74 72 69 65 73 20 69 6e 20 74 68  s (entries in th
32220 65 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 70 4f  e.** MemPage.apO
32230 76 66 6c 5b 5d 20 61 72 72 61 79 29 2c 20 74 68  vfl[] array), th
32240 65 79 20 61 72 65 20 6e 6f 74 20 63 6f 70 69 65  ey are not copie
32250 64 20 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a  d to pTo. .**.**
32260 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
32270 67 2c 20 70 61 67 65 20 70 54 6f 20 69 73 20 72  g, page pTo is r
32280 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 75 73 69  einitialized usi
32290 6e 67 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  ng btreeInitPage
322a0 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 65  ()..**.** The pe
322b0 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 74 68 69  rformance of thi
322c0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f  s function is no
322d0 74 20 63 72 69 74 69 63 61 6c 2e 20 49 74 20 69  t critical. It i
322e0 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 0a  s only used by .
322f0 2a 2a 20 74 68 65 20 62 61 6c 61 6e 63 65 5f 73  ** the balance_s
32300 68 61 6c 6c 6f 77 65 72 28 29 20 61 6e 64 20 62  hallower() and b
32310 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20  alance_deeper() 
32320 70 72 6f 63 65 64 75 72 65 73 2c 20 6e 65 69 74  procedures, neit
32330 68 65 72 20 6f 66 0a 2a 2a 20 77 68 69 63 68 20  her of.** which 
32340 61 72 65 20 63 61 6c 6c 65 64 20 6f 66 74 65 6e  are called often
32350 20 75 6e 64 65 72 20 6e 6f 72 6d 61 6c 20 63 69   under normal ci
32360 72 63 75 6d 73 74 61 6e 63 65 73 2e 0a 2a 2f 0a  rcumstances..*/.
32370 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 70 79  static void copy
32380 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 4d 65 6d 50  NodeContent(MemP
32390 61 67 65 20 2a 70 46 72 6f 6d 2c 20 4d 65 6d 50  age *pFrom, MemP
323a0 61 67 65 20 2a 70 54 6f 2c 20 69 6e 74 20 2a 70  age *pTo, int *p
323b0 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43  RC){.  if( (*pRC
323c0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
323d0 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 20 63      BtShared * c
323e0 6f 6e 73 74 20 70 42 74 20 3d 20 70 46 72 6f 6d  onst pBt = pFrom
323f0 2d 3e 70 42 74 3b 0a 20 20 20 20 75 38 20 2a 20  ->pBt;.    u8 * 
32400 63 6f 6e 73 74 20 61 46 72 6f 6d 20 3d 20 70 46  const aFrom = pF
32410 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  rom->aData;.    
32420 75 38 20 2a 20 63 6f 6e 73 74 20 61 54 6f 20 3d  u8 * const aTo =
32430 20 70 54 6f 2d 3e 61 44 61 74 61 3b 0a 20 20 20   pTo->aData;.   
32440 20 69 6e 74 20 63 6f 6e 73 74 20 69 46 72 6f 6d   int const iFrom
32450 48 64 72 20 3d 20 70 46 72 6f 6d 2d 3e 68 64 72  Hdr = pFrom->hdr
32460 4f 66 66 73 65 74 3b 0a 20 20 20 20 69 6e 74 20  Offset;.    int 
32470 63 6f 6e 73 74 20 69 54 6f 48 64 72 20 3d 20 28  const iToHdr = (
32480 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d 31 29 20 3f  (pTo->pgno==1) ?
32490 20 31 30 30 20 3a 20 30 29 3b 0a 20 20 20 20 69   100 : 0);.    i
324a0 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 69  nt rc;.    int i
324b0 44 61 74 61 3b 0a 20 20 0a 20 20 0a 20 20 20 20  Data;.  .  .    
324c0 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69  assert( pFrom->i
324d0 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 61 73 73  sInit );.    ass
324e0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 6e 46 72 65  ert( pFrom->nFre
324f0 65 3e 3d 69 54 6f 48 64 72 20 29 3b 0a 20 20 20  e>=iToHdr );.   
32500 20 61 73 73 65 72 74 28 20 67 65 74 32 62 79 74   assert( get2byt
32510 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64  e(&aFrom[iFromHd
32520 72 2b 35 5d 29 20 3c 3d 20 28 69 6e 74 29 70 42  r+5]) <= (int)pB
32530 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
32540 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  .  .    /* Copy 
32550 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20  the b-tree node 
32560 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 70 61 67  content from pag
32570 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20  e pFrom to page 
32580 70 54 6f 2e 20 2a 2f 0a 20 20 20 20 69 44 61 74  pTo. */.    iDat
32590 61 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 46  a = get2byte(&aF
325a0 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29  rom[iFromHdr+5])
325b0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 54  ;.    memcpy(&aT
325c0 6f 5b 69 44 61 74 61 5d 2c 20 26 61 46 72 6f 6d  o[iData], &aFrom
325d0 5b 69 44 61 74 61 5d 2c 20 70 42 74 2d 3e 75 73  [iData], pBt->us
325e0 61 62 6c 65 53 69 7a 65 2d 69 44 61 74 61 29 3b  ableSize-iData);
325f0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 54 6f  .    memcpy(&aTo
32600 5b 69 54 6f 48 64 72 5d 2c 20 26 61 46 72 6f 6d  [iToHdr], &aFrom
32610 5b 69 46 72 6f 6d 48 64 72 5d 2c 20 70 46 72 6f  [iFromHdr], pFro
32620 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  m->cellOffset + 
32630 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b  2*pFrom->nCell);
32640 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 69 6e 69  .  .    /* Reini
32650 74 69 61 6c 69 7a 65 20 70 61 67 65 20 70 54 6f  tialize page pTo
32660 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e   so that the con
32670 74 65 6e 74 73 20 6f 66 20 74 68 65 20 4d 65 6d  tents of the Mem
32680 50 61 67 65 20 73 74 72 75 63 74 75 72 65 0a 20  Page structure. 
32690 20 20 20 2a 2a 20 6d 61 74 63 68 20 74 68 65 20     ** match the 
326a0 6e 65 77 20 64 61 74 61 2e 20 54 68 65 20 69 6e  new data. The in
326b0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
326c0 70 54 6f 20 63 61 6e 20 61 63 74 75 61 6c 6c 79  pTo can actually
326d0 20 66 61 69 6c 20 75 6e 64 65 72 0a 20 20 20 20   fail under.    
326e0 2a 2a 20 66 61 69 72 6c 79 20 6f 62 73 63 75 72  ** fairly obscur
326f0 65 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2c  e circumstances,
32700 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20   even though it 
32710 69 73 20 61 20 63 6f 70 79 20 6f 66 20 69 6e 69  is a copy of ini
32720 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a  tialized .    **
32730 20 70 61 67 65 20 70 46 72 6f 6d 2e 0a 20 20 20   page pFrom..   
32740 20 2a 2f 0a 20 20 20 20 70 54 6f 2d 3e 69 73 49   */.    pTo->isI
32750 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  nit = 0;.    rc 
32760 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  = btreeInitPage(
32770 70 54 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pTo);.    if( rc
32780 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
32790 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a       *pRC = rc;.
327a0 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
327b0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
327c0 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
327d0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
327e0 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  , update the poi
327f0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
32800 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6e 79 20  .    ** for any 
32810 62 2d 74 72 65 65 20 6f 72 20 6f 76 65 72 66 6c  b-tree or overfl
32820 6f 77 20 70 61 67 65 73 20 74 68 61 74 20 70 54  ow pages that pT
32830 6f 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74  o now contains t
32840 68 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 2e 0a  he pointers to..
32850 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49      */.    if( I
32860 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
32870 20 20 20 20 20 2a 70 52 43 20 3d 20 73 65 74 43       *pRC = setC
32880 68 69 6c 64 50 74 72 6d 61 70 73 28 70 54 6f 29  hildPtrmaps(pTo)
32890 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
328a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
328b0 65 20 72 65 64 69 73 74 72 69 62 75 74 65 73 20  e redistributes 
328c0 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 50 61  cells on the iPa
328d0 72 65 6e 74 49 64 78 27 74 68 20 63 68 69 6c 64  rentIdx'th child
328e0 20 6f 66 20 70 50 61 72 65 6e 74 0a 2a 2a 20 28   of pParent.** (
328f0 68 65 72 65 61 66 74 65 72 20 22 74 68 65 20 70  hereafter "the p
32900 61 67 65 22 29 20 61 6e 64 20 75 70 20 74 6f 20  age") and up to 
32910 32 20 73 69 62 6c 69 6e 67 73 20 73 6f 20 74 68  2 siblings so th
32920 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76  at all pages hav
32930 65 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20 73  e about the.** s
32940 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72  ame amount of fr
32950 65 65 20 73 70 61 63 65 2e 20 55 73 75 61 6c 6c  ee space. Usuall
32960 79 20 61 20 73 69 6e 67 6c 65 20 73 69 62 6c 69  y a single sibli
32970 6e 67 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  ng on either sid
32980 65 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65  e of the.** page
32990 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 65   are used in the
329a0 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 6f 75   balancing, thou
329b0 67 68 20 62 6f 74 68 20 73 69 62 6c 69 6e 67 73  gh both siblings
329c0 20 6d 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d   might come from
329d0 20 6f 6e 65 0a 2a 2a 20 73 69 64 65 20 69 66 20   one.** side if 
329e0 74 68 65 20 70 61 67 65 20 69 73 20 74 68 65 20  the page is the 
329f0 66 69 72 73 74 20 6f 72 20 6c 61 73 74 20 63 68  first or last ch
32a00 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e  ild of its paren
32a10 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 0a  t. If the page .
32a20 2a 2a 20 68 61 73 20 66 65 77 65 72 20 74 68 61  ** has fewer tha
32a30 6e 20 32 20 73 69 62 6c 69 6e 67 73 20 28 73 6f  n 2 siblings (so
32a40 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20 63 61  mething which ca
32a50 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
32a60 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20   the page.** is 
32a70 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61  a root page or a
32a80 20 63 68 69 6c 64 20 6f 66 20 61 20 72 6f 6f 74   child of a root
32a90 20 70 61 67 65 29 20 74 68 65 6e 20 61 6c 6c 20   page) then all 
32aa0 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e  available siblin
32ab0 67 73 0a 2a 2a 20 70 61 72 74 69 63 69 70 61 74  gs.** participat
32ac0 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  e in the balanci
32ad0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75  ng..**.** The nu
32ae0 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73  mber of siblings
32af0 20 6f 66 20 74 68 65 20 70 61 67 65 20 6d 69 67   of the page mig
32b00 68 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 20  ht be increased 
32b10 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20  or decreased by 
32b20 0a 2a 2a 20 6f 6e 65 20 6f 72 20 74 77 6f 20 69  .** one or two i
32b30 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b  n an effort to k
32b40 65 65 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79  eep pages nearly
32b50 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76   full but not ov
32b60 65 72 20 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20  er full. .**.** 
32b70 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20 74  Note that when t
32b80 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
32b90 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74  alled, some of t
32ba0 68 65 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  he cells on the 
32bb0 70 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f  page.** might no
32bc0 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74  t actually be st
32bd0 6f 72 65 64 20 69 6e 20 4d 65 6d 50 61 67 65 2e  ored in MemPage.
32be0 61 44 61 74 61 5b 5d 2e 20 54 68 69 73 20 63 61  aData[]. This ca
32bf0 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74  n happen.** if t
32c00 68 65 20 70 61 67 65 20 69 73 20 6f 76 65 72 66  he page is overf
32c10 75 6c 6c 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ull. This routin
32c20 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 61  e ensures that a
32c30 6c 6c 20 63 65 6c 6c 73 20 61 6c 6c 6f 63 61 74  ll cells allocat
32c40 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67  ed.** to the pag
32c50 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e  e and its siblin
32c60 67 73 20 66 69 74 20 69 6e 74 6f 20 4d 65 6d 50  gs fit into MemP
32c70 61 67 65 2e 61 44 61 74 61 5b 5d 20 62 65 66 6f  age.aData[] befo
32c80 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
32c90 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73  .** In the cours
32ca0 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74  e of balancing t
32cb0 68 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20  he page and its 
32cc0 73 69 62 6c 69 6e 67 73 2c 20 63 65 6c 6c 73 20  siblings, cells 
32cd0 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 73 65 72 74  may be.** insert
32ce0 65 64 20 69 6e 74 6f 20 6f 72 20 72 65 6d 6f 76  ed into or remov
32cf0 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65  ed from the pare
32d00 6e 74 20 70 61 67 65 20 28 70 50 61 72 65 6e 74  nt page (pParent
32d10 29 2e 20 44 6f 69 6e 67 20 73 6f 0a 2a 2a 20 6d  ). Doing so.** m
32d20 61 79 20 63 61 75 73 65 20 74 68 65 20 70 61 72  ay cause the par
32d30 65 6e 74 20 70 61 67 65 20 74 6f 20 62 65 63 6f  ent page to beco
32d40 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75  me overfull or u
32d50 6e 64 65 72 66 75 6c 6c 2e 20 49 66 20 74 68 69  nderfull. If thi
32d60 73 0a 2a 2a 20 68 61 70 70 65 6e 73 2c 20 69 74  s.** happens, it
32d70 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
32d80 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
32d90 6c 6c 65 72 20 74 6f 20 69 6e 76 6f 6b 65 20 74  ller to invoke t
32da0 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 62 61  he correct.** ba
32db0 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 20  lancing routine 
32dc0 74 6f 20 66 69 78 20 74 68 69 73 20 70 72 6f 62  to fix this prob
32dd0 6c 65 6d 20 28 73 65 65 20 74 68 65 20 62 61 6c  lem (see the bal
32de0 61 6e 63 65 28 29 20 72 6f 75 74 69 6e 65 29 2e  ance() routine).
32df0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20   .**.** If this 
32e00 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f  routine fails fo
32e10 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74  r any reason, it
32e20 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68 65   might leave the
32e30 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20   database.** in 
32e40 61 20 63 6f 72 72 75 70 74 65 64 20 73 74 61 74  a corrupted stat
32e50 65 2e 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  e. So if this ro
32e60 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65  utine fails, the
32e70 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
32e80 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  .** be rolled ba
32e90 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68  ck..**.** The th
32ea0 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ird argument to 
32eb0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
32ec0 4f 76 66 6c 53 70 61 63 65 2c 20 69 73 20 61 20  OvflSpace, is a 
32ed0 70 6f 69 6e 74 65 72 20 74 6f 20 61 0a 2a 2a 20  pointer to a.** 
32ee0 62 75 66 66 65 72 20 62 69 67 20 65 6e 6f 75 67  buffer big enoug
32ef0 68 20 74 6f 20 68 6f 6c 64 20 6f 6e 65 20 70 61  h to hold one pa
32f00 67 65 2e 20 49 66 20 77 68 69 6c 65 20 69 6e 73  ge. If while ins
32f10 65 72 74 69 6e 67 20 63 65 6c 6c 73 20 69 6e 74  erting cells int
32f20 6f 20 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20  o the parent.** 
32f30 70 61 67 65 20 28 70 50 61 72 65 6e 74 29 20 74  page (pParent) t
32f40 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 62  he parent page b
32f50 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c  ecomes overfull,
32f60 20 74 68 69 73 20 62 75 66 66 65 72 20 69 73 0a   this buffer is.
32f70 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  ** used to store
32f80 20 74 68 65 20 70 61 72 65 6e 74 27 73 20 6f 76   the parent's ov
32f90 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 42 65  erflow cells. Be
32fa0 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63 74  cause this funct
32fb0 69 6f 6e 20 69 6e 73 65 72 74 73 0a 2a 2a 20 61  ion inserts.** a
32fc0 20 6d 61 78 69 6d 75 6d 20 6f 66 20 66 6f 75 72   maximum of four
32fd0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69   divider cells i
32fe0 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70  nto the parent p
32ff0 61 67 65 2c 20 61 6e 64 20 74 68 65 20 6d 61 78  age, and the max
33000 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  imum.** size of 
33010 61 20 63 65 6c 6c 20 73 74 6f 72 65 64 20 77 69  a cell stored wi
33020 74 68 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c  thin an internal
33030 20 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20   node is always 
33040 6c 65 73 73 20 74 68 61 6e 20 31 2f 34 0a 2a 2a  less than 1/4.**
33050 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a   of the page-siz
33060 65 2c 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63  e, the aOvflSpac
33070 65 5b 5d 20 62 75 66 66 65 72 20 69 73 20 67 75  e[] buffer is gu
33080 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c  aranteed to be l
33090 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 66  arge.** enough f
330a0 6f 72 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20  or all overflow 
330b0 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cells..**.** If 
330c0 61 4f 76 66 6c 53 70 61 63 65 20 69 73 20 73 65  aOvflSpace is se
330d0 74 20 74 6f 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  t to a null poin
330e0 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ter, this functi
330f0 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  on returns .** S
33100 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a  QLITE_NOMEM..*/.
33110 23 69 66 20 64 65 66 69 6e 65 64 28 5f 4d 53 43  #if defined(_MSC
33120 5f 56 45 52 29 20 26 26 20 5f 4d 53 43 5f 56 45  _VER) && _MSC_VE
33130 52 20 3e 3d 20 31 37 30 30 20 26 26 20 64 65 66  R >= 1700 && def
33140 69 6e 65 64 28 5f 4d 5f 41 52 4d 29 0a 23 70 72  ined(_M_ARM).#pr
33150 61 67 6d 61 20 6f 70 74 69 6d 69 7a 65 28 22 22  agma optimize(""
33160 2c 20 6f 66 66 29 0a 23 65 6e 64 69 66 0a 73 74  , off).#endif.st
33170 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
33180 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d 50  _nonroot(.  MemP
33190 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20  age *pParent,   
331a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
331b0 61 72 65 6e 74 20 70 61 67 65 20 6f 66 20 73 69  arent page of si
331c0 62 6c 69 6e 67 73 20 62 65 69 6e 67 20 62 61 6c  blings being bal
331d0 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  anced */.  int i
331e0 50 61 72 65 6e 74 49 64 78 2c 20 20 20 20 20 20  ParentIdx,      
331f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
33200 64 65 78 20 6f 66 20 22 74 68 65 20 70 61 67 65  dex of "the page
33210 22 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a  " in pParent */.
33220 20 20 75 38 20 2a 61 4f 76 66 6c 53 70 61 63 65    u8 *aOvflSpace
33230 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
33240 20 20 2f 2a 20 70 61 67 65 2d 73 69 7a 65 20 62    /* page-size b
33250 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
33260 72 20 70 61 72 65 6e 74 20 6f 76 66 6c 20 2a 2f  r parent ovfl */
33270 0a 20 20 69 6e 74 20 69 73 52 6f 6f 74 2c 20 20  .  int isRoot,  
33280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33290 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50     /* True if pP
332a0 61 72 65 6e 74 20 69 73 20 61 20 72 6f 6f 74 2d  arent is a root-
332b0 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 62 42  page */.  int bB
332c0 75 6c 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  ulk             
332d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
332e0 65 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69  e if this call i
332f0 73 20 70 61 72 74 20 6f 66 20 61 20 62 75 6c 6b  s part of a bulk
33300 20 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 42 74   load */.){.  Bt
33310 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
33320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
33330 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65  e whole database
33340 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20   */.  int nCell 
33350 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
33360 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
33370 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
33380 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43  ] */.  int nMaxC
33390 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20  ells = 0;       
333a0 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
333b0 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c   size of apCell,
333c0 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20   szCell, aFrom. 
333d0 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20  */.  int nNew = 
333e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
333f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
33400 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20  ages in apNew[] 
33410 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20  */.  int nOld;  
33420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33430 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
33440 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20  ages in apOld[] 
33450 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  */.  int i, j, k
33460 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33470 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
33480 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69  rs */.  int nxDi
33490 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
334a0 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76       /* Next div
334b0 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61  ider slot in pPa
334c0 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f  rent->aCell[] */
334d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
334e0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
334f0 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f  /* The return co
33500 64 65 20 2a 2f 0a 20 20 75 31 36 20 6c 65 61 66  de */.  u16 leaf
33510 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20  Correction;     
33520 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61       /* 4 if pPa
33530 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30  ge is a leaf.  0
33540 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74   if not */.  int
33550 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20 20   leafData;      
33560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
33570 65 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20  e if pPage is a 
33580 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41  leaf of a LEAFDA
33590 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  TA tree */.  int
335a0 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20   usableSpace;   
335b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
335c0 65 73 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f  es in pPage beyo
335d0 6e 64 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  nd the header */
335e0 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73  .  int pageFlags
335f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33600 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67  /* Value of pPag
33610 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20  e->aData[0] */. 
33620 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20   int subtotal;  
33630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33640 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74   Subtotal of byt
33650 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f  es in cells on o
33660 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ne page */.  int
33670 20 69 53 70 61 63 65 31 20 3d 20 30 3b 20 20 20   iSpace1 = 0;   
33680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
33690 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f  st unused byte o
336a0 66 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a 20  f aSpace1[] */. 
336b0 20 69 6e 74 20 69 4f 76 66 6c 53 70 61 63 65 20   int iOvflSpace 
336c0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
336d0 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79   First unused by
336e0 74 65 20 6f 66 20 61 4f 76 66 6c 53 70 61 63 65  te of aOvflSpace
336f0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63  [] */.  int szSc
33700 72 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20  ratch;          
33710 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
33720 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 72  scratch memory r
33730 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65  equested */.  Me
33740 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d  mPage *apOld[NB]
33750 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50  ;          /* pP
33760 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77  age and up to tw
33770 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20  o siblings */.  
33780 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79 5b  MemPage *apCopy[
33790 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  NB];         /* 
337a0 50 72 69 76 61 74 65 20 63 6f 70 69 65 73 20 6f  Private copies o
337b0 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20  f apOld[] pages 
337c0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
337d0 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
337e0 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75    /* pPage and u
337f0 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73  p to NB siblings
33800 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67   after balancing
33810 20 2a 2f 0a 20 20 75 38 20 2a 70 52 69 67 68 74   */.  u8 *pRight
33820 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33830 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 69     /* Location i
33840 6e 20 70 61 72 65 6e 74 20 6f 66 20 72 69 67 68  n parent of righ
33850 74 2d 73 69 62 6c 69 6e 67 20 70 6f 69 6e 74 65  t-sibling pointe
33860 72 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76  r */.  u8 *apDiv
33870 5b 4e 42 2d 31 5d 3b 20 20 20 20 20 20 20 20 20  [NB-1];         
33880 20 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63      /* Divider c
33890 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20  ells in pParent 
338a0 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b  */.  int cntNew[
338b0 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
338c0 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43    /* Index in aC
338d0 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66  ell[] of cell af
338e0 74 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f  ter i-th page */
338f0 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b  .  int szNew[NB+
33900 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  2];             
33910 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65  /* Combined size
33920 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20   of cells place 
33930 6f 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a  on i-th page */.
33940 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20    u8 **apCell = 
33950 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
33960 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69  * All cells begi
33970 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  n balanced */.  
33980 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20  u16 *szCell;    
33990 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
339a0 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c  Local size of al
339b0 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  l cells in apCel
339c0 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70  l[] */.  u8 *aSp
339d0 61 63 65 31 3b 20 20 20 20 20 20 20 20 20 20 20  ace1;           
339e0 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
339f0 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76  or copies of div
33a00 69 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a 20  iders cells */. 
33a10 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
33a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33a30 20 54 65 6d 70 20 76 61 72 20 74 6f 20 73 74 6f   Temp var to sto
33a40 72 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  re a page number
33a50 20 69 6e 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20   in */..  pBt = 
33a60 70 50 61 72 65 6e 74 2d 3e 70 42 74 3b 0a 20 20  pParent->pBt;.  
33a70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
33a80 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
33a90 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
33aa0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
33ab0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
33ac0 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
33ad0 0a 0a 23 69 66 20 30 0a 20 20 54 52 41 43 45 28  ..#if 0.  TRACE(
33ae0 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e  ("BALANCE: begin
33af0 20 70 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f   page %d child o
33b00 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  f %d\n", pPage->
33b10 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70  pgno, pParent->p
33b20 67 6e 6f 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  gno));.#endif.. 
33b30 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
33b40 74 20 70 50 61 72 65 6e 74 20 6d 61 79 20 68 61  t pParent may ha
33b50 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 6f  ve at most one o
33b60 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 41 6e  verflow cell. An
33b70 64 20 69 66 0a 20 20 2a 2a 20 74 68 69 73 20 6f  d if.  ** this o
33b80 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20  verflow cell is 
33b90 70 72 65 73 65 6e 74 2c 20 69 74 20 6d 75 73 74  present, it must
33ba0 20 62 65 20 74 68 65 20 63 65 6c 6c 20 77 69 74   be the cell wit
33bb0 68 20 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 50  h .  ** index iP
33bc0 61 72 65 6e 74 49 64 78 2e 20 54 68 69 73 20 73  arentIdx. This s
33bd0 63 65 6e 61 72 69 6f 20 63 6f 6d 65 73 20 61 62  cenario comes ab
33be0 6f 75 74 20 77 68 65 6e 20 74 68 69 73 20 66 75  out when this fu
33bf0 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 63  nction.  ** is c
33c00 61 6c 6c 65 64 20 28 69 6e 64 69 72 65 63 74 6c  alled (indirectl
33c10 79 29 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42  y) from sqlite3B
33c20 74 72 65 65 44 65 6c 65 74 65 28 29 2e 0a 20 20  treeDelete()..  
33c30 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
33c40 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  rent->nOverflow=
33c50 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 6e  =0 || pParent->n
33c60 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20  Overflow==1 );. 
33c70 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
33c80 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c  ->nOverflow==0 |
33c90 7c 20 70 50 61 72 65 6e 74 2d 3e 61 69 4f 76 66  | pParent->aiOvf
33ca0 6c 5b 30 5d 3d 3d 69 50 61 72 65 6e 74 49 64 78  l[0]==iParentIdx
33cb0 20 29 3b 0a 0a 20 20 69 66 28 20 21 61 4f 76 66   );..  if( !aOvf
33cc0 6c 53 70 61 63 65 20 29 7b 0a 20 20 20 20 72 65  lSpace ){.    re
33cd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
33ce0 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e  M;.  }..  /* Fin
33cf0 64 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  d the sibling pa
33d00 67 65 73 20 74 6f 20 62 61 6c 61 6e 63 65 2e 20  ges to balance. 
33d10 41 6c 73 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  Also locate the 
33d20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
33d30 20 0a 20 20 2a 2a 20 74 68 61 74 20 64 69 76 69   .  ** that divi
33d40 64 65 20 74 68 65 20 73 69 62 6c 69 6e 67 73 2e  de the siblings.
33d50 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   An attempt is m
33d60 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73  ade to find NN s
33d70 69 62 6c 69 6e 67 73 20 6f 6e 20 0a 20 20 2a 2a  iblings on .  **
33d80 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
33d90 70 50 61 67 65 2e 20 4d 6f 72 65 20 73 69 62 6c  pPage. More sibl
33da0 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66  ings are taken f
33db0 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f  rom one side, ho
33dc0 77 65 76 65 72 2c 20 0a 20 20 2a 2a 20 69 66 20  wever, .  ** if 
33dd0 74 68 65 72 65 20 61 72 65 20 66 65 77 65 72 20  there are fewer 
33de0 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73  than NN siblings
33df0 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69   on the other si
33e00 64 65 2e 20 49 66 20 70 50 61 72 65 6e 74 0a 20  de. If pParent. 
33e10 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65   ** has NB or fe
33e20 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65  wer children the
33e30 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f  n all children o
33e40 66 20 70 50 61 72 65 6e 74 20 61 72 65 20 74 61  f pParent are ta
33e50 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ken.  .  **.  **
33e60 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20   This loop also 
33e70 64 72 6f 70 73 20 74 68 65 20 64 69 76 69 64 65  drops the divide
33e80 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68 65  r cells from the
33e90 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 54 68   parent page. Th
33ea0 69 73 0a 20 20 2a 2a 20 77 61 79 2c 20 74 68 65  is.  ** way, the
33eb0 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
33ec0 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  e function does 
33ed0 6e 6f 74 20 68 61 76 65 20 74 6f 20 64 65 61 6c  not have to deal
33ee0 20 77 69 74 68 20 61 6e 79 0a 20 20 2a 2a 20 6f   with any.  ** o
33ef0 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 69 6e  verflow cells in
33f00 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
33f10 2c 20 73 69 6e 63 65 20 69 66 20 61 6e 79 20 65  , since if any e
33f20 78 69 73 74 65 64 20 74 68 65 79 20 77 69 6c 6c  xisted they will
33f30 0a 20 20 2a 2a 20 68 61 76 65 20 61 6c 72 65 61  .  ** have alrea
33f40 64 79 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e  dy been removed.
33f50 0a 20 20 2a 2f 0a 20 20 69 20 3d 20 70 50 61 72  .  */.  i = pPar
33f60 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 2b  ent->nOverflow +
33f70 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b   pParent->nCell;
33f80 0a 20 20 69 66 28 20 69 3c 32 20 29 7b 0a 20 20  .  if( i<2 ){.  
33f90 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d    nxDiv = 0;.  }
33fa0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
33fb0 28 20 62 42 75 6c 6b 3d 3d 30 20 7c 7c 20 62 42  ( bBulk==0 || bB
33fc0 75 6c 6b 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66  ulk==1 );.    if
33fd0 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 30 20  ( iParentIdx==0 
33fe0 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
33ff0 20 20 20 0a 20 20 20 20 20 20 6e 78 44 69 76 20     .      nxDiv 
34000 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
34010 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 69  f( iParentIdx==i
34020 20 29 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20   ){.      nxDiv 
34030 3d 20 69 2d 32 2b 62 42 75 6c 6b 3b 0a 20 20 20  = i-2+bBulk;.   
34040 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
34050 73 65 72 74 28 20 62 42 75 6c 6b 3d 3d 30 20 29  sert( bBulk==0 )
34060 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20  ;.      nxDiv = 
34070 69 50 61 72 65 6e 74 49 64 78 2d 31 3b 0a 20 20  iParentIdx-1;.  
34080 20 20 7d 0a 20 20 20 20 69 20 3d 20 32 2d 62 42    }.    i = 2-bB
34090 75 6c 6b 3b 0a 20 20 7d 0a 20 20 6e 4f 6c 64 20  ulk;.  }.  nOld 
340a0 3d 20 69 2b 31 3b 0a 20 20 69 66 28 20 28 69 2b  = i+1;.  if( (i+
340b0 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e  nxDiv-pParent->n
340c0 4f 76 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65  Overflow)==pPare
340d0 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
340e0 20 70 52 69 67 68 74 20 3d 20 26 70 50 61 72 65   pRight = &pPare
340f0 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
34100 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b  t->hdrOffset+8];
34110 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
34120 69 67 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28  ight = findCell(
34130 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76  pParent, i+nxDiv
34140 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
34150 6c 6f 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f  low);.  }.  pgno
34160 20 3d 20 67 65 74 34 62 79 74 65 28 70 52 69 67   = get4byte(pRig
34170 68 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20  ht);.  while( 1 
34180 29 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41  ){.    rc = getA
34190 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
341a0 70 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c  pgno, &apOld[i],
341b0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
341c0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
341d0 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a  apOld, 0, (i+1)*
341e0 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29  sizeof(MemPage*)
341f0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 61  );.      goto ba
34200 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
34210 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 43 65 6c     }.    nMaxCel
34220 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d  ls += 1+apOld[i]
34230 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d  ->nCell+apOld[i]
34240 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  ->nOverflow;.   
34250 20 69 66 28 20 28 69 2d 2d 29 3d 3d 30 20 29 20   if( (i--)==0 ) 
34260 62 72 65 61 6b 3b 0a 0a 20 20 20 20 69 66 28 20  break;..    if( 
34270 69 2b 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e 74  i+nxDiv==pParent
34280 2d 3e 61 69 4f 76 66 6c 5b 30 5d 20 26 26 20 70  ->aiOvfl[0] && p
34290 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
342a0 77 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76  w ){.      apDiv
342b0 5b 69 5d 20 3d 20 70 50 61 72 65 6e 74 2d 3e 61  [i] = pParent->a
342c0 70 4f 76 66 6c 5b 30 5d 3b 0a 20 20 20 20 20 20  pOvfl[0];.      
342d0 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
342e0 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20  apDiv[i]);.     
342f0 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c   szNew[i] = cell
34300 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c  SizePtr(pParent,
34310 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20   apDiv[i]);.    
34320 20 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72    pParent->nOver
34330 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 65  flow = 0;.    }e
34340 6c 73 65 7b 0a 20 20 20 20 20 20 61 70 44 69 76  lse{.      apDiv
34350 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  [i] = findCell(p
34360 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d  Parent, i+nxDiv-
34370 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
34380 6f 77 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20  ow);.      pgno 
34390 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76  = get4byte(apDiv
343a0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65  [i]);.      szNe
343b0 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  w[i] = cellSizeP
343c0 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69  tr(pParent, apDi
343d0 76 5b 69 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  v[i]);..      /*
343e0 20 44 72 6f 70 20 74 68 65 20 63 65 6c 6c 20 66   Drop the cell f
343f0 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70  rom the parent p
34400 61 67 65 2e 20 61 70 44 69 76 5b 69 5d 20 73 74  age. apDiv[i] st
34410 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 0a 20 20  ill points to.  
34420 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 20      ** the cell 
34430 77 69 74 68 69 6e 20 74 68 65 20 70 61 72 65 6e  within the paren
34440 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69  t, even though i
34450 74 20 68 61 73 20 62 65 65 6e 20 64 72 6f 70 70  t has been dropp
34460 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  ed..      ** Thi
34470 73 20 69 73 20 73 61 66 65 20 62 65 63 61 75 73  s is safe becaus
34480 65 20 64 72 6f 70 70 69 6e 67 20 61 20 63 65 6c  e dropping a cel
34490 6c 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74 65  l only overwrite
344a0 73 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20  s the first.    
344b0 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20    ** four bytes 
344c0 6f 66 20 69 74 2c 20 61 6e 64 20 74 68 69 73 20  of it, and this 
344d0 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
344e0 74 20 6e 65 65 64 20 74 68 65 20 66 69 72 73 74  t need the first
344f0 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62  .      ** four b
34500 79 74 65 73 20 6f 66 20 74 68 65 20 64 69 76 69  ytes of the divi
34510 64 65 72 20 63 65 6c 6c 2e 20 53 6f 20 74 68 65  der cell. So the
34520 20 70 6f 69 6e 74 65 72 20 69 73 20 73 61 66 65   pointer is safe
34530 20 74 6f 20 75 73 65 0a 20 20 20 20 20 20 2a 2a   to use.      **
34540 20 6c 61 74 65 72 20 6f 6e 2e 20 20 0a 20 20 20   later on.  .   
34550 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42     **.      ** B
34560 75 74 20 6e 6f 74 20 69 66 20 77 65 20 61 72 65  ut not if we are
34570 20 69 6e 20 73 65 63 75 72 65 2d 64 65 6c 65 74   in secure-delet
34580 65 20 6d 6f 64 65 2e 20 49 6e 20 73 65 63 75 72  e mode. In secur
34590 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2c 0a 20  e-delete mode,. 
345a0 20 20 20 20 20 2a 2a 20 74 68 65 20 64 72 6f 70       ** the drop
345b0 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e 65 20 77  Cell() routine w
345c0 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68  ill overwrite th
345d0 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 77 69  e entire cell wi
345e0 74 68 20 7a 65 72 6f 65 73 2e 0a 20 20 20 20 20  th zeroes..     
345f0 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
34600 2c 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 63 6f  , temporarily co
34610 70 79 20 74 68 65 20 63 65 6c 6c 20 69 6e 74 6f  py the cell into
34620 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b   the aOvflSpace[
34630 5d 0a 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65  ].      ** buffe
34640 72 2e 20 49 74 20 77 69 6c 6c 20 62 65 20 63 6f  r. It will be co
34650 70 69 65 64 20 6f 75 74 20 61 67 61 69 6e 20 61  pied out again a
34660 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 61 53  s soon as the aS
34670 70 61 63 65 5b 5d 20 62 75 66 66 65 72 0a 20 20  pace[] buffer.  
34680 20 20 20 20 2a 2a 20 69 73 20 61 6c 6c 6f 63 61      ** is alloca
34690 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ted.  */.      i
346a0 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
346b0 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
346c0 4c 45 54 45 20 29 7b 0a 20 20 20 20 20 20 20 20  LETE ){.        
346d0 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 20 20 20  int iOff;..     
346e0 20 20 20 69 4f 66 66 20 3d 20 53 51 4c 49 54 45     iOff = SQLITE
346f0 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 61 70 44 69  _PTR_TO_INT(apDi
34700 76 5b 69 5d 29 20 2d 20 53 51 4c 49 54 45 5f 50  v[i]) - SQLITE_P
34710 54 52 5f 54 4f 5f 49 4e 54 28 70 50 61 72 65 6e  TR_TO_INT(pParen
34720 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20  t->aData);.     
34730 20 20 20 69 66 28 20 28 69 4f 66 66 2b 73 7a 4e     if( (iOff+szN
34740 65 77 5b 69 5d 29 3e 28 69 6e 74 29 70 42 74 2d  ew[i])>(int)pBt-
34750 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
34760 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
34770 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
34780 54 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  T;.          mem
34790 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69  set(apOld, 0, (i
347a0 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61  +1)*sizeof(MemPa
347b0 67 65 2a 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ge*));.         
347c0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
347d0 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d  eanup;.        }
347e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
347f0 6d 65 6d 63 70 79 28 26 61 4f 76 66 6c 53 70 61  memcpy(&aOvflSpa
34800 63 65 5b 69 4f 66 66 5d 2c 20 61 70 44 69 76 5b  ce[iOff], apDiv[
34810 69 5d 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20  i], szNew[i]);. 
34820 20 20 20 20 20 20 20 20 20 61 70 44 69 76 5b 69           apDiv[i
34830 5d 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65 5b  ] = &aOvflSpace[
34840 61 70 44 69 76 5b 69 5d 2d 70 50 61 72 65 6e 74  apDiv[i]-pParent
34850 2d 3e 61 44 61 74 61 5d 3b 0a 20 20 20 20 20 20  ->aData];.      
34860 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
34870 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65    dropCell(pPare
34880 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72  nt, i+nxDiv-pPar
34890 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20  ent->nOverflow, 
348a0 73 7a 4e 65 77 5b 69 5d 2c 20 26 72 63 29 3b 0a  szNew[i], &rc);.
348b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
348c0 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61  Make nMaxCells a
348d0 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34 20 69   multiple of 4 i
348e0 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 73 65  n order to prese
348f0 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20  rve 8-byte.  ** 
34900 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e  alignment */.  n
34910 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78  MaxCells = (nMax
34920 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a  Cells + 3)&~3;..
34930 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61    /*.  ** Alloca
34940 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d  te space for mem
34950 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 0a 20  ory structures. 
34960 20 2a 2f 0a 20 20 6b 20 3d 20 70 42 74 2d 3e 70   */.  k = pBt->p
34970 61 67 65 53 69 7a 65 20 2b 20 52 4f 55 4e 44 38  ageSize + ROUND8
34980 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29  (sizeof(MemPage)
34990 29 3b 0a 20 20 73 7a 53 63 72 61 74 63 68 20 3d  );.  szScratch =
349a0 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c  .       nMaxCell
349b0 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20 20 20  s*sizeof(u8*)   
349c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
349d0 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f      /* apCell */
349e0 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c  .     + nMaxCell
349f0 73 2a 73 69 7a 65 6f 66 28 75 31 36 29 20 20 20  s*sizeof(u16)   
34a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a10 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f      /* szCell */
34a20 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67  .     + pBt->pag
34a30 65 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  eSize           
34a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a50 20 20 20 20 2f 2a 20 61 53 70 61 63 65 31 20 2a      /* aSpace1 *
34a60 2f 0a 20 20 20 20 20 2b 20 6b 2a 6e 4f 6c 64 3b  /.     + k*nOld;
34a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a90 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 70       /* Page cop
34aa0 69 65 73 20 28 61 70 43 6f 70 79 29 20 2a 2f 0a  ies (apCopy) */.
34ab0 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74    apCell = sqlit
34ac0 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28  e3ScratchMalloc(
34ad0 20 73 7a 53 63 72 61 74 63 68 20 29 3b 20 0a 20   szScratch ); . 
34ae0 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29   if( apCell==0 )
34af0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
34b00 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
34b10 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
34b20 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20  p;.  }.  szCell 
34b30 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b  = (u16*)&apCell[
34b40 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 53  nMaxCells];.  aS
34b50 70 61 63 65 31 20 3d 20 28 75 38 2a 29 26 73 7a  pace1 = (u8*)&sz
34b60 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
34b70 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
34b80 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
34b90 61 53 70 61 63 65 31 29 20 29 3b 0a 0a 20 20 2f  aSpace1) );..  /
34ba0 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e  *.  ** Load poin
34bb0 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c  ters to all cell
34bc0 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67  s on sibling pag
34bd0 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69 64  es and the divid
34be0 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e  er cells.  ** in
34bf0 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43  to the local apC
34c00 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61  ell[] array.  Ma
34c10 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  ke copies of the
34c20 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20   divider cells. 
34c30 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f   ** into space o
34c40 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 53 70  btained from aSp
34c50 61 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f 76  ace1[] and remov
34c60 65 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  e the divider ce
34c70 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50  lls.  ** from pP
34c80 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  arent..  **.  **
34c90 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73   If the siblings
34ca0 20 61 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67   are on leaf pag
34cb0 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69  es, then the chi
34cc0 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74  ld pointers of t
34cd0 68 65 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20  he.  ** divider 
34ce0 63 65 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70  cells are stripp
34cf0 65 64 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c  ed from the cell
34d00 73 20 62 65 66 6f 72 65 20 74 68 65 79 20 61 72  s before they ar
34d10 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e  e copied.  ** in
34d20 74 6f 20 61 53 70 61 63 65 31 5b 5d 2e 20 20 49  to aSpace1[].  I
34d30 6e 20 74 68 69 73 20 77 61 79 2c 20 61 6c 6c 20  n this way, all 
34d40 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
34d50 5d 20 61 72 65 20 77 69 74 68 6f 75 74 0a 20 20  ] are without.  
34d60 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  ** child pointer
34d70 73 2e 20 20 49 66 20 73 69 62 6c 69 6e 67 73 20  s.  If siblings 
34d80 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20  are not leaves, 
34d90 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e  then all cell in
34da0 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69  .  ** apCell[] i
34db0 6e 63 6c 75 64 65 20 63 68 69 6c 64 20 70 6f 69  nclude child poi
34dc0 6e 74 65 72 73 2e 20 20 45 69 74 68 65 72 20 77  nters.  Either w
34dd0 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e  ay, all cells in
34de0 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61   apCell[].  ** a
34df0 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20  re alike..  **. 
34e00 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63 74 69   ** leafCorrecti
34e10 6f 6e 3a 20 20 34 20 69 66 20 70 50 61 67 65 20  on:  4 if pPage 
34e20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66  is a leaf.  0 if
34e30 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 61 20   pPage is not a 
34e40 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20  leaf..  **      
34e50 20 6c 65 61 66 44 61 74 61 3a 20 20 31 20 69 66   leafData:  1 if
34e60 20 70 50 61 67 65 20 68 6f 6c 64 73 20 6b 65 79   pPage holds key
34e70 2b 64 61 74 61 20 61 6e 64 20 70 50 61 72 65 6e  +data and pParen
34e80 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79  t holds only key
34e90 73 2e 0a 20 20 2a 2f 0a 20 20 6c 65 61 66 43 6f  s..  */.  leafCo
34ea0 72 72 65 63 74 69 6f 6e 20 3d 20 61 70 4f 6c 64  rrection = apOld
34eb0 5b 30 5d 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c  [0]->leaf*4;.  l
34ec0 65 61 66 44 61 74 61 20 3d 20 61 70 4f 6c 64 5b  eafData = apOld[
34ed0 30 5d 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20 66  0]->hasData;.  f
34ee0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
34ef0 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 69  i++){.    int li
34f00 6d 69 74 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a  mit;.    .    /*
34f10 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e   Before doing an
34f20 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 74 61 6b  ything else, tak
34f30 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
34f40 69 27 74 68 20 6f 72 69 67 69 6e 61 6c 20 73 69  i'th original si
34f50 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 54 68 65  bling.    ** The
34f60 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 66 75   rest of this fu
34f70 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20  nction will use 
34f80 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f  data from the co
34f90 70 69 65 73 20 72 61 74 68 65 72 0a 20 20 20 20  pies rather.    
34fa0 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  ** that the orig
34fb0 69 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65  inal pages since
34fc0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
34fd0 67 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74  ges will be in t
34fe0 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  he.    ** proces
34ff0 73 20 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77  s of being overw
35000 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20  ritten.  */.    
35010 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20  MemPage *pOld = 
35020 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d  apCopy[i] = (Mem
35030 50 61 67 65 2a 29 26 61 53 70 61 63 65 31 5b 70  Page*)&aSpace1[p
35040 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 6b  Bt->pageSize + k
35050 2a 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  *i];.    memcpy(
35060 70 4f 6c 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20  pOld, apOld[i], 
35070 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29  sizeof(MemPage))
35080 3b 0a 20 20 20 20 70 4f 6c 64 2d 3e 61 44 61 74  ;.    pOld->aDat
35090 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 4f 6c 64  a = (void*)&pOld
350a0 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  [1];.    memcpy(
350b0 70 4f 6c 64 2d 3e 61 44 61 74 61 2c 20 61 70 4f  pOld->aData, apO
350c0 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42  ld[i]->aData, pB
350d0 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  t->pageSize);.. 
350e0 20 20 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d     limit = pOld-
350f0 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76  >nCell+pOld->nOv
35100 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20  erflow;.    if( 
35110 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  pOld->nOverflow>
35120 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a  0 ){.      for(j
35130 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b  =0; j<limit; j++
35140 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
35150 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c  t( nCell<nMaxCel
35160 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 61 70  ls );.        ap
35170 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69  Cell[nCell] = fi
35180 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
35190 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20  Old, j);.       
351a0 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
351b0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c   cellSizePtr(pOl
351c0 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  d, apCell[nCell]
351d0 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  );.        nCell
351e0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
351f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20  }else{.      u8 
35200 2a 61 44 61 74 61 20 3d 20 70 4f 6c 64 2d 3e 61  *aData = pOld->a
35210 44 61 74 61 3b 0a 20 20 20 20 20 20 75 31 36 20  Data;.      u16 
35220 6d 61 73 6b 50 61 67 65 20 3d 20 70 4f 6c 64 2d  maskPage = pOld-
35230 3e 6d 61 73 6b 50 61 67 65 3b 0a 20 20 20 20 20  >maskPage;.     
35240 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 20   u16 cellOffset 
35250 3d 20 70 4f 6c 64 2d 3e 63 65 6c 6c 4f 66 66 73  = pOld->cellOffs
35260 65 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  et;.      for(j=
35270 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29  0; j<limit; j++)
35280 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
35290 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c  ( nCell<nMaxCell
352a0 73 20 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43  s );.        apC
352b0 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e  ell[nCell] = fin
352c0 64 43 65 6c 6c 76 32 28 61 44 61 74 61 2c 20 6d  dCellv2(aData, m
352d0 61 73 6b 50 61 67 65 2c 20 63 65 6c 6c 4f 66 66  askPage, cellOff
352e0 73 65 74 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20  set, j);.       
352f0 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
35300 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c   cellSizePtr(pOl
35310 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  d, apCell[nCell]
35320 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  );.        nCell
35330 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
35340 7d 20 20 20 20 20 20 20 0a 20 20 20 20 69 66 28  }       .    if(
35350 20 69 3c 6e 4f 6c 64 2d 31 20 26 26 20 21 6c 65   i<nOld-1 && !le
35360 61 66 44 61 74 61 29 7b 0a 20 20 20 20 20 20 75  afData){.      u
35370 31 36 20 73 7a 20 3d 20 28 75 31 36 29 73 7a 4e  16 sz = (u16)szN
35380 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 75 38 20  ew[i];.      u8 
35390 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 61 73  *pTemp;.      as
353a0 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78  sert( nCell<nMax
353b0 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 73  Cells );.      s
353c0 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73  zCell[nCell] = s
353d0 7a 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d  z;.      pTemp =
353e0 20 26 61 53 70 61 63 65 31 5b 69 53 70 61 63 65   &aSpace1[iSpace
353f0 31 5d 3b 0a 20 20 20 20 20 20 69 53 70 61 63 65  1];.      iSpace
35400 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61  1 += sz;.      a
35410 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e  ssert( sz<=pBt->
35420 6d 61 78 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a 20  maxLocal+23 );. 
35430 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70       assert( iSp
35440 61 63 65 31 20 3c 3d 20 28 69 6e 74 29 70 42 74  ace1 <= (int)pBt
35450 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
35460 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
35470 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b  , apDiv[i], sz);
35480 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43  .      apCell[nC
35490 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61  ell] = pTemp+lea
354a0 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20  fCorrection;.   
354b0 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
354c0 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20  orrection==0 || 
354d0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
354e0 34 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c  4 );.      szCel
354f0 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c  l[nCell] = szCel
35500 6c 5b 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66 43  l[nCell] - leafC
35510 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
35520 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66   if( !pOld->leaf
35530 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
35540 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
35550 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  on==0 );.       
35560 20 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68   assert( pOld->h
35570 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20  drOffset==0 );. 
35580 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
35590 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74  ght pointer of t
355a0 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f  he child page pO
355b0 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c  ld becomes the l
355c0 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  eft.        ** p
355d0 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69  ointer of the di
355e0 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20  vider cell */.  
355f0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43        memcpy(apC
35600 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c  ell[nCell], &pOl
35610 64 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b  d->aData[8], 4);
35620 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
35630 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
35640 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20  afCorrection==4 
35650 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
35660 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29  zCell[nCell]<4 )
35670 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  {.          /* D
35680 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20  o not allow any 
35690 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68  cells smaller th
356a0 61 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20  an 4 bytes. */. 
356b0 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b           szCell[
356c0 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20  nCell] = 4;.    
356d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
356e0 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20      nCell++;.   
356f0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   }.  }..  /*.  *
35700 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
35710 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
35720 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
35730 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e  all nCell cells.
35740 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73  .  ** Store this
35750 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20   number in "k". 
35760 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a   Also compute sz
35770 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
35780 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69  he total.  ** si
35790 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
357a0 6f 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67 65  on the i-th page
357b0 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68   and cntNew[] wh
357c0 69 63 68 20 69 73 20 74 68 65 20 69 6e 64 65 78  ich is the index
357d0 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b  .  ** in apCell[
357e0 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68  ] of the cell th
357f0 61 74 20 64 69 76 69 64 65 73 20 70 61 67 65 20  at divides page 
35800 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e  i from page i+1.
35810 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b    .  ** cntNew[k
35820 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e  ] should equal n
35830 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Cell..  **.  ** 
35840 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20  Values computed 
35850 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20  by this block:. 
35860 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
35870 20 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20     k: The total 
35880 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e  number of siblin
35890 67 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20  g pages.  **    
358a0 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64  szNew[i]: Spaced
358b0 20 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74   used on the i-t
358c0 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a  h sibling page..
358d0 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d    **   cntNew[i]
358e0 3a 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c  : Index in apCel
358f0 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d  l[] and szCell[]
35900 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 63   for the first c
35910 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20  ell to.  **     
35920 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67           the rig
35930 68 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73  ht of the i-th s
35940 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a  ibling page..  *
35950 2a 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e  * usableSpace: N
35960 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
35970 66 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c  f space availabl
35980 65 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e  e on each siblin
35990 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20  g..  ** .  */.  
359a0 75 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42  usableSpace = pB
359b0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
359c0 31 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74  12 + leafCorrect
359d0 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f  ion;.  for(subto
359e0 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65  tal=k=i=0; i<nCe
359f0 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  ll; i++){.    as
35a00 73 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c  sert( i<nMaxCell
35a10 73 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61  s );.    subtota
35a20 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b  l += szCell[i] +
35a30 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74   2;.    if( subt
35a40 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61  otal > usableSpa
35a50 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65  ce ){.      szNe
35a60 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20  w[k] = subtotal 
35a70 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  - szCell[i];.   
35a80 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69     cntNew[k] = i
35a90 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66  ;.      if( leaf
35aa0 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20  Data ){ i--; }. 
35ab0 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20       subtotal = 
35ac0 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20  0;.      k++;.  
35ad0 20 20 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20 29      if( k>NB+1 )
35ae0 7b 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  { rc = SQLITE_CO
35af0 52 52 55 50 54 5f 42 4b 50 54 3b 20 67 6f 74 6f  RRUPT_BKPT; goto
35b00 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
35b10 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ; }.    }.  }.  
35b20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f  szNew[k] = subto
35b30 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d  tal;.  cntNew[k]
35b40 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b   = nCell;.  k++;
35b50 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  /*.  ** The 
35b60 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64  packing computed
35b70 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
35b80 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64   block is biased
35b90 20 74 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c   toward the sibl
35ba0 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  ings.  ** on the
35bb0 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68 65   left side.  The
35bc0 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61   left siblings a
35bd0 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79  re always nearly
35be0 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65   full, while the
35bf0 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  .  ** right-most
35c00 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62   sibling might b
35c10 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20  e nearly empty. 
35c20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63   This block of c
35c30 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a  ode attempts.  *
35c40 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  * to adjust the 
35c50 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69  packing of sibli
35c60 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62 65 74  ngs to get a bet
35c70 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a  ter balance..  *
35c80 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75  *.  ** This adju
35c90 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74  stment is more t
35ca0 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74  han an optimizat
35cb0 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e  ion.  The packin
35cc0 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20  g above might.  
35cd0 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20  ** be so out of 
35ce0 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65  balance as to be
35cf0 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65   illegal.  For e
35d00 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68  xample, the righ
35d10 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c  t-most.  ** sibl
35d20 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d  ing might be com
35d30 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20  pletely empty.  
35d40 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20  This adjustment 
35d50 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e  is not optional.
35d60 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d  .  */.  for(i=k-
35d70 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
35d80 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20    int szRight = 
35d90 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69  szNew[i];  /* Si
35da0 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e  ze of sibling on
35db0 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20   the right */.  
35dc0 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73    int szLeft = s
35dd0 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69  zNew[i-1]; /* Si
35de0 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e  ze of sibling on
35df0 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20   the left */.   
35e00 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20   int r;         
35e10 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
35e20 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c   right-most cell
35e30 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67   in left sibling
35e40 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20   */.    int d;  
35e50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
35e60 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65  ndex of first ce
35e70 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ll to the left o
35e80 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20  f right sibling 
35e90 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e  */..    r = cntN
35ea0 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20  ew[i-1] - 1;.   
35eb0 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61   d = r + 1 - lea
35ec0 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72  fData;.    asser
35ed0 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( d<nMaxCells )
35ee0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 3c  ;.    assert( r<
35ef0 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
35f00 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d   while( szRight=
35f10 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 21  =0 .       || (!
35f20 62 42 75 6c 6b 20 26 26 20 73 7a 52 69 67 68 74  bBulk && szRight
35f30 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a  +szCell[d]+2<=sz
35f40 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b  Left-(szCell[r]+
35f50 32 29 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  2)) .    ){.    
35f60 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43    szRight += szC
35f70 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[d] + 2;.    
35f80 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65    szLeft -= szCe
35f90 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20  ll[r] + 2;.     
35fa0 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a   cntNew[i-1]--;.
35fb0 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77        r = cntNew
35fc0 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20  [i-1] - 1;.     
35fd0 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61   d = r + 1 - lea
35fe0 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20  fData;.    }.   
35ff0 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69   szNew[i] = szRi
36000 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69  ght;.    szNew[i
36010 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20  -1] = szLeft;.  
36020 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77  }..  /* Either w
36030 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d  e found one or m
36040 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65  ore cells (cntne
36050 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70 50 61 67  w[0])>0) or pPag
36060 65 20 69 73 0a 20 20 2a 2a 20 61 20 76 69 72 74  e is.  ** a virt
36070 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20  ual root page.  
36080 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  A virtual root p
36090 61 67 65 20 69 73 20 77 68 65 6e 20 74 68 65 20  age is when the 
360a0 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70  real root.  ** p
360b0 61 67 65 20 69 73 20 70 61 67 65 20 31 20 61 6e  age is page 1 an
360c0 64 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c  d we are the onl
360d0 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20  y child of that 
360e0 70 61 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  page..  **.  ** 
360f0 55 50 44 41 54 45 3a 20 20 54 68 65 20 61 73 73  UPDATE:  The ass
36100 65 72 74 28 29 20 62 65 6c 6f 77 20 69 73 20 6e  ert() below is n
36110 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 74  ot necessarily t
36120 72 75 65 20 69 66 20 74 68 65 20 64 61 74 61 62  rue if the datab
36130 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73  ase.  ** file is
36140 20 63 6f 72 72 75 70 74 2e 20 20 54 68 65 20 63   corrupt.  The c
36150 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 62  orruption will b
36160 65 20 64 65 74 65 63 74 65 64 20 61 6e 64 20 72  e detected and r
36170 65 70 6f 72 74 65 64 20 6c 61 74 65 72 0a 20 20  eported later.  
36180 2a 2a 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ** in this proce
36190 64 75 72 65 20 73 6f 20 74 68 65 72 65 20 69 73  dure so there is
361a0 20 6e 6f 20 6e 65 65 64 20 74 6f 20 61 63 74 20   no need to act 
361b0 75 70 6f 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 2a  upon it now..  *
361c0 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74  /.#if 0.  assert
361d0 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c  ( cntNew[0]>0 ||
361e0 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d   (pParent->pgno=
361f0 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e  =1 && pParent->n
36200 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 23 65 6e 64  Cell==0) );.#end
36210 69 66 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41  if..  TRACE(("BA
36220 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25  LANCE: old: %d %
36230 64 20 25 64 20 20 22 2c 0a 20 20 20 20 61 70 4f  d %d  ",.    apO
36240 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20 20  ld[0]->pgno, .  
36250 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f 6c    nOld>=2 ? apOl
36260 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 0a  d[1]->pgno : 0,.
36270 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61 70      nOld>=3 ? ap
36280 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30  Old[2]->pgno : 0
36290 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  .  ));..  /*.  *
362a0 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77  * Allocate k new
362b0 20 70 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f   pages.  Reuse o
362c0 6c 64 20 70 61 67 65 73 20 77 68 65 72 65 20 70  ld pages where p
362d0 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ossible..  */.  
362e0 69 66 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67  if( apOld[0]->pg
362f0 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20 20 72 63 20  no<=1 ){.    rc 
36300 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
36310 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
36320 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
36330 0a 20 20 7d 0a 20 20 70 61 67 65 46 6c 61 67 73  .  }.  pageFlags
36340 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61 44 61   = apOld[0]->aDa
36350 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  ta[0];.  for(i=0
36360 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
36370 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a   MemPage *pNew;.
36380 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29      if( i<nOld )
36390 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61  {.      pNew = a
363a0 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b  pNew[i] = apOld[
363b0 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b  i];.      apOld[
363c0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  i] = 0;.      rc
363d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
363e0 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61  rite(pNew->pDbPa
363f0 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b  ge);.      nNew+
36400 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  +;.      if( rc 
36410 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
36420 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73  leanup;.    }els
36430 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
36440 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63   i>0 );.      rc
36450 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
36460 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c  Page(pBt, &pNew,
36470 20 26 70 67 6e 6f 2c 20 28 62 42 75 6c 6b 20 3f   &pgno, (bBulk ?
36480 20 31 20 3a 20 70 67 6e 6f 29 2c 20 30 29 3b 0a   1 : pgno), 0);.
36490 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
364a0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
364b0 6e 75 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  nup;.      apNew
364c0 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  [i] = pNew;.    
364d0 20 20 6e 4e 65 77 2b 2b 3b 0a 0a 20 20 20 20 20    nNew++;..     
364e0 20 2f 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e   /* Set the poin
364f0 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter-map entry fo
36500 72 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e  r the new siblin
36510 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  g page. */.     
36520 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
36530 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 70 74 72  M ){.        ptr
36540 6d 61 70 50 75 74 28 70 42 74 2c 20 70 4e 65 77  mapPut(pBt, pNew
36550 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ->pgno, PTRMAP_B
36560 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70  TREE, pParent->p
36570 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  gno, &rc);.     
36580 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
36590 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
365a0 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
365b0 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20  leanup;.        
365c0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
365d0 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61    }..  /* Free a
365e0 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74 68 61  ny old pages tha
365f0 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75 73 65  t were not reuse
36600 64 20 61 73 20 6e 65 77 20 70 61 67 65 73 2e 0a  d as new pages..
36610 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c    */.  while( i<
36620 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 66 72 65 65  nOld ){.    free
36630 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 2c 20 26  Page(apOld[i], &
36640 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rc);.    if( rc 
36650 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
36660 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65  leanup;.    rele
36670 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d  asePage(apOld[i]
36680 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20  );.    apOld[i] 
36690 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20  = 0;.    i++;.  
366a0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74  }..  /*.  ** Put
366b0 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 69   the new pages i
366c0 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
366d0 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74  r.  This helps t
366e0 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72  o.  ** keep entr
366f0 69 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20  ies in the disk 
36700 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 73 6f  file in order so
36710 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20 20 2a   that a scan.  *
36720 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  * of the table i
36730 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20  s a linear scan 
36740 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65  through the file
36750 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20  .  That.  ** in 
36760 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65 20 6f  turn helps the o
36770 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
36780 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67 65 73  to deliver pages
36790 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64  .  ** from the d
367a0 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c 79  isk more rapidly
367b0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f  ..  **.  ** An O
367c0 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e 20  (n^2) insertion 
367d0 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 20 69  sort algorithm i
367e0 73 20 75 73 65 64 2c 20 62 75 74 20 73 69 6e 63  s used, but sinc
367f0 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65  e.  ** n is neve
36800 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20 28  r more than NB (
36810 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74  a small constant
36820 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 20  ), that should. 
36830 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70 72 6f   ** not be a pro
36840 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  blem..  **.  ** 
36850 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73  When NB==3, this
36860 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   one optimizatio
36870 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61 74 61  n makes the data
36880 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20  base.  ** about 
36890 32 35 25 20 66 61 73 74 65 72 20 66 6f 72 20 6c  25% faster for l
368a0 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e 73 20  arge insertions 
368b0 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20  and deletions.. 
368c0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
368d0 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <k-1; i++){.    
368e0 69 6e 74 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77  int minV = apNew
368f0 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69  [i]->pgno;.    i
36900 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20  nt minI = i;.   
36910 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b   for(j=i+1; j<k;
36920 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
36930 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3c   apNew[j]->pgno<
36940 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29  (unsigned)minV )
36950 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d  {.        minI =
36960 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56   j;.        minV
36970 20 3d 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e   = apNew[j]->pgn
36980 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  o;.      }.    }
36990 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20  .    if( minI>i 
369a0 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  ){.      MemPage
369b0 20 2a 70 54 3b 0a 20 20 20 20 20 20 70 54 20 3d   *pT;.      pT =
369c0 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20   apNew[i];.     
369d0 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65   apNew[i] = apNe
369e0 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61  w[minI];.      a
369f0 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b  pNew[minI] = pT;
36a00 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41  .    }.  }.  TRA
36a10 43 45 28 28 22 6e 65 77 3a 20 25 64 28 25 64 29  CE(("new: %d(%d)
36a20 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
36a30 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c  d(%d) %d(%d)\n",
36a40 0a 20 20 20 20 61 70 4e 65 77 5b 30 5d 2d 3e 70  .    apNew[0]->p
36a50 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20  gno, szNew[0],. 
36a60 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 61 70 4e     nNew>=2 ? apN
36a70 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c  ew[1]->pgno : 0,
36a80 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77   nNew>=2 ? szNew
36a90 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [1] : 0,.    nNe
36aa0 77 3e 3d 33 20 3f 20 61 70 4e 65 77 5b 32 5d 2d  w>=3 ? apNew[2]-
36ab0 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e  >pgno : 0, nNew>
36ac0 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20  =3 ? szNew[2] : 
36ad0 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f  0,.    nNew>=4 ?
36ae0 20 61 70 4e 65 77 5b 33 5d 2d 3e 70 67 6e 6f 20   apNew[3]->pgno 
36af0 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73  : 0, nNew>=4 ? s
36b00 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20  zNew[3] : 0,.   
36b10 20 6e 4e 65 77 3e 3d 35 20 3f 20 61 70 4e 65 77   nNew>=5 ? apNew
36b20 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e  [4]->pgno : 0, n
36b30 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34  New>=5 ? szNew[4
36b40 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 61 73 73 65  ] : 0));..  asse
36b50 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
36b60 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
36b70 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
36b80 0a 20 20 70 75 74 34 62 79 74 65 28 70 52 69 67  .  put4byte(pRig
36b90 68 74 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d 31  ht, apNew[nNew-1
36ba0 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a  ]->pgno);..  /*.
36bb0 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74    ** Evenly dist
36bc0 72 69 62 75 74 65 20 74 68 65 20 64 61 74 61 20  ribute the data 
36bd0 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f  in apCell[] acro
36be0 73 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 73  ss the new pages
36bf0 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69  ..  ** Insert di
36c00 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f  vider cells into
36c10 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65   pParent as nece
36c20 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20  ssary..  */.  j 
36c30 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
36c40 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20  i<nNew; i++){.  
36c50 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68    /* Assemble th
36c60 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61  e new sibling pa
36c70 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  ge. */.    MemPa
36c80 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77  ge *pNew = apNew
36c90 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [i];.    assert(
36ca0 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   j<nMaxCells );.
36cb0 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65      zeroPage(pNe
36cc0 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20  w, pageFlags);. 
36cd0 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28     assemblePage(
36ce0 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d  pNew, cntNew[i]-
36cf0 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26  j, &apCell[j], &
36d00 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20  szCell[j]);.    
36d10 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43  assert( pNew->nC
36d20 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d  ell>0 || (nNew==
36d30 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d  1 && cntNew[0]==
36d40 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  0) );.    assert
36d50 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f  ( pNew->nOverflo
36d60 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 6a 20 3d  w==0 );..    j =
36d70 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20   cntNew[i];..   
36d80 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69   /* If the sibli
36d90 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65  ng page assemble
36da0 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20  d above was not 
36db0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73  the right-most s
36dc0 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69  ibling,.    ** i
36dd0 6e 73 65 72 74 20 61 20 64 69 76 69 64 65 72 20  nsert a divider 
36de0 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61  cell into the pa
36df0 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  rent page..    *
36e00 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c  /.    assert( i<
36e10 6e 4e 65 77 2d 31 20 7c 7c 20 6a 3d 3d 6e 43 65  nNew-1 || j==nCe
36e20 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3c  ll );.    if( j<
36e30 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75  nCell ){.      u
36e40 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20  8 *pCell;.      
36e50 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20  u8 *pTemp;.     
36e60 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20   int sz;..      
36e70 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65  assert( j<nMaxCe
36e80 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65  lls );.      pCe
36e90 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a  ll = apCell[j];.
36ea0 20 20 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c        sz = szCel
36eb0 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65  l[j] + leafCorre
36ec0 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65  ction;.      pTe
36ed0 6d 70 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65  mp = &aOvflSpace
36ee0 5b 69 4f 76 66 6c 53 70 61 63 65 5d 3b 0a 20 20  [iOvflSpace];.  
36ef0 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c      if( !pNew->l
36f00 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  eaf ){.        m
36f10 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61  emcpy(&pNew->aDa
36f20 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29  ta[8], pCell, 4)
36f30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
36f40 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20  ( leafData ){.  
36f50 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
36f60 74 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64  tree is a leaf-d
36f70 61 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68  ata tree, and th
36f80 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c  e siblings are l
36f90 65 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20  eaves, .        
36fa0 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ** then there is
36fb0 20 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c   no divider cell
36fc0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e   in apCell[]. In
36fd0 73 74 65 61 64 2c 20 74 68 65 20 64 69 76 69 64  stead, the divid
36fe0 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  er .        ** c
36ff0 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
37000 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
37010 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  for the right-mo
37020 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20  st cell of .    
37030 20 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69      ** the sibli
37040 6e 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65  ng-page assemble
37050 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20  d above only..  
37060 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
37070 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
37080 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20          j--;.   
37090 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43       btreeParseC
370a0 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43  ellPtr(pNew, apC
370b0 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a  ell[j], &info);.
370c0 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20          pCell = 
370d0 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 73  pTemp;.        s
370e0 7a 20 3d 20 34 20 2b 20 70 75 74 56 61 72 69 6e  z = 4 + putVarin
370f0 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 69 6e 66  t(&pCell[4], inf
37100 6f 2e 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  o.nKey);.       
37110 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20   pTemp = 0;.    
37120 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
37130 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20   pCell -= 4;.   
37140 20 20 20 20 20 2f 2a 20 4f 62 73 63 75 72 65 20       /* Obscure 
37150 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61  case for non-lea
37160 66 2d 64 61 74 61 20 74 72 65 65 73 3a 20 49 66  f-data trees: If
37170 20 74 68 65 20 63 65 6c 6c 20 61 74 20 70 43 65   the cell at pCe
37180 6c 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 2a  ll was.        *
37190 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 73 74 6f  * previously sto
371a0 72 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f  red on a leaf no
371b0 64 65 2c 20 61 6e 64 20 69 74 73 20 72 65 70 6f  de, and its repo
371c0 72 74 65 64 20 73 69 7a 65 20 77 61 73 20 34 0a  rted size was 4.
371d0 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73          ** bytes
371e0 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 61 63  , then it may ac
371f0 74 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65  tually be smalle
37200 72 20 74 68 61 6e 20 74 68 69 73 20 0a 20 20 20  r than this .   
37210 20 20 20 20 20 2a 2a 20 28 73 65 65 20 62 74 72       ** (see btr
37220 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
37230 2c 20 34 20 62 79 74 65 73 20 69 73 20 74 68 65  , 4 bytes is the
37240 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66   minimum size of
37250 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20  .        ** any 
37260 63 65 6c 6c 29 2e 20 42 75 74 20 69 74 20 69 73  cell). But it is
37270 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 61   important to pa
37280 73 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 73  ss the correct s
37290 69 7a 65 20 74 6f 20 0a 20 20 20 20 20 20 20 20  ize to .        
372a0 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c  ** insertCell(),
372b0 20 73 6f 20 72 65 70 61 72 73 65 20 74 68 65 20   so reparse the 
372c0 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20  cell now..      
372d0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
372e0 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63  Note that this c
372f0 61 6e 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20  an never happen 
37300 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74  in an SQLite dat
37310 61 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20  a file, as all. 
37320 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20         ** cells 
37330 61 72 65 20 61 74 20 6c 65 61 73 74 20 34 20 62  are at least 4 b
37340 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61  ytes. It only ha
37350 70 70 65 6e 73 20 69 6e 20 62 2d 74 72 65 65 73  ppens in b-trees
37360 20 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a   used.        **
37370 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22 49 4e   to evaluate "IN
37380 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61   (SELECT ...)" a
37390 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c 61 75 73  nd similar claus
373a0 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
373b0 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c         if( szCel
373c0 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20  l[j]==4 ){.     
373d0 20 20 20 20 20 61 73 73 65 72 74 28 6c 65 61 66       assert(leaf
373e0 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a  Correction==4);.
373f0 20 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63            sz = c
37400 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65  ellSizePtr(pPare
37410 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  nt, pCell);.    
37420 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
37430 20 20 20 20 69 4f 76 66 6c 53 70 61 63 65 20 2b      iOvflSpace +
37440 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65  = sz;.      asse
37450 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 6d 61 78  rt( sz<=pBt->max
37460 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a 20 20 20 20  Local+23 );.    
37470 20 20 61 73 73 65 72 74 28 20 69 4f 76 66 6c 53    assert( iOvflS
37480 70 61 63 65 20 3c 3d 20 28 69 6e 74 29 70 42 74  pace <= (int)pBt
37490 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
374a0 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70      insertCell(p
374b0 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70  Parent, nxDiv, p
374c0 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c  Cell, sz, pTemp,
374d0 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72 63   pNew->pgno, &rc
374e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
374f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
37500 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
37510 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  p;.      assert(
37520 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
37530 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74  riteable(pParent
37540 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
37550 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
37560 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nxDiv++;.    }. 
37570 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3d 3d   }.  assert( j==
37580 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
37590 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61  t( nOld>0 );.  a
375a0 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b  ssert( nNew>0 );
375b0 0a 20 20 69 66 28 20 28 70 61 67 65 46 6c 61 67  .  if( (pageFlag
375c0 73 20 26 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30  s & PTF_LEAF)==0
375d0 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a 43 68 69   ){.    u8 *zChi
375e0 6c 64 20 3d 20 26 61 70 43 6f 70 79 5b 6e 4f 6c  ld = &apCopy[nOl
375f0 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 3b 0a  d-1]->aData[8];.
37600 20 20 20 20 6d 65 6d 63 70 79 28 26 61 70 4e 65      memcpy(&apNe
37610 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61  w[nNew-1]->aData
37620 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c 20 34 29 3b  [8], zChild, 4);
37630 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 6f  .  }..  if( isRo
37640 6f 74 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e  ot && pParent->n
37650 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50 61 72 65  Cell==0 && pPare
37660 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 3c 3d 61  nt->hdrOffset<=a
37670 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 29  pNew[0]->nFree )
37680 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f  {.    /* The roo
37690 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d  t page of the b-
376a0 74 72 65 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e  tree now contain
376b0 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 54 68 65 20  s no cells. The 
376c0 6f 6e 6c 79 20 73 69 62 6c 69 6e 67 0a 20 20 20  only sibling.   
376d0 20 2a 2a 20 70 61 67 65 20 69 73 20 74 68 65 20   ** page is the 
376e0 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 74  right-child of t
376f0 68 65 20 70 61 72 65 6e 74 2e 20 43 6f 70 79 20  he parent. Copy 
37700 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
37710 74 68 65 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64  the.    ** child
37720 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
37730 61 72 65 6e 74 2c 20 64 65 63 72 65 61 73 69 6e  arent, decreasin
37740 67 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 68 65  g the overall he
37750 69 67 68 74 20 6f 66 20 74 68 65 0a 20 20 20 20  ight of the.    
37760 2a 2a 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ** b-tree struct
37770 75 72 65 20 62 79 20 6f 6e 65 2e 20 54 68 69 73  ure by one. This
37780 20 69 73 20 64 65 73 63 72 69 62 65 64 20 61 73   is described as
37790 20 74 68 65 20 22 62 61 6c 61 6e 63 65 2d 73 68   the "balance-sh
377a0 61 6c 6c 6f 77 65 72 22 0a 20 20 20 20 2a 2a 20  allower".    ** 
377b0 73 75 62 2d 61 6c 67 6f 72 69 74 68 6d 20 69 6e  sub-algorithm in
377c0 20 73 6f 6d 65 20 64 6f 63 75 6d 65 6e 74 61 74   some documentat
377d0 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ion..    **.    
377e0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  ** If this is an
377f0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
37800 61 62 61 73 65 2c 20 74 68 65 20 63 61 6c 6c 20  abase, the call 
37810 74 6f 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65  to copyNodeConte
37820 6e 74 28 29 20 0a 20 20 20 20 2a 2a 20 73 65 74  nt() .    ** set
37830 73 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d 61  s all pointer-ma
37840 70 20 65 6e 74 72 69 65 73 20 63 6f 72 72 65 73  p entries corres
37850 70 6f 6e 64 69 6e 67 20 74 6f 20 64 61 74 61 62  ponding to datab
37860 61 73 65 20 69 6d 61 67 65 20 70 61 67 65 73 20  ase image pages 
37870 0a 20 20 20 20 2a 2a 20 66 6f 72 20 77 68 69 63  .    ** for whic
37880 68 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73  h the pointer is
37890 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20 74   stored within t
378a0 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67  he content being
378b0 20 63 6f 70 69 65 64 2e 0a 20 20 20 20 2a 2a 0a   copied..    **.
378c0 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e      ** The secon
378d0 64 20 61 73 73 65 72 74 20 62 65 6c 6f 77 20 76  d assert below v
378e0 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68 65  erifies that the
378f0 20 63 68 69 6c 64 20 70 61 67 65 20 69 73 20 64   child page is d
37900 65 66 72 61 67 6d 65 6e 74 65 64 0a 20 20 20 20  efragmented.    
37910 2a 2a 20 28 69 74 20 6d 75 73 74 20 62 65 2c 20  ** (it must be, 
37920 61 73 20 69 74 20 77 61 73 20 6a 75 73 74 20 72  as it was just r
37930 65 63 6f 6e 73 74 72 75 63 74 65 64 20 75 73 69  econstructed usi
37940 6e 67 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28  ng assemblePage(
37950 29 29 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20  )). This.    ** 
37960 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 66 20  is important if 
37970 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
37980 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 70 61  happens to be pa
37990 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61  ge 1 of the data
379a0 62 61 73 65 0a 20 20 20 20 2a 2a 20 69 6d 61 67  base.    ** imag
379b0 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  e.  */.    asser
379c0 74 28 20 6e 4e 65 77 3d 3d 31 20 29 3b 0a 20 20  t( nNew==1 );.  
379d0 20 20 61 73 73 65 72 74 28 20 61 70 4e 65 77 5b    assert( apNew[
379e0 30 5d 2d 3e 6e 46 72 65 65 20 3d 3d 20 0a 20 20  0]->nFree == .  
379f0 20 20 20 20 20 20 28 67 65 74 32 62 79 74 65 28        (get2byte(
37a00 26 61 70 4e 65 77 5b 30 5d 2d 3e 61 44 61 74 61  &apNew[0]->aData
37a10 5b 35 5d 29 2d 61 70 4e 65 77 5b 30 5d 2d 3e 63  [5])-apNew[0]->c
37a20 65 6c 6c 4f 66 66 73 65 74 2d 61 70 4e 65 77 5b  ellOffset-apNew[
37a30 30 5d 2d 3e 6e 43 65 6c 6c 2a 32 29 20 0a 20 20  0]->nCell*2) .  
37a40 20 20 29 3b 0a 20 20 20 20 63 6f 70 79 4e 6f 64    );.    copyNod
37a50 65 43 6f 6e 74 65 6e 74 28 61 70 4e 65 77 5b 30  eContent(apNew[0
37a60 5d 2c 20 70 50 61 72 65 6e 74 2c 20 26 72 63 29  ], pParent, &rc)
37a70 3b 0a 20 20 20 20 66 72 65 65 50 61 67 65 28 61  ;.    freePage(a
37a80 70 4e 65 77 5b 30 5d 2c 20 26 72 63 29 3b 0a 20  pNew[0], &rc);. 
37a90 20 7d 65 6c 73 65 20 69 66 28 20 49 53 41 55 54   }else if( ISAUT
37aa0 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 2f  OVACUUM ){.    /
37ab0 2a 20 46 69 78 20 74 68 65 20 70 6f 69 6e 74 65  * Fix the pointe
37ac0 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
37ad0 72 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73 20  r all the cells 
37ae0 74 68 61 74 20 77 65 72 65 20 73 68 69 66 74 65  that were shifte
37af0 64 20 61 72 6f 75 6e 64 2e 20 0a 20 20 20 20 2a  d around. .    *
37b00 2a 20 54 68 65 72 65 20 61 72 65 20 73 65 76 65  * There are seve
37b10 72 61 6c 20 64 69 66 66 65 72 65 6e 74 20 74 79  ral different ty
37b20 70 65 73 20 6f 66 20 70 6f 69 6e 74 65 72 2d 6d  pes of pointer-m
37b30 61 70 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ap entries that 
37b40 6e 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  need to.    ** b
37b50 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20  e dealt with by 
37b60 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 53 6f  this routine. So
37b70 6d 65 20 6f 66 20 74 68 65 73 65 20 68 61 76 65  me of these have
37b80 20 62 65 65 6e 20 73 65 74 20 61 6c 72 65 61 64   been set alread
37b90 79 2c 20 62 75 74 0a 20 20 20 20 2a 2a 20 6d 61  y, but.    ** ma
37ba0 6e 79 20 68 61 76 65 20 6e 6f 74 2e 20 54 68 65  ny have not. The
37bb0 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20   following is a 
37bc0 73 75 6d 6d 61 72 79 3a 0a 20 20 20 20 2a 2a 0a  summary:.    **.
37bd0 20 20 20 20 2a 2a 20 20 20 31 29 20 54 68 65 20      **   1) The 
37be0 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74  entries associat
37bf0 65 64 20 77 69 74 68 20 6e 65 77 20 73 69 62 6c  ed with new sibl
37c00 69 6e 67 20 70 61 67 65 73 20 74 68 61 74 20 77  ing pages that w
37c10 65 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 20  ere not.    **  
37c20 20 20 20 20 73 69 62 6c 69 6e 67 73 20 77 68 65      siblings whe
37c30 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
37c40 77 61 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 73  was called. Thes
37c50 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20  e have already. 
37c60 20 20 20 2a 2a 20 20 20 20 20 20 62 65 65 6e 20     **      been 
37c70 73 65 74 2e 20 57 65 20 64 6f 6e 27 74 20 6e 65  set. We don't ne
37c80 65 64 20 74 6f 20 77 6f 72 72 79 20 61 62 6f 75  ed to worry abou
37c90 74 20 6f 6c 64 20 73 69 62 6c 69 6e 67 73 20 74  t old siblings t
37ca0 68 61 74 20 77 65 72 65 0a 20 20 20 20 2a 2a 20  hat were.    ** 
37cb0 20 20 20 20 20 6d 6f 76 65 64 20 74 6f 20 74 68       moved to th
37cc0 65 20 66 72 65 65 2d 6c 69 73 74 20 2d 20 74 68  e free-list - th
37cd0 65 20 66 72 65 65 50 61 67 65 28 29 20 63 6f 64  e freePage() cod
37ce0 65 20 68 61 73 20 74 61 6b 65 6e 20 63 61 72 65  e has taken care
37cf0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 66 20  .    **      of 
37d00 74 68 6f 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  those..    **.  
37d10 20 20 2a 2a 20 20 20 32 29 20 54 68 65 20 70 6f    **   2) The po
37d20 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
37d30 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
37d40 68 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  h the first over
37d50 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 20 20 20 20  flow.    **     
37d60 20 70 61 67 65 20 69 6e 20 61 6e 79 20 6f 76 65   page in any ove
37d70 72 66 6c 6f 77 20 63 68 61 69 6e 73 20 75 73 65  rflow chains use
37d80 64 20 62 79 20 6e 65 77 20 64 69 76 69 64 65 72  d by new divider
37d90 20 63 65 6c 6c 73 2e 20 54 68 65 73 65 20 0a 20   cells. These . 
37da0 20 20 20 2a 2a 20 20 20 20 20 20 68 61 76 65 20     **      have 
37db0 61 6c 73 6f 20 61 6c 72 65 61 64 79 20 62 65 65  also already bee
37dc0 6e 20 74 61 6b 65 6e 20 63 61 72 65 20 6f 66 20  n taken care of 
37dd0 62 79 20 74 68 65 20 69 6e 73 65 72 74 43 65 6c  by the insertCel
37de0 6c 28 29 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2a  l() code..    **
37df0 0a 20 20 20 20 2a 2a 20 20 20 33 29 20 49 66 20  .    **   3) If 
37e00 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
37e10 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73  s are not leaves
37e20 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64  , then the child
37e30 20 70 61 67 65 73 20 6f 66 0a 20 20 20 20 2a 2a   pages of.    **
37e40 20 20 20 20 20 20 63 65 6c 6c 73 20 73 74 6f 72        cells stor
37e50 65 64 20 6f 6e 20 74 68 65 20 73 69 62 6c 69 6e  ed on the siblin
37e60 67 20 70 61 67 65 73 20 6d 61 79 20 6e 65 65 64  g pages may need
37e70 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a   to be updated..
37e80 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
37e90 34 29 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  4) If the siblin
37ea0 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20  g pages are not 
37eb0 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20  internal intkey 
37ec0 6e 6f 64 65 73 2c 20 74 68 65 6e 20 61 6e 79 0a  nodes, then any.
37ed0 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 76 65 72      **      over
37ee0 66 6c 6f 77 20 70 61 67 65 73 20 75 73 65 64 20  flow pages used 
37ef0 62 79 20 74 68 65 73 65 20 63 65 6c 6c 73 20 6d  by these cells m
37f00 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70  ay need to be up
37f10 64 61 74 65 64 0a 20 20 20 20 2a 2a 20 20 20 20  dated.    **    
37f20 20 20 28 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b    (internal intk
37f30 65 79 20 6e 6f 64 65 73 20 6e 65 76 65 72 20 63  ey nodes never c
37f40 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20  ontain pointers 
37f50 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
37f60 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  s)..    **.    *
37f70 2a 20 20 20 35 29 20 49 66 20 74 68 65 20 73 69  *   5) If the si
37f80 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  bling pages are 
37f90 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e  not leaves, then
37fa0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
37fb0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 65 6e 74  .    **      ent
37fc0 72 69 65 73 20 66 6f 72 20 74 68 65 20 72 69 67  ries for the rig
37fd0 68 74 2d 63 68 69 6c 64 20 70 61 67 65 73 20 6f  ht-child pages o
37fe0 66 20 65 61 63 68 20 73 69 62 6c 69 6e 67 20 6d  f each sibling m
37ff0 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 20  ay need.    **  
38000 20 20 20 20 74 6f 20 62 65 20 75 70 64 61 74 65      to be update
38010 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
38020 20 43 61 73 65 73 20 31 20 61 6e 64 20 32 20 61   Cases 1 and 2 a
38030 72 65 20 64 65 61 6c 74 20 77 69 74 68 20 61 62  re dealt with ab
38040 6f 76 65 20 62 79 20 6f 74 68 65 72 20 63 6f 64  ove by other cod
38050 65 2e 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20  e. The next.    
38060 2a 2a 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77  ** block deals w
38070 69 74 68 20 63 61 73 65 73 20 33 20 61 6e 64 20  ith cases 3 and 
38080 34 20 61 6e 64 20 74 68 65 20 6f 6e 65 20 61 66  4 and the one af
38090 74 65 72 20 74 68 61 74 2c 20 63 61 73 65 20 35  ter that, case 5
380a0 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 73  . Since.    ** s
380b0 65 74 74 69 6e 67 20 61 20 70 6f 69 6e 74 65 72  etting a pointer
380c0 20 6d 61 70 20 65 6e 74 72 79 20 69 73 20 61 20   map entry is a 
380d0 72 65 6c 61 74 69 76 65 6c 79 20 65 78 70 65 6e  relatively expen
380e0 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2c 20  sive operation, 
380f0 74 68 69 73 0a 20 20 20 20 2a 2a 20 63 6f 64 65  this.    ** code
38100 20 6f 6e 6c 79 20 73 65 74 73 20 70 6f 69 6e 74   only sets point
38110 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er map entries f
38120 6f 72 20 63 68 69 6c 64 20 6f 72 20 6f 76 65 72  or child or over
38130 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74 20  flow pages that 
38140 68 61 76 65 0a 20 20 20 20 2a 2a 20 61 63 74 75  have.    ** actu
38150 61 6c 6c 79 20 6d 6f 76 65 64 20 62 65 74 77 65  ally moved betwe
38160 65 6e 20 70 61 67 65 73 2e 20 20 2a 2f 0a 20 20  en pages.  */.  
38170 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20    MemPage *pNew 
38180 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a 20 20 20 20  = apNew[0];.    
38190 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20  MemPage *pOld = 
381a0 61 70 43 6f 70 79 5b 30 5d 3b 0a 20 20 20 20 69  apCopy[0];.    i
381b0 6e 74 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70  nt nOverflow = p
381c0 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  Old->nOverflow;.
381d0 20 20 20 20 69 6e 74 20 69 4e 65 78 74 4f 6c 64      int iNextOld
381e0 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b   = pOld->nCell +
381f0 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20   nOverflow;.    
38200 69 6e 74 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20  int iOverflow = 
38210 28 6e 4f 76 65 72 66 6c 6f 77 20 3f 20 70 4f 6c  (nOverflow ? pOl
38220 64 2d 3e 61 69 4f 76 66 6c 5b 30 5d 20 3a 20 2d  d->aiOvfl[0] : -
38230 31 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 20 20  1);.    j = 0;  
38240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
38260 72 72 65 6e 74 20 27 6f 6c 64 27 20 73 69 62 6c  rrent 'old' sibl
38270 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ing page */.    
38280 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
38290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
382a0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6e     /* Current 'n
382b0 65 77 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65  ew' sibling page
382c0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
382d0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
382e0 20 20 20 20 20 20 69 6e 74 20 69 73 44 69 76 69        int isDivi
382f0 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 77  der = 0;.      w
38300 68 69 6c 65 28 20 69 3d 3d 69 4e 65 78 74 4f 6c  hile( i==iNextOl
38310 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  d ){.        /* 
38320 43 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63 65  Cell i is the ce
38330 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  ll immediately f
38340 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73  ollowing the las
38350 74 20 63 65 6c 6c 20 6f 6e 20 6f 6c 64 0a 20 20  t cell on old.  
38360 20 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67        ** sibling
38370 20 70 61 67 65 20 6a 2e 20 49 66 20 74 68 65 20   page j. If the 
38380 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74  siblings are not
38390 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20 61   leaf pages of a
383a0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74  n.        ** int
383b0 6b 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65 6e  key b-tree, then
383c0 20 63 65 6c 6c 20 69 20 77 61 73 20 61 20 64 69   cell i was a di
383d0 76 69 64 65 72 20 63 65 6c 6c 2e 20 2a 2f 0a 20  vider cell. */. 
383e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a         assert( j
383f0 2b 31 20 3c 20 41 72 72 61 79 53 69 7a 65 28 61  +1 < ArraySize(a
38400 70 43 6f 70 79 29 20 29 3b 0a 20 20 20 20 20 20  pCopy) );.      
38410 20 20 61 73 73 65 72 74 28 20 6a 2b 31 20 3c 20    assert( j+1 < 
38420 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 20 20 20 20  nOld );.        
38430 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 2b 2b  pOld = apCopy[++
38440 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 78  j];.        iNex
38450 74 4f 6c 64 20 3d 20 69 20 2b 20 21 6c 65 61 66  tOld = i + !leaf
38460 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 6e 43 65  Data + pOld->nCe
38470 6c 6c 20 2b 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72  ll + pOld->nOver
38480 66 6c 6f 77 3