/ Hex Artifact Content
Login

Artifact f5ea8d3d658887b5cae0369ef10a427d7469a768:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a  xffff)+1)../*.**
05c0: 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20 61   Values passed a
05d0: 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d 65  s the 5th argume
05e0: 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42 74  nt to allocateBt
05f0: 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64 65  reePage().*/.#de
0600: 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  fine BTALLOC_ANY
0610: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 2f     0           /
0620: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20 70  * Allocate any p
0630: 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 42  age */.#define B
0640: 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20 20  TALLOC_EXACT 1  
0650: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
0660: 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65 20  cate exact page 
0670: 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 23  if possible */.#
0680: 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 4c  define BTALLOC_L
0690: 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20  E    2          
06a0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79   /* Allocate any
06b0: 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61 72   page <= the par
06c0: 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ameter */../*.**
06d0: 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69 74   Macro IfNotOmit
06e0: 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28 78  AV(x) returns (x
06f0: 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ) if SQLITE_OMIT
0700: 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 6e  _AUTOVACUUM is n
0710: 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c 20  ot .** defined, 
0720: 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20 46  or 0 if it is. F
0730: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
0740: 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d 20  *   bIncrVacuum 
0750: 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  = IfNotOmitAV(pB
0760: 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61 63  tShared->incrVac
0770: 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65 66  uum);.*/.#ifndef
0780: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
0790: 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65 20  OVACUUM.#define 
07a0: 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70 72  IfNotOmitAV(expr
07b0: 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a 23  ) (expr).#else.#
07c0: 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69 74  define IfNotOmit
07d0: 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64 69  AV(expr) 0.#endi
07e0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
07f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0800: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74  CHE./*.** A list
0810: 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62 6a   of BtShared obj
0820: 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6c  ects that are el
0830: 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74 69  igible for parti
0840: 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 73  cipation.** in s
0850: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
0860: 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73 20  is variable has 
0870: 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69 6e  file scope durin
0880: 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2c  g normal builds,
0890: 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73 74  .** but the test
08a0: 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20 74   harness needs t
08b0: 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20 77  o access it so w
08c0: 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61 6c  e make it global
08d0: 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62 75   for .** test bu
08e0: 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63 65  ilds..**.** Acce
08f0: 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69 61  ss to this varia
0900: 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65 64  ble is protected
0910: 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45 58   by SQLITE_MUTEX
0920: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e 0a  _STATIC_MASTER..
0930: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
0940: 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20 2a  _TEST.BtShared *
0950: 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74  SQLITE_WSD sqlit
0960: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
0970: 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61  t = 0;.#else.sta
0980: 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53 51  tic BtShared *SQ
0990: 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65 33  LITE_WSD sqlite3
09a0: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20  SharedCacheList 
09b0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64  = 0;.#endif.#end
09c0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
09d0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
09e0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
09f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0a00: 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  CHE./*.** Enable
0a10: 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
0a20: 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e 64  shared pager and
0a30: 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65 73   schema features
0a40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
0a50: 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66 65  tine has no effe
0a60: 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20 64  ct on existing d
0a70: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
0a80: 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72  ons..** The shar
0a90: 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e 67  ed cache setting
0aa0: 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66 75   effects only fu
0ab0: 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  ture calls to.**
0ac0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2c   sqlite3_open(),
0ad0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
0ae0: 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70  ), or sqlite3_op
0af0: 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20  en_v2()..*/.int 
0b00: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
0b10: 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74 20  hared_cache(int 
0b20: 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69 74  enable){.  sqlit
0b30: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
0b40: 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
0b50: 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65  d = enable;.  re
0b60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0b70: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66 64  }.#endif....#ifd
0b80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
0b90: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
0ba0: 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  .  ** The functi
0bb0: 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64 43  ons querySharedC
0bc0: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 2c  acheTableLock(),
0bd0: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
0be0: 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a 2a  ableLock(),.  **
0bf0: 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68 61   and clearAllSha
0c00: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c10: 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75  ks().  ** manipu
0c20: 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  late entries in 
0c30: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
0c40: 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75  ck linked list u
0c50: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a  sed to store.  *
0c60: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
0c70: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73  able level locks
0c80: 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79  . If the library
0c90: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
0ca0: 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65  h the.  ** share
0cb0: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
0cc0: 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
0cd0: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
0ce0: 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20  r one user.  ** 
0cf0: 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64  of each BtShared
0d00: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73   structure and s
0d10: 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69  o this locking i
0d20: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
0d30: 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65   .  ** So define
0d40: 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65   the lock relate
0d50: 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e  d functions as n
0d60: 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64  o-ops..  */.  #d
0d70: 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72 65  efine queryShare
0d80: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0d90: 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b  a,b,c) SQLITE_OK
0da0: 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53 68  .  #define setSh
0db0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0dc0: 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45  ck(a,b,c) SQLITE
0dd0: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63 6c  _OK.  #define cl
0de0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0df0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e00: 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72 61   #define downgra
0e10: 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
0e20: 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20 20  TableLocks(a).  
0e30: 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72 65  #define hasShare
0e40: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0e50: 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64 65  a,b,c,d) 1.  #de
0e60: 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e 66  fine hasReadConf
0e70: 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23 65  licts(a, b) 0.#e
0e80: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0e90: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0ea0: 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20 53  _CACHE..#ifdef S
0eb0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
0ec0: 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  *** This functio
0ed0: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
0ee0: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73  s part of an ass
0ef0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2e  ert() statement.
0f00: 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b   ***.**.** Check
0f10: 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72 65   to see if pBtre
0f20: 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71 75  e holds the requ
0f30: 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72 65  ired locks to re
0f40: 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74  ad or write to t
0f50: 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69 74  he .** table wit
0f60: 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f  h root page iRoo
0f70: 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69 66  t.   Return 1 if
0f80: 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20 69   it does and 0 i
0f90: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  f not..**.** For
0fa0: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 77   example, when w
0fb0: 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c  riting to a tabl
0fc0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
0fd0: 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20 42   iRoot via .** B
0fe0: 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  tree connection 
0ff0: 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  pBtree:.**.**   
1000: 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
1010: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1020: 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c 20  (pBtree, iRoot, 
1030: 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 29  0, WRITE_LOCK) )
1040: 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72 69  ;.**.** When wri
1050: 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78  ting to an index
1060: 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69 6e   that resides in
1070: 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74 61   a sharable data
1080: 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63 61  base, the .** ca
1090: 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65  ller should have
10a0: 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64 20   first obtained 
10b0: 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69 6e  a lock specifyin
10c0: 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  g the root page 
10d0: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73  of.** the corres
10e0: 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20 54  ponding table. T
10f0: 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67 73  his makes things
1100: 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d 70   a bit more comp
1110: 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20 74  licated,.** as t
1120: 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61 74  his module treat
1130: 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73 20  s each table as 
1140: 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75 63  a separate struc
1150: 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d 69  ture. To determi
1160: 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  ne.** the table 
1170: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
1180: 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
1190: 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a 2a   written, this.*
11a0: 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74  * function has t
11b0: 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67 68  o search through
11c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
11d0: 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  hema..**.** Inst
11e0: 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f 6e  ead of a lock on
11f0: 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
1200: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1210: 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c 65  iRoot, the calle
1220: 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61 20  r may.** hold a 
1230: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
1240: 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20 28  e schema table (
1250: 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54 68  root page 1). Th
1260: 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61 63  is is also.** ac
1270: 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ceptable..*/.sta
1280: 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72 65  tic int hasShare
1290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
12a0: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
12b0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e  ,         /* Han
12c0: 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68 6f  dle that must ho
12d0: 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67 6e  ld lock */.  Pgn
12e0: 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20  o iRoot,        
12f0: 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
1300: 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20   of b-tree */.  
1310: 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20 20  int isIndex,    
1320: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1330: 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20 72  f iRoot is the r
1340: 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  oot of an index 
1350: 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  b-tree */.  int 
1360: 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20 20  eLockType       
1370: 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6c     /* Required l
1380: 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f 4c  ock type (READ_L
1390: 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43  OCK or WRITE_LOC
13a0: 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65 6d  K) */.){.  Schem
13b0: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53 63  a *pSchema = (Sc
13c0: 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e 70  hema *)pBtree->p
13d0: 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 50  Bt->pSchema;.  P
13e0: 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20 20  gno iTab = 0;.  
13f0: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a  BtLock *pLock;..
1400: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
1410: 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68 61  abase is not sha
1420: 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74 68  reable, or if th
1430: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1440: 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61 73  ing.  ** and has
1450: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
1460: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20  itted flag set, 
1470: 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73 20  then no lock is 
1480: 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a 20  required. .  ** 
1490: 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d 65  Return true imme
14a0: 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  diately..  */.  
14b0: 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68 61  if( (pBtree->sha
14c0: 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c 20  rable==0).   || 
14d0: 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41 44  (eLockType==READ
14e0: 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65 65  _LOCK && (pBtree
14f0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1500: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1510: 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20 20  tted)).  ){.    
1520: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
1530: 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65 6e   /* If the clien
1540: 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f 72  t is reading  or
1550: 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64 65   writing an inde
1560: 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61  x and the schema
1570: 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f 61   is.  ** not loa
1580: 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ded, then it is 
1590: 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74 6f  too difficult to
15a0: 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b 20   actually check 
15b0: 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20 74  to see if.  ** t
15c0: 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 73  he correct locks
15d0: 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20 64   are held.  So d
15e0: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20 6a  o not bother - j
15f0: 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e  ust return true.
1600: 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65 20  .  ** This case 
1610: 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75 70  does not come up
1620: 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79 68   very often anyh
1630: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ow..  */.  if( i
1640: 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63 68  sIndex && (!pSch
1650: 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61 2d  ema || (pSchema-
1660: 3e 66 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61  >flags&DB_Schema
1670: 4c 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20  Loaded)==0) ){. 
1680: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1690: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
16a0: 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  t the root-page 
16b0: 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68  that the lock sh
16c0: 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e  ould be held on.
16d0: 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20   For table.  ** 
16e0: 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73  b-trees, this is
16f0: 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70   just the root p
1700: 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
1710: 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a  e being read or.
1720: 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f    ** written. Fo
1730: 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c  r index b-trees,
1740: 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
1750: 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f  page of the asso
1760: 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c  ciated.  ** tabl
1770: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49  e.  */.  if( isI
1780: 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68  ndex ){.    Hash
1790: 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72  Elem *p;.    for
17a0: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
17b0: 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78  st(&pSchema->idx
17c0: 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69  Hash); p; p=sqli
17d0: 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a  teHashNext(p)){.
17e0: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
17f0: 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c  x = (Index *)sql
1800: 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a  iteHashData(p);.
1810: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
1820: 74 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74  tnum==(int)iRoot
1830: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 61 62   ){.        iTab
1840: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
1850: 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  >tnum;.      }. 
1860: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1870: 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a    iTab = iRoot;.
1880: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68    }..  /* Search
1890: 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65   for the require
18a0: 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61  d lock. Either a
18b0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72   write-lock on r
18c0: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61  oot-page iTab, a
18d0: 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63   .  ** write-loc
18e0: 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20  k on the schema 
18f0: 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68  table, or (if th
1900: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1910: 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64  ing) a.  ** read
1920: 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69  -lock on iTab wi
1930: 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75  ll suffice. Retu
1940: 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74  rn 1 if any of t
1950: 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20  hese are found. 
1960: 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d   */.  for(pLock=
1970: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f  pBtree->pBt->pLo
1980: 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  ck; pLock; pLock
1990: 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a  =pLock->pNext){.
19a0: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70      if( pLock->p
19b0: 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20  Btree==pBtree . 
19c0: 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69      && (pLock->i
19d0: 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28  Table==iTab || (
19e0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pLock->eLock==WR
19f0: 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63  ITE_LOCK && pLoc
1a00: 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20  k->iTable==1)). 
1a10: 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c      && pLock->eL
1a20: 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a  ock>=eLockType .
1a30: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1a40: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1a50: 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f  ..  /* Failed to
1a60: 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72   find the requir
1a70: 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65  ed lock. */.  re
1a80: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1a90: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
1aa0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
1ab0: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a  TE_DEBUG./*.****
1ac0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
1ad0: 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61  ay be used as pa
1ae0: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  rt of assert() s
1af0: 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20  tatements only. 
1b00: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ****.**.** Retur
1b10: 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75  n true if it wou
1b20: 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f  ld be illegal fo
1b30: 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74  r pBtree to writ
1b40: 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61  e into the.** ta
1b50: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f  ble or index roo
1b60: 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63  ted at iRoot bec
1b70: 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65  ause other share
1b80: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  d connections ar
1b90: 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75  e.** simultaneou
1ba0: 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74  sly reading that
1bb0: 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69   same table or i
1bc0: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ndex..**.** It i
1bd0: 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42  s illegal for pB
1be0: 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66  tree to write if
1bf0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65   some other Btre
1c00: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  e object that.**
1c10: 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65   shares the same
1c20: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
1c30: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65   is currently re
1c40: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1c50: 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61  .** the iRoot ta
1c60: 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66  ble.  Except, if
1c70: 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65   the other Btree
1c80: 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a   object has the.
1c90: 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  ** read-uncommit
1ca0: 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68  ted flag set, th
1cb0: 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20  en it is OK for 
1cc0: 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74  the other object
1cd0: 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65   to.** have a re
1ce0: 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  ad cursor..**.**
1cf0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65   For example, be
1d00: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
1d10: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1d20: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a  table or index.*
1d30: 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  * rooted at page
1d40: 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75   iRoot, one shou
1d50: 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20  ld call:.**.**  
1d60: 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65    assert( !hasRe
1d70: 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72  adConflicts(pBtr
1d80: 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f  ee, iRoot) );.*/
1d90: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52  .static int hasR
1da0: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72  eadConflicts(Btr
1db0: 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f  ee *pBtree, Pgno
1dc0: 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72   iRoot){.  BtCur
1dd0: 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  sor *p;.  for(p=
1de0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
1df0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
1e00: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  ext){.    if( p-
1e10: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
1e20: 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74   .     && p->pBt
1e30: 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20  ree!=pBtree.    
1e40: 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65   && 0==(p->pBtre
1e50: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1e60: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1e70: 69 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20  itted).    ){.  
1e80: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1e90: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1ea0: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20   0;.}.#endif    
1eb0: 2f 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  /* #ifdef SQLITE
1ec0: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
1ed0: 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66   Query to see if
1ee0: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20   Btree handle p 
1ef0: 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63  may obtain a loc
1f00: 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20  k of type eLock 
1f10: 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f  .** (READ_LOCK o
1f20: 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e  r WRITE_LOCK) on
1f30: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
1f40: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20  root-page iTab. 
1f50: 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  Return.** SQLITE
1f60: 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  _OK if the lock 
1f70: 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20  may be obtained 
1f80: 28 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  (by calling.** s
1f90: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
1fa0: 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51  leLock()), or SQ
1fb0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e  LITE_LOCKED if n
1fc0: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
1fd0: 74 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  t querySharedCac
1fe0: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65  heTableLock(Btre
1ff0: 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c  e *p, Pgno iTab,
2000: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2010: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2020: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2030: 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  pIter;..  assert
2040: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2050: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2060: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2070: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  READ_LOCK || eLo
2080: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  ck==WRITE_LOCK )
2090: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
20a0: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
20b0: 28 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  ( !(p->db->flags
20c0: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
20d0: 6d 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d  mmitted)||eLock=
20e0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61  =WRITE_LOCK||iTa
20f0: 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  b==1 );.  .  /* 
2100: 49 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  If requesting a 
2110: 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e  write-lock, then
2120: 20 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20   the Btree must 
2130: 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
2140: 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  te.  ** transact
2150: 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ion on this file
2160: 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79  . And, obviously
2170: 2c 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65  , for this to be
2180: 20 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20   so there .  ** 
2190: 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20  must be an open 
21a0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
21b0: 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74  n on the file it
21c0: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  self..  */.  ass
21d0: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
21e0: 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74  _LOCK || (p==pBt
21f0: 2d 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e  ->pWriter && p->
2200: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
2210: 52 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72  RITE) );.  asser
2220: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2230: 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  OCK || pBt->inTr
2240: 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
2250: 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f  _WRITE );.  .  /
2260: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2270: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
2280: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73   shared-cache is
2290: 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   not enabled */.
22a0: 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
22b0: 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  le ){.    return
22c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
22d0: 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74  .  /* If some ot
22e0: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  her connection i
22f0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63  s holding an exc
2300: 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65  lusive lock, the
2310: 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20  .  ** requested 
2320: 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20  lock may not be 
2330: 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20  obtained..  */. 
2340: 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65   if( pBt->pWrite
2350: 72 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74  r!=p && (pBt->bt
2360: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43  sFlags & BTS_EXC
2370: 4c 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20  LUSIVE)!=0 ){.  
2380: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2390: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
23a0: 2c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  , pBt->pWriter->
23b0: 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  db);.    return 
23c0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
23d0: 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a  AREDCACHE;.  }..
23e0: 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
23f0: 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
2400: 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
2410: 74 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  t){.    /* The c
2420: 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d  ondition (pIter-
2430: 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69  >eLock!=eLock) i
2440: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
2450: 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20  if(...) .    ** 
2460: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73  statement is a s
2470: 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66  implification of
2480: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
2490: 20 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f    (eLock==WRITE_
24a0: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
24b0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
24c0: 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
24d0: 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68  since we know th
24e0: 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49  at if eLock==WRI
24f0: 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f  TE_LOCK, then no
2500: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
2510: 6e 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c  n.    ** may hol
2520: 64 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f  d a WRITE_LOCK o
2530: 6e 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74  n any table in t
2540: 68 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20  his file (since 
2550: 74 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a  there can.    **
2560: 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c   only be a singl
2570: 65 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a  e writer)..    *
2580: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  /.    assert( pI
2590: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44  ter->eLock==READ
25a0: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  _LOCK || pIter->
25b0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
25c0: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
25d0: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
25e0: 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72  K || pIter->pBtr
25f0: 65 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e  ee==p || pIter->
2600: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2610: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
2620: 2d 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70  ->pBtree!=p && p
2630: 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Iter->iTable==iT
2640: 61 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f  ab && pIter->eLo
2650: 63 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck!=eLock ){.   
2660: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
2670: 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
2680: 62 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  b, pIter->pBtree
2690: 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ->db);.      if(
26a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
26b0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  CK ){.        as
26c0: 73 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57  sert( p==pBt->pW
26d0: 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20  riter );.       
26e0: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
26f0: 3d 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20  = BTS_PENDING;. 
2700: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2710: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
2720: 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
2730: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2740: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
2750: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
2760: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2770: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
2780: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
2790: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64  D_CACHE./*.** Ad
27a0: 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  d a lock on the 
27b0: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
27c0: 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74  page iTable to t
27d0: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  he shared-btree 
27e0: 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65  used.** by Btree
27f0: 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d   handle p. Param
2800: 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20  eter eLock must 
2810: 62 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c  be either READ_L
2820: 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45  OCK or .** WRITE
2830: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  _LOCK..**.** Thi
2840: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
2850: 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
2860: 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68  :.**.**   (a) Th
2870: 65 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65  e specified Btre
2880: 65 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f  e object p is co
2890: 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61  nnected to a sha
28a0: 72 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64  rable.**       d
28b0: 61 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74  atabase (one wit
28c0: 68 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73  h the BtShared.s
28d0: 68 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74  harable flag set
28e0: 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28  ), and.**.**   (
28f0: 62 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65  b) No other Btre
2900: 65 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61  e objects hold a
2910: 20 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c   lock that confl
2920: 69 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69  icts.**       wi
2930: 74 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64  th the requested
2940: 20 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72   lock (i.e. quer
2950: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
2960: 65 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20  eLock() has.**  
2970: 20 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65       already bee
2980: 6e 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74  n called and ret
2990: 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29  urned SQLITE_OK)
29a0: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
29b0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
29c0: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64   the lock is add
29d0: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
29e0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a   SQLITE_NOMEM .*
29f0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
2a00: 20 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70   a malloc attemp
2a10: 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  t fails..*/.stat
2a20: 69 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64  ic int setShared
2a30: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42  CacheTableLock(B
2a40: 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54  tree *p, Pgno iT
2a50: 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b  able, u8 eLock){
2a60: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2a70: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
2a80: 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a  ock *pLock = 0;.
2a90: 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
2aa0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2ab0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
2ac0: 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
2ad0: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2ae0: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  OCK || eLock==WR
2af0: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ITE_LOCK );.  as
2b00: 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29  sert( p->db!=0 )
2b10: 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63  ;..  /* A connec
2b20: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65  tion with the re
2b30: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
2b40: 6c 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76  lag set will nev
2b50: 65 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f  er try to.  ** o
2b60: 62 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63  btain a read-loc
2b70: 6b 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e  k using this fun
2b80: 63 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20  ction. The only 
2b90: 72 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e  read-lock obtain
2ba0: 65 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e  ed.  ** by a con
2bb0: 6e 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d  nection in read-
2bc0: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65  uncommitted mode
2bd0: 20 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74   is on the sqlit
2be0: 65 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74  e_master .  ** t
2bf0: 61 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c  able, and that l
2c00: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
2c10: 69 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61  in BtreeBeginTra
2c20: 6e 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ns().  */.  asse
2c30: 72 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66  rt( 0==(p->db->f
2c40: 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64  lags&SQLITE_Read
2c50: 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20  Uncommitted) || 
2c60: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
2c70: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  K );..  /* This 
2c80: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
2c90: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f  only be called o
2ca0: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74  n a sharable b-t
2cb0: 72 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20  ree after it .  
2cc0: 2a 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65  ** has been dete
2cd0: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f  rmined that no o
2ce0: 74 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64  ther b-tree hold
2cf0: 73 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20  s a conflicting 
2d00: 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65  lock.  */.  asse
2d10: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
2d20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
2d30: 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61  ITE_OK==querySha
2d40: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2d50: 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f  k(p, iTable, eLo
2d60: 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72  ck) );..  /* Fir
2d70: 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69  st search the li
2d80: 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  st for an existi
2d90: 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20  ng lock on this 
2da0: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28  table. */.  for(
2db0: 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
2dc0: 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
2dd0: 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
2de0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61    if( pIter->iTa
2df0: 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
2e00: 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Iter->pBtree==p 
2e10: 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d  ){.      pLock =
2e20: 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72   pIter;.      br
2e30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
2e40: 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76    /* If the abov
2e50: 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74  e search did not
2e60: 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73   find a BtLock s
2e70: 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e  truct associatin
2e80: 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77  g Btree p.  ** w
2e90: 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65  ith table iTable
2ea0: 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61  , allocate one a
2eb0: 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20  nd link it into 
2ec0: 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  the list..  */. 
2ed0: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
2ee0: 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f     pLock = (BtLo
2ef0: 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  ck *)sqlite3Mall
2f00: 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
2f10: 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20  Lock));.    if( 
2f20: 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  !pLock ){.      
2f30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2f40: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
2f50: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Lock->iTable = i
2f60: 54 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b  Table;.    pLock
2f70: 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
2f80: 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d    pLock->pNext =
2f90: 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
2fa0: 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c   pBt->pLock = pL
2fb0: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ock;.  }..  /* S
2fc0: 65 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c  et the BtLock.eL
2fd0: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
2fe0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74  the maximum of t
2ff0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a  he current lock.
3000: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71    ** and the req
3010: 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69  uested lock. Thi
3020: 73 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69  s means if a wri
3030: 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65  te-lock was alre
3040: 61 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e  ady held.  ** an
3050: 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65  d a read-lock re
3060: 71 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27  quested, we don'
3070: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f  t incorrectly do
3080: 77 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b  wngrade the lock
3090: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
30a0: 20 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44   WRITE_LOCK>READ
30b0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65  _LOCK );.  if( e
30c0: 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  Lock>pLock->eLoc
30d0: 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  k ){.    pLock->
30e0: 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20  eLock = eLock;. 
30f0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
3100: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
3110: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
3120: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
3130: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3140: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3150: 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  HE./*.** Release
3160: 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c   all the table l
3170: 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61  ocks (locks obta
3180: 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74  ined via calls t
3190: 6f 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72  o.** the setShar
31a0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
31b0: 28 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65  () procedure) he
31c0: 6c 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65  ld by Btree obje
31d0: 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ct p..**.** This
31e0: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
31f0: 73 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68  s that Btree p h
3200: 61 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20  as an open read 
3210: 6f 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61  or write .** tra
3220: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20  nsaction. If it 
3230: 64 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74  does not, then t
3240: 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66  he BTS_PENDING f
3250: 6c 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e  lag.** may be in
3260: 63 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65  correctly cleare
3270: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
3280: 64 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64  d clearAllShared
3290: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
32a0: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
32b0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
32c0: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a  pBt;.  BtLock **
32d0: 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70  ppIter = &pBt->p
32e0: 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lock;..  assert(
32f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
3300: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
3310: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
3320: 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ble || 0==*ppIte
3330: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
3340: 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a  ->inTrans>0 );..
3350: 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72    while( *ppIter
3360: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
3370: 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b  pLock = *ppIter;
3380: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
3390: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
33a0: 53 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20  S_EXCLUSIVE)==0 
33b0: 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d  || pBt->pWriter=
33c0: 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29  =pLock->pBtree )
33d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
33e0: 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54  ock->pBtree->inT
33f0: 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f  rans>=pLock->eLo
3400: 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ck );.    if( pL
3410: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ock->pBtree==p )
3420: 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20  {.      *ppIter 
3430: 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLock->pNext;.
3440: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
3450: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c  ock->iTable!=1 |
3460: 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63  | pLock==&p->loc
3470: 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  k );.      if( p
3480: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20  Lock->iTable!=1 
3490: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
34a0: 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  e3_free(pLock);.
34b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
34c0: 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20  e{.      ppIter 
34d0: 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b  = &pLock->pNext;
34e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
34f0: 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46  sert( (pBt->btsF
3500: 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49  lags & BTS_PENDI
3510: 4e 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  NG)==0 || pBt->p
3520: 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20  Writer );.  if( 
3530: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20  pBt->pWriter==p 
3540: 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69  ){.    pBt->pWri
3550: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ter = 0;.    pBt
3560: 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28  ->btsFlags &= ~(
3570: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54  BTS_EXCLUSIVE|BT
3580: 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65  S_PENDING);.  }e
3590: 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72  lse if( pBt->nTr
35a0: 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a  ansaction==2 ){.
35b0: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
35c0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
35d0: 68 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63  hen Btree p is c
35e0: 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20  oncluding its . 
35f0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
3600: 6e 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72  n. If there curr
3610: 65 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77  ently exists a w
3620: 72 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20  riter, and p is 
3630: 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  not.    ** that 
3640: 77 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65  writer, then the
3650: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   number of locks
3660: 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
3670: 69 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a  ions other.    *
3680: 2a 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65  * than the write
3690: 72 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20  r must be about 
36a0: 74 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e  to drop to zero.
36b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20   In this case.  
36c0: 20 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53    ** set the BTS
36d0: 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f  _PENDING flag to
36e0: 20 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   0..    **.    *
36f0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
3700: 74 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72  t currently a wr
3710: 69 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50  iter, then BTS_P
3720: 45 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20  ENDING must.    
3730: 2a 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61  ** be zero alrea
3740: 64 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74  dy. So this next
3750: 20 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73   line is harmles
3760: 73 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a  s in that case..
3770: 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e      */.    pBt->
3780: 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
3790: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a  _PENDING;.  }.}.
37a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
37b0: 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c  tion changes all
37c0: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c   write-locks hel
37d0: 64 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74  d by Btree p int
37e0: 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f  o read-locks..*/
37f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77  .static void dow
3800: 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
3810: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3820: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
3830: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
3840: 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  Bt;.  if( pBt->p
3850: 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20  Writer==p ){.   
3860: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
3870: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3880: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3890: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
38a0: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
38b0: 45 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72  ENDING);.    for
38c0: 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63  (pLock=pBt->pLoc
38d0: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
38e0: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
38f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3900: 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  ck->eLock==READ_
3910: 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70  LOCK || pLock->p
3920: 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20  Btree==p );.    
3930: 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d    pLock->eLock =
3940: 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20   READ_LOCK;.    
3950: 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20  }.  }.}..#endif 
3960: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
3970: 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a  HARED_CACHE */..
3980: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
3990: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
39a0: 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72  *pPage);  /* For
39b0: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
39c0: 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73  /../*.***** This
39d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
39e0: 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72   inside of asser
39f0: 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a  t() only ****.**
3a00: 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  .** Verify that 
3a10: 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73  the cursor holds
3a20: 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74   the mutex on it
3a30: 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69  s BtShared.*/.#i
3a40: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
3a50: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72  G.static int cur
3a60: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74  sorHoldsMutex(Bt
3a70: 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65  Cursor *p){.  re
3a80: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
3a90: 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
3aa0: 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66  mutex);.}.#endif
3ab0: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
3ac0: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
3ad0: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
3ae0: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
3af0: 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f  ge-list cache fo
3b00: 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20 69  r cursor pCur, i
3b10: 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  f any..*/.static
3b20: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3b30: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74  OverflowCache(Bt
3b40: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
3b50: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
3b60: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
3b70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3b80: 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
3b90: 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76 65  w);.  pCur->aOve
3ba0: 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  rflow = 0;.}../*
3bb0: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
3bc0: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
3bd0: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
3be0: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
3bf0: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
3c00: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
3c10: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
3c20: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
3c30: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
3c40: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
3c50: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
3c60: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
3c70: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3c80: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
3c90: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
3ca0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
3cb0: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
3cc0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3cd0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
3ce0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
3cf0: 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
3d00: 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f  modifying the co
3d10: 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62 6c  ntents of a tabl
3d20: 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61  e.** to invalida
3d30: 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20  te any incrblob 
3d40: 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  cursors that are
3d50: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20   open on the.** 
3d60: 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  row or one of th
3d70: 65 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64  e rows being mod
3d80: 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ified..**.** If 
3d90: 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72  argument isClear
3da0: 54 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20 74  Table is true, t
3db0: 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20 63  hen the entire c
3dc0: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
3dd0: 2a 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75 74  * table is about
3de0: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20   to be deleted. 
3df0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3e00: 61 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63 72  alidate all incr
3e10: 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20  blob.** cursors 
3e20: 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20  open on any row 
3e30: 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65  within the table
3e40: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
3e50: 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20  pgnoRoot..**.** 
3e60: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 72  Otherwise, if ar
3e70: 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61  gument isClearTa
3e80: 62 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74 68  ble is false, th
3e90: 65 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 0a  en the row with.
3ea0: 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69 73  ** rowid iRow is
3eb0: 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20   being replaced 
3ec0: 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74  or deleted. In t
3ed0: 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64  his case invalid
3ee0: 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73  ate.** only thos
3ef0: 65 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f  e incrblob curso
3f00: 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20  rs open on that 
3f10: 73 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f  specific row..*/
3f20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76  .static void inv
3f30: 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
3f40: 75 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65 20  ursors(.  Btree 
3f50: 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20  *pBtree,        
3f60: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
3f70: 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20  e file to check 
3f80: 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20  */.  i64 iRow,  
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3fa0: 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d  The rowid that m
3fb0: 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67  ight be changing
3fc0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61   */.  int isClea
3fd0: 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a  rTable        /*
3fe0: 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77   True if all row
3ff0: 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65  s are being dele
4000: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75  ted */.){.  BtCu
4010: 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61  rsor *p;.  BtSha
4020: 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65  red *pBt = pBtre
4030: 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  e->pBt;.  assert
4040: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
4050: 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29  ldsMutex(pBtree)
4060: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
4070: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
4080: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
4090: 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  ( p->isIncrblobH
40a0: 61 6e 64 6c 65 20 26 26 20 28 69 73 43 6c 65 61  andle && (isClea
40b0: 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66  rTable || p->inf
40c0: 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29 7b  o.nKey==iRow) ){
40d0: 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65  .      p->eState
40e0: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
40f0: 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  D;.    }.  }.}..
4100: 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62 20  #else.  /* Stub 
4110: 66 75 6e 63 74 69 6f 6e 73 20 77 68 65 6e 20 49  functions when I
4120: 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74 74  NCRBLOB is omitt
4130: 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  ed */.  #define 
4140: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
4150: 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64 65  owCache(x).  #de
4160: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 41  fine invalidateA
4170: 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
4180: 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76  x).  #define inv
4190: 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
41a0: 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23 65  ursors(x,y,z).#e
41b0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
41c0: 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a  MIT_INCRBLOB */.
41d0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70  ./*.** Set bit p
41e0: 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61  gno of the BtSha
41f0: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4200: 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20  bitvec. This is 
4210: 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20  called .** when 
4220: 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76  a page that prev
4230: 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64  iously contained
4240: 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20   data becomes a 
4250: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a  free-list leaf .
4260: 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ** page..**.** T
4270: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
4280: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65  Content bitvec e
4290: 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72  xists to work ar
42a0: 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a  ound an obscure.
42b0: 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79  ** bug caused by
42c0: 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e   the interaction
42d0: 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49   of two useful I
42e0: 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  O optimizations 
42f0: 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66  surrounding.** f
4300: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
4310: 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  ges:.**.**   1) 
4320: 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73  When all data is
4330: 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20   deleted from a 
4340: 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67  page and the pag
4350: 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20  e becomes.**    
4360: 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65    a free-list le
4370: 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67  af page, the pag
4380: 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e  e is not written
4390: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
43a0: 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65  .**      (as fre
43b0: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
43c0: 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61  s contain no mea
43d0: 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53  ningful data). S
43e0: 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20  ometimes.**     
43f0: 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20   such a page is 
4400: 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c  not even journal
4410: 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20  led (as it will 
4420: 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c  not be modified,
4430: 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74  .**      why bot
4440: 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20  her journalling 
4450: 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  it?)..**.**   2)
4460: 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   When a free-lis
4470: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4480: 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65  eused, its conte
4490: 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a  nt is not read.*
44a0: 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20  *      from the 
44b0: 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74  database or writ
44c0: 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
44d0: 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f  al file (why sho
44e0: 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62  uld it.**      b
44f0: 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e, if it is not 
4500: 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75  at all meaningfu
4510: 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68  l?)..**.** By th
4520: 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20  emselves, these 
4530: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f  optimizations wo
4540: 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76  rk fine and prov
4550: 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70  ide a handy.** p
4560: 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74  erformance boost
4570: 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20   to bulk delete 
4580: 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74  or insert operat
4590: 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69  ions. However, i
45a0: 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d  f.** a page is m
45b0: 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
45c0: 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72  -list and then r
45d0: 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65  eused within the
45e0: 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63   same.** transac
45f0: 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20  tion, a problem 
4600: 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65  comes up. If the
4610: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75   page is not jou
4620: 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20  rnalled when.** 
4630: 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74  it is moved to t
4640: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4650: 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20   it is also not 
4660: 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20  journalled when 
4670: 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74  it.** is extract
4680: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
4690: 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64  -list and reused
46a0: 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69  , then the origi
46b0: 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20  nal data.** may 
46c0: 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20  be lost. In the 
46d0: 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62  event of a rollb
46e0: 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20  ack, it may not 
46f0: 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74  be possible.** t
4700: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
4710: 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
4720: 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61  iginal configura
4730: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
4740: 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20  solution is the 
4750: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4760: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65  tent bitvec. Whe
4770: 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20  never a page is 
4780: 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63  .** moved to bec
4790: 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20  ome a free-list 
47a0: 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63  leaf page, the c
47b0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
47c0: 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68   is.** set in th
47d0: 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76  e bitvec. Whenev
47e0: 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69  er a leaf page i
47f0: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
4800: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a   the free-list,.
4810: 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ** optimization 
4820: 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74  2 above is omitt
4830: 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73  ed if the corres
4840: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61  ponding bit is a
4850: 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e  lready.** set in
4860: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4870: 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65  ntent. The conte
4880: 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65  nts of the bitve
4890: 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a  c are cleared.**
48a0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
48b0: 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  very transaction
48c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
48d0: 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
48e0: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
48f0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
4900: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4910: 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  OK;.  if( !pBt->
4920: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
4930: 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c     assert( pgno<
4940: 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20  =pBt->nPage );. 
4950: 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74     pBt->pHasCont
4960: 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74  ent = sqlite3Bit
4970: 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e  vecCreate(pBt->n
4980: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Page);.    if( !
4990: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
49a0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
49b0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
49c0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
49d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67  =SQLITE_OK && pg
49e0: 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76 65  no<=sqlite3Bitve
49f0: 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73 43  cSize(pBt->pHasC
4a00: 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20 72  ontent) ){.    r
4a10: 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
4a20: 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43 6f  cSet(pBt->pHasCo
4a30: 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  ntent, pgno);.  
4a40: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4a50: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68  ../*.** Query th
4a60: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4a70: 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a  ontent vector..*
4a80: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
4a90: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
4aa0: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
4ab0: 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f 76  af page is remov
4ac0: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66  ed from the.** f
4ad0: 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65 75  ree-list for reu
4ae0: 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 66  se. It returns f
4af0: 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 61  alse if it is sa
4b00: 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  fe to retrieve t
4b10: 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20  he.** page from 
4b20: 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
4b30: 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e  with the 'no-con
4b40: 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20  tent' flag set. 
4b50: 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  True otherwise..
4b60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
4b70: 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
4b80: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
4b90: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69  Pgno pgno){.  Bi
4ba0: 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70  tvec *p = pBt->p
4bb0: 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65  HasContent;.  re
4bc0: 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e 6f  turn (p && (pgno
4bd0: 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69  >sqlite3BitvecSi
4be0: 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65 33  ze(p) || sqlite3
4bf0: 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70 67  BitvecTest(p, pg
4c00: 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  no)));.}../*.** 
4c10: 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29 20  Clear (destroy) 
4c20: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4c30: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4c40: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 0a   This should be.
4c50: 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  ** invoked at th
4c60: 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
4c70: 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e 73  each write-trans
4c80: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
4c90: 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65 61  c void btreeClea
4ca0: 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  rHasContent(BtSh
4cb0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
4cc0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
4cd0: 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  oy(pBt->pHasCont
4ce0: 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61  ent);.  pBt->pHa
4cf0: 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a  sContent = 0;.}.
4d00: 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20  ./*.** Save the 
4d10: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
4d20: 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76  osition in the v
4d30: 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f  ariables BtCurso
4d40: 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42  r.nKey .** and B
4d50: 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68  tCursor.pKey. Th
4d60: 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74 65  e cursor's state
4d70: 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f   is set to CURSO
4d80: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a  R_REQUIRESEEK..*
4d90: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
4da0: 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74  must ensure that
4db0: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 76   the cursor is v
4dc0: 61 6c 69 64 20 28 68 61 73 20 65 53 74 61 74 65  alid (has eState
4dd0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a  ==CURSOR_VALID).
4de0: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ** prior to call
4df0: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
4e00: 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .  .*/.static in
4e10: 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  t saveCursorPosi
4e20: 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70  tion(BtCursor *p
4e30: 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Cur){.  int rc;.
4e40: 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
4e50: 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  R_VALID==pCur->e
4e60: 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72  State );.  asser
4e70: 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79  t( 0==pCur->pKey
4e80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
4e90: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
4ea0: 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20  Cur) );..  rc = 
4eb0: 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
4ec0: 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d  ize(pCur, &pCur-
4ed0: 3e 6e 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74  >nKey);.  assert
4ee0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4ef0: 29 3b 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28 29  );  /* KeySize()
4f00: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a   cannot fail */.
4f10: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
4f20: 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65   an intKey table
4f30: 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65  , then the above
4f40: 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65   call to BtreeKe
4f50: 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f  ySize().  ** sto
4f60: 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 72 20  res the integer 
4f70: 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65  key in pCur->nKe
4f80: 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  y. In this case 
4f90: 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20  this value is.  
4fa0: 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72  ** all that is r
4fb0: 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69  equired. Otherwi
4fc0: 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e  se, if pCur is n
4fd0: 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e  ot open on an in
4fe0: 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  tKey.  ** table,
4ff0: 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61   then malloc spa
5000: 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65  ce for and store
5010: 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20   the pCur->nKey 
5020: 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20  bytes of key .  
5030: 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20  ** data..  */.  
5040: 69 66 28 20 30 3d 3d 70 43 75 72 2d 3e 61 70 50  if( 0==pCur->apP
5050: 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29  age[0]->intKey )
5060: 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  {.    void *pKey
5070: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
5080: 28 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65  ( (int)pCur->nKe
5090: 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65  y );.    if( pKe
50a0: 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
50b0: 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28  sqlite3BtreeKey(
50c0: 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70 43  pCur, 0, (int)pC
50d0: 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b  ur->nKey, pKey);
50e0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
50f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5100: 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d      pCur->pKey =
5110: 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c   pKey;.      }el
5120: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
5130: 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a  te3_free(pKey);.
5140: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
5150: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
5160: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
5170: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
5180: 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  !pCur->apPage[0]
5190: 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75  ->intKey || !pCu
51a0: 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69 66  r->pKey );..  if
51b0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
51c0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
51d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
51e0: 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
51f0: 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
5200: 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
5210: 69 5d 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  i]);.      pCur-
5220: 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a  >apPage[i] = 0;.
5230: 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
5240: 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 20 20  iPage = -1;.    
5250: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
5260: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
5270: 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69  K;.  }..  invali
5280: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
5290: 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  e(pCur);.  retur
52a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
52b0: 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  ave the position
52c0: 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73  s of all cursors
52d0: 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74   (except pExcept
52e0: 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20  ) that are open 
52f0: 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  on.** the table 
5300: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
5310: 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20  iRoot. Usually, 
5320: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6a  this is called j
5330: 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f  ust before curso
5340: 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73 20  r.** pExcept is 
5350: 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74  used to modify t
5360: 68 65 20 74 61 62 6c 65 20 28 42 74 72 65 65 44  he table (BtreeD
5370: 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65  elete() or Btree
5380: 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74  Insert())..*/.st
5390: 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c  atic int saveAll
53a0: 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
53b0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f   *pBt, Pgno iRoo
53c0: 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78  t, BtCursor *pEx
53d0: 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  cept){.  BtCurso
53e0: 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  r *p;.  assert( 
53f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
5400: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
5410: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 63  ;.  assert( pExc
5420: 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70  ept==0 || pExcep
5430: 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20  t->pBt==pBt );. 
5440: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
5450: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
5460: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d  xt){.    if( p!=
5470: 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69  pExcept && (0==i
5480: 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52  Root || p->pgnoR
5490: 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20 0a  oot==iRoot) && .
54a0: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
54b0: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
54c0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
54d0: 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  = saveCursorPosi
54e0: 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 69  tion(p);.      i
54f0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
5500: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
5510: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
5520: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5530: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
5540: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
5550: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
5560: 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  osition..*/.void
5570: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
5580: 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  arCursor(BtCurso
5590: 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
55a0: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
55b0: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
55c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
55d0: 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72  r->pKey);.  pCur
55e0: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43  ->pKey = 0;.  pC
55f0: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
5600: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a  SOR_INVALID;.}..
5610: 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65  /*.** In this ve
5620: 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f  rsion of BtreeMo
5630: 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20  veto, pKey is a 
5640: 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63  packed index rec
5650: 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69  ord.** such as i
5660: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  s generated by t
5670: 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
5680: 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b   opcode.  Unpack
5690: 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61   the.** record a
56a0: 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72  nd then call Btr
56b0: 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
56c0: 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  () to do the wor
56d0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
56e0: 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20   btreeMoveto(.  
56f0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
5700: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70      /* Cursor op
5710: 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20  en on the btree 
5720: 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a  to be searched *
5730: 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
5740: 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65  pKey,   /* Packe
5750: 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74 72  d key if the btr
5760: 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a  ee is an index *
5770: 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  /.  i64 nKey,   
5780: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
5790: 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65  er key for table
57a0: 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79  s.  Size of pKey
57b0: 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a   for indices */.
57c0: 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20    int bias,     
57d0: 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65        /* Bias se
57e0: 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68  arch to the high
57f0: 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   end */.  int *p
5800: 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Res           /*
5810: 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
5820: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
5830: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5850: 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a   Status code */.
5860: 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
5870: 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20   *pIdxKey;   /* 
5880: 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  Unpacked index k
5890: 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 70  ey */.  char aSp
58a0: 61 63 65 5b 31 35 30 5d 3b 20 20 20 20 20 20 20  ace[150];       
58b0: 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65     /* Temp space
58c0: 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20 74   for pIdxKey - t
58d0: 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63  o avoid a malloc
58e0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 46 72 65   */.  char *pFre
58f0: 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 4b  e = 0;..  if( pK
5900: 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ey ){.    assert
5910: 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e  ( nKey==(i64)(in
5920: 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49  t)nKey );.    pI
5930: 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56  dxKey = sqlite3V
5940: 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64  dbeAllocUnpacked
5950: 52 65 63 6f 72 64 28 0a 20 20 20 20 20 20 20 20  Record(.        
5960: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  pCur->pKeyInfo, 
5970: 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61  aSpace, sizeof(a
5980: 53 70 61 63 65 29 2c 20 26 70 46 72 65 65 0a 20  Space), &pFree. 
5990: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49     );.    if( pI
59a0: 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72  dxKey==0 ) retur
59b0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
59c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
59d0: 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72  ecordUnpack(pCur
59e0: 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74  ->pKeyInfo, (int
59f0: 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49 64  )nKey, pKey, pId
5a00: 78 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  xKey);.  }else{.
5a10: 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b      pIdxKey = 0;
5a20: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
5a30: 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
5a40: 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64  packed(pCur, pId
5a50: 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73  xKey, nKey, bias
5a60: 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20 70  , pRes);.  if( p
5a70: 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Free ){.    sqli
5a80: 74 65 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e  te3DbFree(pCur->
5a90: 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46  pKeyInfo->db, pF
5aa0: 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ree);.  }.  retu
5ab0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5ac0: 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  Restore the curs
5ad0: 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69  or to the positi
5ae0: 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72  on it was in (or
5af0: 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20   as close to as 
5b00: 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65  possible).** whe
5b10: 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  n saveCursorPosi
5b20: 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65  tion() was calle
5b30: 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  d. Note that thi
5b40: 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74  s call deletes t
5b50: 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73  he .** saved pos
5b60: 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65  ition info store
5b70: 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50  d by saveCursorP
5b80: 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68  osition(), so th
5b90: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74  ere can be.** at
5ba0: 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74   most one effect
5bb0: 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ive restoreCurso
5bc0: 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c  rPosition() call
5bd0: 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20   after each .** 
5be0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
5bf0: 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  on()..*/.static 
5c00: 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65  int btreeRestore
5c10: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
5c20: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5c30: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
5c40: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
5c50: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
5c60: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
5c70: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
5c80: 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66  UIRESEEK );.  if
5c90: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
5ca0: 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
5cb0: 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
5cc0: 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  >skipNext;.  }. 
5cd0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5ce0: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
5cf0: 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65    rc = btreeMove
5d00: 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70  to(pCur, pCur->p
5d10: 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c  Key, pCur->nKey,
5d20: 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70 4e   0, &pCur->skipN
5d30: 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ext);.  if( rc==
5d40: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5d50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5d60: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70  ur->pKey);.    p
5d70: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
5d80: 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
5d90: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
5da0: 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
5db0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
5dc0: 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72  VALID );.  }.  r
5dd0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65  eturn rc;.}..#de
5de0: 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73  fine restoreCurs
5df0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a  orPosition(p) \.
5e00: 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55    (p->eState>=CU
5e10: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5e20: 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74   ? \.         bt
5e30: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
5e40: 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a  Position(p) : \.
5e50: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
5e60: 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  OK)../*.** Deter
5e70: 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
5e80: 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73  not a cursor has
5e90: 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20   moved from the 
5ea0: 70 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77  position it.** w
5eb0: 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 20 61  as last placed a
5ec0: 74 2e 20 20 43 75 72 73 6f 72 73 20 63 61 6e 20  t.  Cursors can 
5ed0: 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f  move when the ro
5ee0: 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74  w they are point
5ef0: 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c  ing.** at is del
5f00: 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
5f10: 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  der them..**.** 
5f20: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
5f30: 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 63 6f  urns an error co
5f40: 64 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  de if something 
5f50: 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54 68 65  goes wrong.  The
5f60: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70 48 61  .** integer *pHa
5f70: 73 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f  sMoved is set to
5f80: 20 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72 73   one if the curs
5f90: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 61 6e 64  or has moved and
5fa0: 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e   0 if not..*/.in
5fb0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
5fc0: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43  rsorHasMoved(BtC
5fd0: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
5fe0: 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20   *pHasMoved){.  
5ff0: 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
6000: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
6010: 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
6020: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 48  f( rc ){.    *pH
6030: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20  asMoved = 1;.   
6040: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
6050: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
6060: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
6070: 20 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65   || pCur->skipNe
6080: 78 74 21 3d 30 20 29 7b 0a 20 20 20 20 2a 70 48  xt!=0 ){.    *pH
6090: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  asMoved = 1;.  }
60a0: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48 61 73 4d  else{.    *pHasM
60b0: 6f 76 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  oved = 0;.  }.  
60c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
60d0: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
60e0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
60f0: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
6100: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
6110: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
6120: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
6130: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
6140: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
6150: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
6160: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
6170: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
6180: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
6190: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
61a0: 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70  0 (not a valid p
61b0: 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31  age) for pgno==1
61c0: 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a   since there is.
61d0: 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61  ** no pointer ma
61e0: 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  p associated wit
61f0: 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69  h page 1.  The i
6200: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c  ntegrity_check l
6210: 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73  ogic.** requires
6220: 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65   that ptrmapPage
6230: 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73  no(*,1)!=1..*/.s
6240: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
6250: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
6260: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
6270: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
6280: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
6290: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
62a0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
62b0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
62c0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
62d0: 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72  ( pgno<2 ) retur
62e0: 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  n 0;.  nPagesPer
62f0: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
6300: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
6310: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
6320: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
6330: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
6340: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
6350: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
6360: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
6370: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
6380: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
6390: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
63a0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
63b0: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
63c0: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
63d0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
63e0: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
63f0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
6400: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
6410: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
6420: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
6430: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
6440: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
6450: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20  r 'pgno'..**.** 
6460: 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69  If *pRC is initi
6470: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  ally non-zero (n
6480: 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68  on-SQLITE_OK) th
6490: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
64a0: 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20  is.** a no-op.  
64b0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
64c0: 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69  rs, the appropri
64d0: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
64e0: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
64f0: 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69  o *pRC..*/.stati
6500: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
6510: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
6520: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
6530: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c  pe, Pgno parent,
6540: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62   int *pRC){.  Db
6550: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
6560: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
6570: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
6580: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
6590: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
65a0: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
65b0: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
65c0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
65d0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
65e0: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
65f0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
6600: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
6610: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
6620: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
6630: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
6640: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
6650: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
6660: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  n;..  assert( sq
6670: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
6680: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
6690: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
66a0: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
66b0: 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62  ber must never b
66c0: 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e  e used as a poin
66d0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
66e0: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52    assert( 0==PTR
66f0: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
6700: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
6710: 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73  E(pBt)) );..  as
6720: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
6730: 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b  acuum );.  if( k
6740: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52  ey==0 ){.    *pR
6750: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
6760: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
6770: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d  urn;.  }.  iPtrm
6780: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
6790: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
67a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
67b0: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
67c0: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
67d0: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
67e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
67f0: 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
6800: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66  return;.  }.  of
6810: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
6820: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
6830: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
6840: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52  set<0 ){.    *pR
6850: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
6860: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
6870: 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20  o ptrmap_exit;. 
6880: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
6890: 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  set <= (int)pBt-
68a0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b  >usableSize-5 );
68b0: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
68c0: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
68d0: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
68e0: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70  ..  if( eType!=p
68f0: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c  Ptrmap[offset] |
6900: 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  | get4byte(&pPtr
6910: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d  map[offset+1])!=
6920: 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52  parent ){.    TR
6930: 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44  ACE(("PTRMAP_UPD
6940: 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29  ATE: %d->(%d,%d)
6950: 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c  \n", key, eType,
6960: 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a   parent));.    *
6970: 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65  pRC= rc = sqlite
6980: 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
6990: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
69a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
69b0: 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66       pPtrmap[off
69c0: 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20  set] = eType;.  
69d0: 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
69e0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c  trmap[offset+1],
69f0: 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a   parent);.    }.
6a00: 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74    }..ptrmap_exit
6a10: 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  :.  sqlite3Pager
6a20: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
6a30: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e  }../*.** Read an
6a40: 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20   entry from the 
6a50: 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a  pointer map..**.
6a60: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6a70: 72 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f  retrieves the po
6a80: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
6a90: 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20  for page 'key', 
6aa0: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74  writing.** the t
6ab0: 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70  ype and parent p
6ac0: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70  age number to *p
6ad0: 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f  EType and *pPgno
6ae0: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a   respectively..*
6af0: 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * An error code 
6b00: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
6b10: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
6b20: 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53  ong, otherwise S
6b30: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
6b40: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65  tic int ptrmapGe
6b50: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
6b60: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70   Pgno key, u8 *p
6b70: 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67  EType, Pgno *pPg
6b80: 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
6b90: 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  DbPage;   /* The
6ba0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
6bb0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d  e */.  int iPtrm
6bc0: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ap;       /* Poi
6bd0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e  nter map page in
6be0: 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  dex */.  u8 *pPt
6bf0: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
6c00: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
6c10: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  data */.  int of
6c20: 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  fset;        /* 
6c30: 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20  Offset of entry 
6c40: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a  in pointer map *
6c50: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
6c60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
6c70: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
6c80: 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72  utex) );..  iPtr
6c90: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
6ca0: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
6cb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
6cc0: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
6cd0: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
6ce0: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
6cf0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
6d00: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d   rc;.  }.  pPtrm
6d10: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
6d20: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
6d30: 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73  DbPage);..  offs
6d40: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
6d50: 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b  FFSET(iPtrmap, k
6d60: 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65  ey);.  if( offse
6d70: 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  t<0 ){.    sqlit
6d80: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
6d90: 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Page);.    retur
6da0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
6db0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73  _BKPT;.  }.  ass
6dc0: 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28  ert( offset <= (
6dd0: 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
6de0: 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72  ize-5 );.  asser
6df0: 74 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a  t( pEType!=0 );.
6e00: 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72    *pEType = pPtr
6e10: 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69  map[offset];.  i
6e20: 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e  f( pPgno ) *pPgn
6e30: 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
6e40: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
6e50: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ;..  sqlite3Page
6e60: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
6e70: 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31  .  if( *pEType<1
6e80: 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20   || *pEType>5 ) 
6e90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
6ea0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65  RRUPT_BKPT;.  re
6eb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6ec0: 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64  }..#else /* if d
6ed0: 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d  efined SQLITE_OM
6ee0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
6ef0: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
6f00: 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29  pPut(w,x,y,z,rc)
6f10: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
6f20: 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51  pGet(w,x,y,z) SQ
6f30: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
6f40: 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  e ptrmapPutOvflP
6f50: 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e  tr(x, y, rc).#en
6f60: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  dif../*.** Given
6f70: 20 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e   a btree page an
6f80: 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28  d a cell index (
6f90: 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73  0 means the firs
6fa0: 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65  t cell on.** the
6fb0: 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74   page, 1 means t
6fc0: 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20  he second cell, 
6fd0: 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65  and so forth) re
6fe0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a  turn a pointer.*
6ff0: 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  * to the cell co
7000: 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ntent..**.** Thi
7010: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
7020: 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74  only for pages t
7030: 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61  hat do not conta
7040: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
7050: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69  s..*/.#define fi
7060: 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20  ndCell(P,I) \.  
7070: 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28  ((P)->aData + ((
7080: 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67  P)->maskPage & g
7090: 65 74 32 62 79 74 65 28 26 28 50 29 2d 3e 61 43  et2byte(&(P)->aC
70a0: 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29  ellIdx[2*(I)])))
70b0: 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c  .#define findCel
70c0: 6c 76 32 28 44 2c 4d 2c 4f 2c 49 29 20 28 44 2b  lv2(D,M,O,I) (D+
70d0: 28 4d 26 67 65 74 32 62 79 74 65 28 44 2b 28 4f  (M&get2byte(D+(O
70e0: 2b 32 2a 28 49 29 29 29 29 29 0a 0a 0a 2f 2a 0a  +2*(I))))).../*.
70f0: 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63  ** This a more c
7100: 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f  omplex version o
7110: 66 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61  f findCell() tha
7120: 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70  t works for.** p
7130: 61 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e  ages that do con
7140: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
7150: 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  lls..*/.static u
7160: 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  8 *findOverflowC
7170: 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
7180: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
7190: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
71a0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
71b0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
71c0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
71d0: 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72  r(i=pPage->nOver
71e0: 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  flow-1; i>=0; i-
71f0: 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20  -){.    int k;. 
7200: 20 20 20 6b 20 3d 20 70 50 61 67 65 2d 3e 61 69     k = pPage->ai
7210: 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28  Ovfl[i];.    if(
7220: 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20   k<=iCell ){.   
7230: 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20     if( k==iCell 
7240: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
7250: 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b  n pPage->apOvfl[
7260: 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i];.      }.    
7270: 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d    iCell--;.    }
7280: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69  .  }.  return fi
7290: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
72a0: 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ell);.}../*.** P
72b0: 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74  arse a cell cont
72c0: 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69  ent block and fi
72d0: 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e  ll in the CellIn
72e0: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  fo structure.  T
72f0: 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20  here.** are two 
7300: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73  versions of this
7310: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74 72 65   function.  btre
7320: 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b  eParseCell() tak
7330: 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e  es a .** cell in
7340: 64 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e  dex as the secon
7350: 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 62  d argument and b
7360: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
7370: 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70  () .** takes a p
7380: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f  ointer to the bo
7390: 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61  dy of the cell a
73a0: 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67  s its second arg
73b0: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  ument..**.** Wit
73c0: 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74  hin this file, t
73d0: 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20 6d  he parseCell() m
73e0: 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c  acro can be call
73f0: 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ed instead of.**
7400: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
7410: 74 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65  tr(). Using some
7420: 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69 73   compilers, this
7430: 20 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72 2e   will be faster.
7440: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7450: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
7460: 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  r(.  MemPage *pP
7470: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
7480: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
7490: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
74a0: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
74b0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
74c0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
74d0: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
74e0: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
74f0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
7500: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
7510: 20 20 75 31 36 20 6e 3b 20 20 20 20 20 20 20 20    u16 n;        
7520: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7530: 62 65 72 20 62 79 74 65 73 20 69 6e 20 63 65 6c  ber bytes in cel
7540: 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72  l content header
7550: 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f   */.  u32 nPaylo
7560: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad;           /*
7570: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
7580: 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64   of cell payload
7590: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
75a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
75b0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
75c0: 74 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f  tex) );..  pInfo
75d0: 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b  ->pCell = pCell;
75e0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
75f0: 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61  ->leaf==0 || pPa
7600: 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20  ge->leaf==1 );. 
7610: 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c   n = pPage->chil
7620: 64 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65  dPtrSize;.  asse
7630: 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65  rt( n==4-4*pPage
7640: 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20  ->leaf );.  if( 
7650: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
7660: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
7670: 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20  hasData ){.     
7680: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33   n += getVarint3
7690: 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61  2(&pCell[n], nPa
76a0: 79 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c 73  yload);.    }els
76b0: 65 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61  e{.      nPayloa
76c0: 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  d = 0;.    }.   
76d0: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28   n += getVarint(
76e0: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a  &pCell[n], (u64*
76f0: 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a  )&pInfo->nKey);.
7700: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61      pInfo->nData
7710: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d   = nPayload;.  }
7720: 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  else{.    pInfo-
7730: 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20  >nData = 0;.    
7740: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  n += getVarint32
7750: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79  (&pCell[n], nPay
7760: 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e 66 6f  load);.    pInfo
7770: 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61  ->nKey = nPayloa
7780: 64 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e  d;.  }.  pInfo->
7790: 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c  nPayload = nPayl
77a0: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48  oad;.  pInfo->nH
77b0: 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20 74 65 73  eader = n;.  tes
77c0: 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d  tcase( nPayload=
77d0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
77e0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
77f0: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
7800: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
7810: 20 69 66 28 20 6c 69 6b 65 6c 79 28 6e 50 61 79   if( likely(nPay
7820: 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  load<=pPage->max
7830: 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a  Local) ){.    /*
7840: 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61   This is the (ea
7850: 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  sy) common case 
7860: 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65  where the entire
7870: 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20   payload fits.  
7880: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61    ** on the loca
7890: 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72  l page.  No over
78a0: 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64  flow is required
78b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
78c0: 20 28 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d   (pInfo->nSize =
78d0: 20 28 75 31 36 29 28 6e 2b 6e 50 61 79 6c 6f 61   (u16)(n+nPayloa
78e0: 64 29 29 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e  d))<4 ) pInfo->n
78f0: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49  Size = 4;.    pI
7900: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
7910: 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20  16)nPayload;.   
7920: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
7930: 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w = 0;.  }else{.
7940: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
7950: 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66  yload will not f
7960: 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e  it completely on
7970: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c   the local page,
7980: 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20   we have.    ** 
7990: 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75  to decide how mu
79a0: 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61  ch to store loca
79b0: 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68  lly and how much
79c0: 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20   to spill onto. 
79d0: 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
79e0: 61 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74  ages.  The strat
79f0: 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69  egy is to minimi
7a00: 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ze the amount of
7a10: 20 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73   unused.    ** s
7a20: 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77  pace on overflow
7a30: 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65   pages while kee
7a40: 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20  ping the amount 
7a50: 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  of local storage
7a60: 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65  .    ** in betwe
7a70: 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20  en minLocal and 
7a80: 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a  maxLocal..    **
7a90: 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a  .    ** Warning:
7aa0: 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77    changing the w
7ab0: 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c  ay overflow payl
7ac0: 6f 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74  oad is distribut
7ad0: 65 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a  ed in any.    **
7ae0: 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74   way will result
7af0: 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   in an incompati
7b00: 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  ble file format.
7b10: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
7b20: 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69  minLocal;  /* Mi
7b30: 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  nimum amount of 
7b40: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
7b50: 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ally */.    int 
7b60: 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61  maxLocal;  /* Ma
7b70: 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
7b80: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
7b90: 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ally */.    int 
7ba0: 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76  surplus;   /* Ov
7bb0: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61  erflow payload a
7bc0: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63  vailable for loc
7bd0: 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20  al storage */.. 
7be0: 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50     minLocal = pP
7bf0: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
7c00: 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50     maxLocal = pP
7c10: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  age->maxLocal;. 
7c20: 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e     surplus = min
7c30: 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61  Local + (nPayloa
7c40: 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70  d - minLocal)%(p
7c50: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
7c60: 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
7c70: 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75  testcase( surplu
7c80: 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  s==maxLocal );. 
7c90: 20 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72     testcase( sur
7ca0: 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31  plus==maxLocal+1
7cb0: 20 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70   );.    if( surp
7cc0: 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20  lus <= maxLocal 
7cd0: 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  ){.      pInfo->
7ce0: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75  nLocal = (u16)su
7cf0: 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65  rplus;.    }else
7d00: 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  {.      pInfo->n
7d10: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e  Local = (u16)min
7d20: 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  Local;.    }.   
7d30: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
7d40: 77 20 3d 20 28 75 31 36 29 28 70 49 6e 66 6f 2d  w = (u16)(pInfo-
7d50: 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 29 3b 0a 20 20  >nLocal + n);.  
7d60: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
7d70: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
7d80: 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65  w + 4;.  }.}.#de
7d90: 66 69 6e 65 20 70 61 72 73 65 43 65 6c 6c 28 70  fine parseCell(p
7da0: 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e  Page, iCell, pIn
7db0: 66 6f 29 20 5c 0a 20 20 62 74 72 65 65 50 61 72  fo) \.  btreePar
7dc0: 73 65 43 65 6c 6c 50 74 72 28 28 70 50 61 67 65  seCellPtr((pPage
7dd0: 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70 50 61  ), findCell((pPa
7de0: 67 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c 20 28  ge), (iCell)), (
7df0: 70 49 6e 66 6f 29 29 0a 73 74 61 74 69 63 20 76  pInfo)).static v
7e00: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
7e10: 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
7e20: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
7e30: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
7e40: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   the cell */.  i
7e50: 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt iCell,       
7e60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65         /* The ce
7e70: 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74  ll index.  First
7e80: 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20   cell is 0 */.  
7e90: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
7ea0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
7eb0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
7ec0: 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43  e */.){.  parseC
7ed0: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
7ee0: 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a  , pInfo);.}../*.
7ef0: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  ** Compute the t
7f00: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  otal number of b
7f10: 79 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c  ytes that a Cell
7f20: 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65   needs in the ce
7f30: 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20  ll.** data area 
7f40: 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67  of the btree-pag
7f50: 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e  e.  The return n
7f60: 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74  umber includes t
7f70: 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20  he cell.** data 
7f80: 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c  header and the l
7f90: 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75  ocal payload, bu
7fa0: 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c  t not any overfl
7fb0: 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68  ow page or.** th
7fc0: 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20  e space used by 
7fd0: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
7fe0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  ..*/.static u16 
7ff0: 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50  cellSizePtr(MemP
8000: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
8010: 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49  pCell){.  u8 *pI
8020: 74 65 72 20 3d 20 26 70 43 65 6c 6c 5b 70 50 61  ter = &pCell[pPa
8030: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
8040: 5d 3b 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 0a  ];.  u32 nSize;.
8050: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
8060: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61  EBUG.  /* The va
8070: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
8080: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
8090: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74  ould always be t
80a0: 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20  he same as.  ** 
80b0: 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53  the (CellInfo.nS
80c0: 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64  ize) value found
80d0: 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c   by doing a full
80e0: 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20   parse of the.  
80f0: 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49  ** cell. If SQLI
8100: 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
8110: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
8120: 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
8130: 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  f.  ** this func
8140: 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68  tion verifies th
8150: 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e  at this invarian
8160: 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65  t is not violate
8170: 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  d. */.  CellInfo
8180: 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 62 74   debuginfo;.  bt
8190: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
81a0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64  pPage, pCell, &d
81b0: 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69  ebuginfo);.#endi
81c0: 66 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  f..  if( pPage->
81d0: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 75 38  intKey ){.    u8
81e0: 20 2a 70 45 6e 64 3b 0a 20 20 20 20 69 66 28 20   *pEnd;.    if( 
81f0: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29  pPage->hasData )
8200: 7b 0a 20 20 20 20 20 20 70 49 74 65 72 20 2b 3d  {.      pIter +=
8210: 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74   getVarint32(pIt
8220: 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20  er, nSize);.    
8230: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 69  }else{.      nSi
8240: 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  ze = 0;.    }.. 
8250: 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20     /* pIter now 
8260: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34  points at the 64
8270: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79  -bit integer key
8280: 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62   value, a variab
8290: 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a  le length .    *
82a0: 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66  * integer. The f
82b0: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d  ollowing block m
82c0: 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f  oves pIter to po
82d0: 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74  int at the first
82e0: 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73   byte.    ** pas
82f0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
8300: 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20   key value. */. 
8310: 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72     pEnd = &pIter
8320: 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [9];.    while( 
8330: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
8340: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
8350: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
8360: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
8370: 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29  32(pIter, nSize)
8380: 3b 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63 61 73  ;.  }..  testcas
8390: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
83a0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
83b0: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
83c0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
83d0: 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  1 );.  if( nSize
83e0: 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  >pPage->maxLocal
83f0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c   ){.    int minL
8400: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69  ocal = pPage->mi
8410: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a  nLocal;.    nSiz
8420: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  e = minLocal + (
8430: 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c  nSize - minLocal
8440: 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d  ) % (pPage->pBt-
8450: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
8460: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
8470: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
8480: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65  xLocal );.    te
8490: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
84a0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
84b0: 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a   );.    if( nSiz
84c0: 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  e>pPage->maxLoca
84d0: 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  l ){.      nSize
84e0: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20   = minLocal;.   
84f0: 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20   }.    nSize += 
8500: 34 3b 0a 20 20 7d 0a 20 20 6e 53 69 7a 65 20 2b  4;.  }.  nSize +
8510: 3d 20 28 75 33 32 29 28 70 49 74 65 72 20 2d 20  = (u32)(pIter - 
8520: 70 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 54 68  pCell);..  /* Th
8530: 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f  e minimum size o
8540: 66 20 61 6e 79 20 63 65 6c 6c 20 69 73 20 34 20  f any cell is 4 
8550: 62 79 74 65 73 2e 20 2a 2f 0a 20 20 69 66 28 20  bytes. */.  if( 
8560: 6e 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20 6e  nSize<4 ){.    n
8570: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20  Size = 4;.  }.. 
8580: 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d   assert( nSize==
8590: 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20  debuginfo.nSize 
85a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36  );.  return (u16
85b0: 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 64 65  )nSize;.}..#ifde
85c0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
85d0: 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e  * This variation
85e0: 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28   on cellSizePtr(
85f0: 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65  ) is used inside
8600: 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61   of assert() sta
8610: 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e  tements.** only.
8620: 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63   */.static u16 c
8630: 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20  ellSize(MemPage 
8640: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
8650: 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65 6c  l){.  return cel
8660: 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
8670: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
8680: 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69  iCell));.}.#endi
8690: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
86a0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
86b0: 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  M./*.** If the c
86c0: 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20  ell pCell, part 
86d0: 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f  of page pPage co
86e0: 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
86f0: 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  .** to an overfl
8700: 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20  ow page, insert 
8710: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
8720: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a  e pointer-map.**
8730: 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
8740: 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  w page..*/.stati
8750: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
8760: 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20  OvflPtr(MemPage 
8770: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
8780: 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  l, int *pRC){.  
8790: 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
87a0: 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
87b0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  rn;.  assert( pC
87c0: 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72 65  ell!=0 );.  btre
87d0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
87e0: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
87f0: 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69  o);.  assert( (i
8800: 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65  nfo.nData+(pPage
8810: 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e  ->intKey?0:info.
8820: 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61  nKey))==info.nPa
8830: 79 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28 20 69  yload );.  if( i
8840: 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b  nfo.iOverflow ){
8850: 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d  .    Pgno ovfl =
8860: 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
8870: 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
8880: 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  );.    ptrmapPut
8890: 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66  (pPage->pBt, ovf
88a0: 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
88b0: 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  OW1, pPage->pgno
88c0: 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  , pRC);.  }.}.#e
88d0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  ndif.../*.** Def
88e0: 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65  ragment the page
88f0: 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c   given.  All Cel
8900: 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20  ls are moved to 
8910: 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  the.** end of th
8920: 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66  e page and all f
8930: 72 65 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c  ree space is col
8940: 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a  lected into one.
8950: 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74  ** big FreeBlk t
8960: 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65  hat occurs in be
8970: 74 77 65 65 6e 20 74 68 65 20 68 65 61 64 65 72  tween the header
8980: 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69   and cell.** poi
8990: 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64 20 74  nter array and t
89a0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
89b0: 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  area..*/.static 
89c0: 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61  int defragmentPa
89d0: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
89e0: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
89f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a00: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
8a10: 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
8a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a30: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
8a40: 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20   i-th cell */.  
8a50: 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
8a60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
8a70: 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65  fset to the page
8a80: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
8a90: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
8aa0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
8ab0: 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  of a cell */.  i
8ac0: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
8ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8ae0: 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79  ber of usable by
8af0: 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f  tes on a page */
8b00: 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
8b10: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
8b20: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   Offset to the c
8b30: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
8b40: 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b  y */.  int cbrk;
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b60: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
8b70: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
8b80: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  area */.  int nC
8b90: 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
8ba0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8bb0: 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70  f cells on the p
8bc0: 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
8bd0: 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20  d char *data;   
8be0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
8bf0: 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  data */.  unsign
8c00: 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20  ed char *temp;  
8c10: 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65       /* Temp are
8c20: 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65  a for cell conte
8c30: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  nt */.  int iCel
8c40: 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  lFirst;         
8c50: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f     /* First allo
8c60: 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  wable cell index
8c70: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c   */.  int iCellL
8c80: 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ast;            
8c90: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
8ca0: 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  e cell index */.
8cb0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
8cc0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
8cd0: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
8ce0: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
8cf0: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
8d00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
8d10: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
8d20: 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58  ze <= SQLITE_MAX
8d30: 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20  _PAGE_SIZE );.  
8d40: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
8d50: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
8d60: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8d70: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
8d80: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
8d90: 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74  ;.  temp = sqlit
8da0: 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
8db0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61  (pPage->pBt->pPa
8dc0: 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  ger);.  data = p
8dd0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
8de0: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
8df0: 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66  ffset;.  cellOff
8e00: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
8e10: 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c  lOffset;.  nCell
8e20: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
8e30: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
8e40: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
8e50: 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73  [hdr+3]) );.  us
8e60: 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  ableSize = pPage
8e70: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
8e80: 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32  e;.  cbrk = get2
8e90: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
8ea0: 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65  ]);.  memcpy(&te
8eb0: 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b  mp[cbrk], &data[
8ec0: 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a  cbrk], usableSiz
8ed0: 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62 72  e - cbrk);.  cbr
8ee0: 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  k = usableSize;.
8ef0: 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63    iCellFirst = c
8f00: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43  ellOffset + 2*nC
8f10: 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74  ell;.  iCellLast
8f20: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
8f30: 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  4;.  for(i=0; i<
8f40: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
8f50: 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20   u8 *pAddr;     
8f60: 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c  /* The i-th cell
8f70: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
8f80: 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65  pAddr = &data[ce
8f90: 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b  llOffset + i*2];
8fa0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
8fb0: 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74  te(pAddr);.    t
8fc0: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
8fd0: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
8fe0: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
8ff0: 6c 6c 4c 61 73 74 20 29 3b 0a 23 69 66 20 21 64  llLast );.#if !d
9000: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
9010: 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45  ABLE_OVERSIZE_CE
9020: 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f 2a  LL_CHECK).    /*
9030: 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e   These condition
9040: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
9050: 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20  een verified in 
9060: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a  btreeInitPage().
9070: 20 20 20 20 2a 2a 20 69 66 20 53 51 4c 49 54 45      ** if SQLITE
9080: 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45  _ENABLE_OVERSIZE
9090: 5f 43 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20 64  _CELL_CHECK is d
90a0: 65 66 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a 20  efined .    */. 
90b0: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
90c0: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
90d0: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  Last ){.      re
90e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
90f0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
9100: 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
9110: 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73  t( pc>=iCellFirs
9120: 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61  t && pc<=iCellLa
9130: 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d  st );.    size =
9140: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
9150: 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a  ge, &temp[pc]);.
9160: 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65      cbrk -= size
9170: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
9180: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52  LITE_ENABLE_OVER
9190: 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29  SIZE_CELL_CHECK)
91a0: 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43  .    if( cbrk<iC
91b0: 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20  ellFirst ){.    
91c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
91d0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
91e0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66    }.#else.    if
91f0: 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73  ( cbrk<iCellFirs
9200: 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61  t || pc+size>usa
9210: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
9220: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9230: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
9240: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73   }.#endif.    as
9250: 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c  sert( cbrk+size<
9260: 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63  =usableSize && c
9270: 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20  brk>=iCellFirst 
9280: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
9290: 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62   cbrk+size==usab
92a0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65  leSize );.    te
92b0: 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d  stcase( pc+size=
92c0: 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  =usableSize );. 
92d0: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
92e0: 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d  cbrk], &temp[pc]
92f0: 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74  , size);.    put
9300: 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72  2byte(pAddr, cbr
9310: 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  k);.  }.  assert
9320: 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72  ( cbrk>=iCellFir
9330: 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  st );.  put2byte
9340: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63  (&data[hdr+5], c
9350: 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  brk);.  data[hdr
9360: 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b  +1] = 0;.  data[
9370: 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61  hdr+2] = 0;.  da
9380: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
9390: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43   memset(&data[iC
93a0: 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62  ellFirst], 0, cb
93b0: 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a  rk-iCellFirst);.
93c0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
93d0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
93e0: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
93f0: 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d  ) );.  if( cbrk-
9400: 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67  iCellFirst!=pPag
9410: 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
9420: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
9430: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
9440: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9450: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  OK;.}../*.** All
9460: 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65  ocate nByte byte
9470: 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20  s of space from 
9480: 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65  within the B-Tre
9490: 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a  e page passed.**
94a0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
94b0: 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e  gument. Write in
94c0: 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64  to *pIdx the ind
94d0: 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ex into pPage->a
94e0: 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65  Data[].** of the
94f0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61   first byte of a
9500: 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20  llocated space. 
9510: 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53 51  Return either SQ
9520: 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e  LITE_OK or.** an
9530: 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75   error code (usu
9540: 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52  ally SQLITE_CORR
9550: 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  UPT)..**.** The 
9560: 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65  caller guarantee
9570: 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
9580: 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
9590: 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20   to make the.** 
95a0: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69  allocation.  Thi
95b0: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
95c0: 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65  need to defragme
95d0: 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  nt in order to b
95e0: 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20  ring.** all the 
95f0: 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20  space together, 
9600: 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20 72  however.  This r
9610: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69  outine will avoi
9620: 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66  d using.** the f
9630: 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20 70  irst two bytes p
9640: 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  ast the cell poi
9650: 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65 20  nter area since 
9660: 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a  presumably this.
9670: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ** allocation is
9680: 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f   being made in o
9690: 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61  rder to insert a
96a0: 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65   new cell, so we
96b0: 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e   will.** also en
96c0: 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e  d up needing a n
96d0: 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  ew cell pointer.
96e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
96f0: 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d  llocateSpace(Mem
9700: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
9710: 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64   nByte, int *pId
9720: 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  x){.  const int 
9730: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
9740: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f  Offset;    /* Lo
9750: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61  cal cache of pPa
9760: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f  ge->hdrOffset */
9770: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61  .  u8 * const da
9780: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
9790: 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  a;      /* Local
97a0: 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d   cache of pPage-
97b0: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  >aData */.  int 
97c0: 6e 46 72 61 67 3b 20 20 20 20 20 20 20 20 20 20  nFrag;          
97d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 72   /* Number of fr
97f0: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 6f  agmented bytes o
9800: 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  n pPage */.  int
9810: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
9820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9830: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
9840: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
9850: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 67 61  area */.  int ga
9860: 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  p;        /* Fir
9870: 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20 62  st byte of gap b
9880: 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e  etween cell poin
9890: 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f  ters and cell co
98a0: 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72  ntent */.  int r
98b0: 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  c;         /* In
98c0: 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64  teger return cod
98d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  e */.  int usabl
98e0: 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65  eSize; /* Usable
98f0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67   size of the pag
9900: 65 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74  e */.  .  assert
9910: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
9920: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
9930: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
9940: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
9950: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t );.  assert( s
9960: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
9970: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
9980: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
9990: 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f  ( nByte>=0 );  /
99a0: 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73  * Minimum cell s
99b0: 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73  ize is 4 */.  as
99c0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72  sert( pPage->nFr
99d0: 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61  ee>=nByte );.  a
99e0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
99f0: 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
9a00: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61  usableSize = pPa
9a10: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
9a20: 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ize;.  assert( n
9a30: 42 79 74 65 20 3c 20 75 73 61 62 6c 65 53 69 7a  Byte < usableSiz
9a40: 65 2d 38 20 29 3b 0a 0a 20 20 6e 46 72 61 67 20  e-8 );..  nFrag 
9a50: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20  = data[hdr+7];. 
9a60: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9a70: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64  cellOffset == hd
9a80: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
9a90: 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20  ->leaf );.  gap 
9aa0: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
9ab0: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
9ac0: 43 65 6c 6c 3b 0a 20 20 74 6f 70 20 3d 20 67 65  Cell;.  top = ge
9ad0: 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
9ae0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69  ata[hdr+5]);.  i
9af0: 66 28 20 67 61 70 3e 74 6f 70 20 29 20 72 65 74  f( gap>top ) ret
9b00: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
9b10: 50 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73 74 63  PT_BKPT;.  testc
9b20: 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20  ase( gap+2==top 
9b30: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
9b40: 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+1==top );.  t
9b50: 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f  estcase( gap==to
9b60: 70 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72 61  p );..  if( nFra
9b70: 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20  g>=60 ){.    /* 
9b80: 41 6c 77 61 79 73 20 64 65 66 72 61 67 6d 65 6e  Always defragmen
9b90: 74 20 68 69 67 68 6c 79 20 66 72 61 67 6d 65 6e  t highly fragmen
9ba0: 74 65 64 20 70 61 67 65 73 20 2a 2f 0a 20 20 20  ted pages */.   
9bb0: 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74   rc = defragment
9bc0: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
9bd0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
9be0: 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67   rc;.    top = g
9bf0: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
9c00: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
9c10: 7d 65 6c 73 65 20 69 66 28 20 67 61 70 2b 32 3c  }else if( gap+2<
9c20: 3d 74 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 53  =top ){.    /* S
9c30: 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c 69  earch the freeli
9c40: 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  st looking for a
9c50: 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65   free slot big e
9c60: 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79  nough to satisfy
9c70: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71   .    ** the req
9c80: 75 65 73 74 2e 20 54 68 65 20 61 6c 6c 6f 63 61  uest. The alloca
9c90: 74 69 6f 6e 20 69 73 20 6d 61 64 65 20 66 72 6f  tion is made fro
9ca0: 6d 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  m the first free
9cb0: 20 73 6c 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a   slot in .    **
9cc0: 20 74 68 65 20 6c 69 73 74 20 74 68 61 74 20 69   the list that i
9cd0: 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  s large enough t
9ce0: 6f 20 61 63 63 6f 6d 61 64 61 74 65 20 69 74 2e  o accomadate it.
9cf0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
9d00: 70 63 2c 20 61 64 64 72 3b 0a 20 20 20 20 66 6f  pc, addr;.    fo
9d10: 72 28 61 64 64 72 3d 68 64 72 2b 31 3b 20 28 70  r(addr=hdr+1; (p
9d20: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
9d30: 74 61 5b 61 64 64 72 5d 29 29 3e 30 3b 20 61 64  ta[addr]))>0; ad
9d40: 64 72 3d 70 63 29 7b 0a 20 20 20 20 20 20 69 6e  dr=pc){.      in
9d50: 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
9d60: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
9d70: 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20  e free slot */. 
9d80: 20 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62       if( pc>usab
9d90: 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 61  leSize-4 || pc<a
9da0: 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 20  ddr+4 ){.       
9db0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9dc0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
9dd0: 20 20 20 7d 0a 20 20 20 20 20 20 73 69 7a 65 20     }.      size 
9de0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
9df0: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  [pc+2]);.      i
9e00: 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29  f( size>=nByte )
9e10: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20  {.        int x 
9e20: 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a  = size - nByte;.
9e30: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
9e40: 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ( x==4 );.      
9e50: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33    testcase( x==3
9e60: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
9e70: 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  x<4 ){.         
9e80: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73   /* Remove the s
9e90: 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65  lot from the fre
9ea0: 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74  e-list. Update t
9eb0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  he number of.   
9ec0: 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65         ** fragme
9ed0: 6e 74 65 64 20 62 79 74 65 73 20 77 69 74 68 69  nted bytes withi
9ee0: 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  n the page. */. 
9ef0: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
9f00: 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64 61  &data[addr], &da
9f10: 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20  ta[pc], 2);.    
9f20: 20 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37        data[hdr+7
9f30: 5d 20 3d 20 28 75 38 29 28 6e 46 72 61 67 20 2b  ] = (u8)(nFrag +
9f40: 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   x);.        }el
9f50: 73 65 20 69 66 28 20 73 69 7a 65 2b 70 63 20 3e  se if( size+pc >
9f60: 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20   usableSize ){. 
9f70: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
9f80: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9f90: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  KPT;.        }el
9fa0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
9fb0: 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e   The slot remain
9fc0: 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  s on the free-li
9fd0: 73 74 2e 20 52 65 64 75 63 65 20 69 74 73 20 73  st. Reduce its s
9fe0: 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20  ize to account. 
9ff0: 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20           ** for 
a000: 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64  the portion used
a010: 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f   by the new allo
a020: 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  cation. */.     
a030: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64       put2byte(&d
a040: 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20  ata[pc+2], x);. 
a050: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a060: 20 2a 70 49 64 78 20 3d 20 70 63 20 2b 20 78 3b   *pIdx = pc + x;
a070: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
a080: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
a090: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
a0a0: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65  /* Check to make
a0b0: 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 65   sure there is e
a0c0: 6e 6f 75 67 68 20 73 70 61 63 65 20 69 6e 20 74  nough space in t
a0d0: 68 65 20 67 61 70 20 74 6f 20 73 61 74 69 73 66  he gap to satisf
a0e0: 79 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 6f 63  y.  ** the alloc
a0f0: 61 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 74 2c 20  ation.  If not, 
a100: 64 65 66 72 61 67 6d 65 6e 74 2e 0a 20 20 2a 2f  defragment..  */
a110: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
a120: 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b  +2+nByte==top );
a130: 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79  .  if( gap+2+nBy
a140: 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20 72 63  te>top ){.    rc
a150: 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67   = defragmentPag
a160: 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66  e(pPage);.    if
a170: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
a180: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
a190: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
a1a0: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61  a[hdr+5]);.    a
a1b0: 73 73 65 72 74 28 20 67 61 70 2b 6e 42 79 74 65  ssert( gap+nByte
a1c0: 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20  <=top );.  }... 
a1d0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d   /* Allocate mem
a1e0: 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70  ory from the gap
a1f0: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
a200: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
a210: 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ay.  ** and the 
a220: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
a230: 61 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e 69  a.  The btreeIni
a240: 74 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73  tPage() call has
a250: 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61   already.  ** va
a260: 6c 69 64 61 74 65 64 20 74 68 65 20 66 72 65 65  lidated the free
a270: 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61  list.  Given tha
a280: 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  t the freelist i
a290: 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20  s valid, there. 
a2a0: 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68   ** is no way th
a2b0: 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  at the allocatio
a2c0: 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66  n can extend off
a2d0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a2e0: 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61  page..  ** The a
a2f0: 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65  ssert() below ve
a300: 72 69 66 69 65 73 20 74 68 65 20 70 72 65 76 69  rifies the previ
a310: 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20  ous sentence..  
a320: 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74  */.  top -= nByt
a330: 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  e;.  put2byte(&d
a340: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29  ata[hdr+5], top)
a350: 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b  ;.  assert( top+
a360: 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50  nByte <= (int)pP
a370: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
a380: 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20  Size );.  *pIdx 
a390: 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20  = top;.  return 
a3a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
a3b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63  .** Return a sec
a3c0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67  tion of the pPag
a3d0: 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20  e->aData to the 
a3e0: 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65  freelist..** The
a3f0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
a400: 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63  he new free bloc
a410: 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73  k is pPage->aDis
a420: 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20  k[start].** and 
a430: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
a440: 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20  block is "size" 
a450: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  bytes..**.** Mos
a460: 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20  t of the effort 
a470: 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64  here is involved
a480: 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64   in coalesing ad
a490: 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62  jacent.** free b
a4a0: 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e  locks into a sin
a4b0: 67 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f  gle big free blo
a4c0: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
a4d0: 74 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50  t freeSpace(MemP
a4e0: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
a4f0: 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a 65 29  start, int size)
a500: 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 62  {.  int addr, pb
a510: 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 69 6e 74  egin, hdr;.  int
a520: 20 69 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20   iLast;         
a530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a540: 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62  * Largest possib
a550: 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  le freeblock off
a560: 73 65 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  set */.  unsigne
a570: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
a580: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20  Page->aData;..  
a590: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
a5a0: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
a5b0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
a5c0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
a5d0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
a5e0: 61 73 73 65 72 74 28 20 73 74 61 72 74 3e 3d 70  assert( start>=p
a5f0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
a600: 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  6+pPage->childPt
a610: 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  rSize );.  asser
a620: 74 28 20 28 73 74 61 72 74 20 2b 20 73 69 7a 65  t( (start + size
a630: 29 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  ) <= (int)pPage-
a640: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a650: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
a660: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
a670: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
a680: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
a690: 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20 20 2f 2a   size>=0 );   /*
a6a0: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
a6b0: 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 20 20 69 66  ze is 4 */..  if
a6c0: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74  ( pPage->pBt->bt
a6d0: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
a6e0: 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  URE_DELETE ){.  
a6f0: 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64    /* Overwrite d
a700: 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
a710: 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68  on with zeros wh
a720: 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64 65  en the secure_de
a730: 6c 65 74 65 0a 20 20 20 20 2a 2a 20 6f 70 74 69  lete.    ** opti
a740: 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f  on is enabled */
a750: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
a760: 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a  a[start], 0, siz
a770: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64  e);.  }..  /* Ad
a780: 64 20 74 68 65 20 73 70 61 63 65 20 62 61 63 6b  d the space back
a790: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
a7a0: 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f   list of freeblo
a7b0: 63 6b 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a  cks.  Note that.
a7c0: 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68    ** even though
a7d0: 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c   the freeblock l
a7e0: 69 73 74 20 77 61 73 20 63 68 65 63 6b 65 64 20  ist was checked 
a7f0: 62 79 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  by btreeInitPage
a800: 28 29 2c 0a 20 20 2a 2a 20 62 74 72 65 65 49 6e  (),.  ** btreeIn
a810: 69 74 50 61 67 65 28 29 20 64 69 64 20 6e 6f 74  itPage() did not
a820: 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70 70   detect overlapp
a830: 69 6e 67 20 63 65 6c 6c 73 20 6f 72 0a 20 20 2a  ing cells or.  *
a840: 2a 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61  * freeblocks tha
a850: 74 20 6f 76 65 72 6c 61 70 70 65 64 20 63 65 6c  t overlapped cel
a860: 6c 73 2e 20 20 20 4e 6f 72 20 64 6f 65 73 20 69  ls.   Nor does i
a870: 74 20 64 65 74 65 63 74 20 77 68 65 6e 20 74 68  t detect when th
a880: 65 0a 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 74  e.  ** cell cont
a890: 65 6e 74 20 61 72 65 61 20 65 78 63 65 65 64 73  ent area exceeds
a8a0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
a8b0: 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 20 20  e page header.  
a8c0: 49 66 20 74 68 65 73 65 0a 20 20 2a 2a 20 73 69  If these.  ** si
a8d0: 74 75 61 74 69 6f 6e 73 20 61 72 69 73 65 2c 20  tuations arise, 
a8e0: 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20  then subsequent 
a8f0: 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e  insert operation
a900: 73 20 6d 69 67 68 74 20 63 6f 72 72 75 70 74 0a  s might corrupt.
a910: 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73    ** the freelis
a920: 74 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 65 65  t.  So we do nee
a930: 64 20 74 6f 20 63 68 65 63 6b 20 66 6f 72 20 63  d to check for c
a940: 6f 72 72 75 70 74 69 6f 6e 20 77 68 69 6c 65 20  orruption while 
a950: 73 63 61 6e 6e 69 6e 67 0a 20 20 2a 2a 20 74 68  scanning.  ** th
a960: 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f  e freelist..  */
a970: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
a980: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64  hdrOffset;.  add
a990: 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69  r = hdr + 1;.  i
a9a0: 4c 61 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  Last = pPage->pB
a9b0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
a9c0: 34 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61  4;.  assert( sta
a9d0: 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 20 20 77  rt<=iLast );.  w
a9e0: 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20  hile( (pbegin = 
a9f0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61  get2byte(&data[a
aa00: 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20  ddr]))<start && 
aa10: 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20  pbegin>0 ){.    
aa20: 69 66 28 20 70 62 65 67 69 6e 3c 61 64 64 72 2b  if( pbegin<addr+
aa30: 34 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  4 ){.      retur
aa40: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
aa50: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
aa60: 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a   addr = pbegin;.
aa70: 20 20 7d 0a 20 20 69 66 28 20 70 62 65 67 69 6e    }.  if( pbegin
aa80: 3e 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 72 65  >iLast ){.    re
aa90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
aaa0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
aab0: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61  assert( pbegin>a
aac0: 64 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30  ddr || pbegin==0
aad0: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
aae0: 64 61 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72  data[addr], star
aaf0: 74 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  t);.  put2byte(&
ab00: 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65  data[start], pbe
ab10: 67 69 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65  gin);.  put2byte
ab20: 28 26 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c  (&data[start+2],
ab30: 20 73 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d   size);.  pPage-
ab40: 3e 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e  >nFree = pPage->
ab50: 6e 46 72 65 65 20 2b 20 28 75 31 36 29 73 69 7a  nFree + (u16)siz
ab60: 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63  e;..  /* Coalesc
ab70: 65 20 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20  e adjacent free 
ab80: 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72  blocks */.  addr
ab90: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68   = hdr + 1;.  wh
aba0: 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67  ile( (pbegin = g
abb0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
abc0: 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 69  dr]))>0 ){.    i
abd0: 6e 74 20 70 6e 65 78 74 2c 20 70 73 69 7a 65 2c  nt pnext, psize,
abe0: 20 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   x;.    assert( 
abf0: 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20  pbegin>addr );. 
ac00: 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69     assert( pbegi
ac10: 6e 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  n <= (int)pPage-
ac20: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
ac30: 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20  -4 );.    pnext 
ac40: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
ac50: 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70  [pbegin]);.    p
ac60: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
ac70: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29  &data[pbegin+2])
ac80: 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e  ;.    if( pbegin
ac90: 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20   + psize + 3 >= 
aca0: 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30  pnext && pnext>0
acb0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72   ){.      int fr
acc0: 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62  ag = pnext - (pb
acd0: 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20  egin+psize);.   
ace0: 20 20 20 69 66 28 20 28 66 72 61 67 3c 30 29 20     if( (frag<0) 
acf0: 7c 7c 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61  || (frag>(int)da
ad00: 74 61 5b 68 64 72 2b 37 5d 29 20 29 7b 0a 20 20  ta[hdr+7]) ){.  
ad10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
ad20: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
ad30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ad40: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 28  data[hdr+7] -= (
ad50: 75 38 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78  u8)frag;.      x
ad60: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
ad70: 61 5b 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20  a[pnext]);.     
ad80: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
ad90: 70 62 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20  pbegin], x);.   
ada0: 20 20 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67     x = pnext + g
adb0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
adc0: 65 78 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e  ext+2]) - pbegin
add0: 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65  ;.      put2byte
ade0: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
adf0: 2c 20 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , x);.    }else{
ae00: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 62  .      addr = pb
ae10: 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  egin;.    }.  }.
ae20: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c  .  /* If the cel
ae30: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62  l content area b
ae40: 65 67 69 6e 73 20 77 69 74 68 20 61 20 66 72 65  egins with a fre
ae50: 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69  eblock, remove i
ae60: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61  t. */.  if( data
ae70: 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64  [hdr+1]==data[hd
ae80: 72 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72  r+5] && data[hdr
ae90: 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d  +2]==data[hdr+6]
aea0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b   ){.    int top;
aeb0: 0a 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65  .    pbegin = ge
aec0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
aed0: 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  +1]);.    memcpy
aee0: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26  (&data[hdr+1], &
aef0: 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29  data[pbegin], 2)
af00: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
af10: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
af20: 5d 29 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  ]) + get2byte(&d
af30: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
af40: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
af50: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
af60: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
af70: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
af80: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
af90: 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
afa0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
afb0: 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68  ./*.** Decode th
afc0: 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68  e flags byte (th
afd0: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
afe0: 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20  the header) for 
aff0: 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e  a page.** and in
b000: 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20  itialize fields 
b010: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73  of the MemPage s
b020: 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69  tructure accordi
b030: 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ngly..**.** Only
b040: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
b050: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20  ombinations are 
b060: 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74  supported.  Anyt
b070: 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a  hing different.*
b080: 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f  * indicates a co
b090: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
b0a0: 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iles:.**.**     
b0b0: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
b0c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
b0d0: 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c  ZERODATA | PTF_L
b0e0: 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  EAF.**         P
b0f0: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
b100: 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20  F_INTKEY.**     
b110: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
b120: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20   | PTF_INTKEY | 
b130: 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74  PTF_LEAF.*/.stat
b140: 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61  ic int decodeFla
b150: 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  gs(MemPage *pPag
b160: 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29  e, int flagByte)
b170: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
b180: 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  t;     /* A copy
b190: 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a   of pPage->pBt *
b1a0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
b1b0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28  ge->hdrOffset==(
b1c0: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
b1d0: 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61   100 : 0) );.  a
b1e0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
b1f0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
b200: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
b210: 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20    pPage->leaf = 
b220: 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33  (u8)(flagByte>>3
b230: 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f  );  assert( PTF_
b240: 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a  LEAF == 1<<3 );.
b250: 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50    flagByte &= ~P
b260: 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65  TF_LEAF;.  pPage
b270: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d  ->childPtrSize =
b280: 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   4-4*pPage->leaf
b290: 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
b2a0: 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67  >pBt;.  if( flag
b2b0: 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44  Byte==(PTF_LEAFD
b2c0: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
b2d0: 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) ){.    pPage->
b2e0: 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  intKey = 1;.    
b2f0: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d  pPage->hasData =
b300: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20   pPage->leaf;.  
b310: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
b320: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  l = pBt->maxLeaf
b330: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
b340: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
b350: 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Leaf;.  }else if
b360: 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f  ( flagByte==PTF_
b370: 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20  ZERODATA ){.    
b380: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
b390: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61  0;.    pPage->ha
b3a0: 73 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70  sData = 0;.    p
b3b0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
b3c0: 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a   pBt->maxLocal;.
b3d0: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
b3e0: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f  cal = pBt->minLo
b3f0: 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  cal;.  }else{.  
b400: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b410: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
b420: 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31 62  }.  pPage->max1b
b430: 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42 74  ytePayload = pBt
b440: 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
b450: 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
b460: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
b470: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61  Initialize the a
b480: 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61  uxiliary informa
b490: 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20  tion for a disk 
b4a0: 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  block..**.** Ret
b4b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
b4c0: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65   success.  If we
b4d0: 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61   see that the pa
b4e0: 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63  ge does.** not c
b4f0: 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f  ontain a well-fo
b500: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
b510: 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  ge, then return 
b520: 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  .** SQLITE_CORRU
b530: 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61  PT.  Note that a
b540: 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54   return of SQLIT
b550: 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  E_OK does not.**
b560: 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
b570: 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c  the page is well
b580: 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c  -formed.  It onl
b590: 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20  y shows that.** 
b5a0: 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74  we failed to det
b5b0: 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69  ect any corrupti
b5c0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
b5d0: 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  t btreeInitPage(
b5e0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
b5f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
b600: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
b610: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
b620: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
b630: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
b640: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b650: 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61  >pgno==sqlite3Pa
b660: 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
b670: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
b680: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b690: 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   == sqlite3Pager
b6a0: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
b6b0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
b6c0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
b6d0: 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ta == sqlite3Pag
b6e0: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
b6f0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
b700: 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e  if( !pPage->isIn
b710: 69 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63  it ){.    u16 pc
b720: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
b730: 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65  Address of a fre
b740: 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50  eblock within pP
b750: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a  age->aData[] */.
b760: 20 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20      u8 hdr;     
b770: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
b780: 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66   to beginning of
b790: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
b7a0: 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20      u8 *data;   
b7b0: 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20         /* Equal 
b7c0: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  to pPage->aData 
b7d0: 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  */.    BtShared 
b7e0: 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  *pBt;        /* 
b7f0: 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73  The main btree s
b800: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
b810: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
b820: 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
b830: 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20  usable space on 
b840: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20  each page */.   
b850: 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b   u16 cellOffset;
b860: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72      /* Offset fr
b870: 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65  om start of page
b880: 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70   to first cell p
b890: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  ointer */.    in
b8a0: 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
b8b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
b8c0: 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68  used bytes on th
b8d0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e  e page */.    in
b8e0: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
b8f0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
b900: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
b910: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69  nt area */.    i
b920: 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20  nt iCellFirst;  
b930: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
b940: 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  able cell or fre
b950: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
b960: 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  .    int iCellLa
b970: 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20  st;     /* Last 
b980: 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72  possible cell or
b990: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
b9a0: 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20  t */..    pBt = 
b9b0: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20  pPage->pBt;..   
b9c0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
b9d0: 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74  rOffset;.    dat
b9e0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
b9f0: 3b 0a 20 20 20 20 69 66 28 20 64 65 63 6f 64 65  ;.    if( decode
ba00: 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74  Flags(pPage, dat
ba10: 61 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e  a[hdr]) ) return
ba20: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
ba30: 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74  BKPT;.    assert
ba40: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ( pBt->pageSize>
ba50: 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67  =512 && pBt->pag
ba60: 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a  eSize<=65536 );.
ba70: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50      pPage->maskP
ba80: 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  age = (u16)(pBt-
ba90: 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a  >pageSize - 1);.
baa0: 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72      pPage->nOver
bab0: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73  flow = 0;.    us
bac0: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
bad0: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
bae0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
baf0: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  t = cellOffset =
bb00: 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
bb10: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70  age->leaf;.    p
bb20: 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d  Page->aDataEnd =
bb30: 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69 7a   &data[usableSiz
bb40: 65 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  e];.    pPage->a
bb50: 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
bb60: 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 20  cellOffset];.   
bb70: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
bb80: 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
bb90: 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  +5]);.    pPage-
bba0: 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74  >nCell = get2byt
bbb0: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
bbc0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
bbd0: 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42  nCell>MX_CELL(pB
bbe0: 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  t) ){.      /* T
bbf0: 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72  o many cells for
bc00: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20   a single page. 
bc10: 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62   The page must b
bc20: 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20  e corrupt */.   
bc30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bc40: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
bc50: 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73     }.    testcas
bc60: 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  e( pPage->nCell=
bc70: 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b  =MX_CELL(pBt) );
bc80: 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f  ..    /* A malfo
bc90: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
bca0: 67 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 75  ge might cause u
bcb0: 73 20 74 6f 20 72 65 61 64 20 70 61 73 74 20 74  s to read past t
bcc0: 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66  he end.    ** of
bcd0: 20 70 61 67 65 20 77 68 65 6e 20 70 61 72 73 69   page when parsi
bce0: 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20  ng a cell.  .   
bcf0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   **.    ** The f
bd00: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f  ollowing block o
bd10: 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61  f code checks ea
bd20: 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61 20  rly to see if a 
bd30: 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 20  cell extends.   
bd40: 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64   ** past the end
bd50: 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64   of a page bound
bd60: 61 72 79 20 61 6e 64 20 63 61 75 73 65 73 20 53  ary and causes S
bd70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f  QLITE_CORRUPT to
bd80: 20 62 65 20 0a 20 20 20 20 2a 2a 20 72 65 74 75   be .    ** retu
bd90: 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e  rned if it does.
bda0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c  .    */.    iCel
bdb0: 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66  lFirst = cellOff
bdc0: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
bdd0: 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c  Cell;.    iCellL
bde0: 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ast = usableSize
bdf0: 20 2d 20 34 3b 0a 23 69 66 20 64 65 66 69 6e 65   - 4;.#if define
be00: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
be10: 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
be20: 45 43 4b 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  ECK).    {.     
be30: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
be40: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f     /* Index into
be50: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
be60: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20  r array */.     
be70: 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20   int sz;        
be80: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20     /* Size of a 
be90: 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69  cell */..      i
bea0: 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
beb0: 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20  ) iCellLast--;. 
bec0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
bed0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  pPage->nCell; i+
bee0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20 3d  +){.        pc =
bef0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
bf00: 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29  cellOffset+i*2])
bf10: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
bf20: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72  se( pc==iCellFir
bf30: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  st );.        te
bf40: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
bf50: 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20 20  lLast );.       
bf60: 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
bf70: 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
bf80: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
bf90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
bfa0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
bfb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 7a      }.        sz
bfc0: 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
bfd0: 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29  Page, &data[pc])
bfe0: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
bff0: 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c  se( pc+sz==usabl
c000: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
c010: 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c   if( pc+sz>usabl
c020: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
c030: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c040: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
c050: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
c060: 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
c070: 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c  e->leaf ) iCellL
c080: 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a 23  ast++;.    }  .#
c090: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f  endif..    /* Co
c0a0: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
c0b0: 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68  free space on th
c0c0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 70 63  e page */.    pc
c0d0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
c0e0: 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e  a[hdr+1]);.    n
c0f0: 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b  Free = data[hdr+
c100: 37 5d 20 2b 20 74 6f 70 3b 0a 20 20 20 20 77 68  7] + top;.    wh
c110: 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20  ile( pc>0 ){.   
c120: 20 20 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a     u16 next, siz
c130: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c  e;.      if( pc<
c140: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
c150: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
c160: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
c170: 66 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20  f free block is 
c180: 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a  off the page */.
c190: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
c1a0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c1b0: 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  PT; .      }.   
c1c0: 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79     next = get2by
c1d0: 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  te(&data[pc]);. 
c1e0: 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32       size = get2
c1f0: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
c200: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6e 65  );.      if( (ne
c210: 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63  xt>0 && next<=pc
c220: 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70 63 2b 73  +size+3) || pc+s
c230: 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ize>usableSize )
c240: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65  {.        /* Fre
c250: 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65  e blocks must be
c260: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
c270: 64 65 72 2e 20 41 6e 64 20 74 68 65 20 6c 61 73  der. And the las
c280: 74 20 62 79 74 65 20 6f 66 0a 20 20 20 20 20 20  t byte of.      
c290: 20 20 2a 2a 20 74 68 65 20 66 72 65 65 2d 62 6c    ** the free-bl
c2a0: 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20 6f 6e 20  ock must lie on 
c2b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67  the database pag
c2c0: 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  e.  */.        r
c2d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c2e0: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
c2f0: 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20    }.      nFree 
c300: 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a  = nFree + size;.
c310: 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b        pc = next;
c320: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
c330: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46  t this point, nF
c340: 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ree contains the
c350: 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73   sum of the offs
c360: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a  et to the start.
c370: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65      ** of the ce
c380: 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll-content area 
c390: 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20  plus the number 
c3a0: 6f 66 20 66 72 65 65 20 62 79 74 65 73 20 77 69  of free bytes wi
c3b0: 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  thin.    ** the 
c3c0: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
c3d0: 61 2e 20 49 66 20 74 68 69 73 20 69 73 20 67 72  a. If this is gr
c3e0: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 75  eater than the u
c3f0: 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a  sable-size.    *
c400: 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74  * of the page, t
c410: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73  hen the page mus
c420: 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  t be corrupted. 
c430: 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a  This check also.
c440: 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f      ** serves to
c450: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
c460: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
c470: 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tart of the cell
c480: 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20  -content.    ** 
c490: 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20  area, according 
c4a0: 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64  to the page head
c4b0: 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20  er, lies within 
c4c0: 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  the page..    */
c4d0: 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 3e 75  .    if( nFree>u
c4e0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
c4f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c500: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
c510: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d      }.    pPage-
c520: 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e  >nFree = (u16)(n
c530: 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73  Free - iCellFirs
c540: 74 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69  t);.    pPage->i
c550: 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20  sInit = 1;.  }. 
c560: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c570: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
c580: 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f  up a raw page so
c590: 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c   that it looks l
c5a0: 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70  ike a database p
c5b0: 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e  age holding.** n
c5c0: 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  o entries..*/.st
c5d0: 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61  atic void zeroPa
c5e0: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
c5f0: 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
c600: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
c610: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
c620: 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ata;.  BtShared 
c630: 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
c640: 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50  t;.  u8 hdr = pP
c650: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
c660: 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20    u16 first;..  
c670: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
c680: 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
c690: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
c6a0: 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20  pPage->pgno );. 
c6b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c6c0: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
c6d0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
c6e0: 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
c6f0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c700: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
c710: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
c720: 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65  = data );.  asse
c730: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
c740: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
c750: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
c760: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c770: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
c780: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
c790: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
c7a0: 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
c7b0: 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  TE ){.    memset
c7c0: 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20  (&data[hdr], 0, 
c7d0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
c7e0: 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61  - hdr);.  }.  da
c7f0: 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29  ta[hdr] = (char)
c800: 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d  flags;.  first =
c810: 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28 66   hdr + 8 + 4*((f
c820: 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d  lags&PTF_LEAF)==
c830: 30 20 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d 73 65  0 ?1:0);.  memse
c840: 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  t(&data[hdr+1], 
c850: 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64  0, 4);.  data[hd
c860: 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32  r+7] = 0;.  put2
c870: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
c880: 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ], pBt->usableSi
c890: 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ze);.  pPage->nF
c8a0: 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  ree = (u16)(pBt-
c8b0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69  >usableSize - fi
c8c0: 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c  rst);.  decodeFl
c8d0: 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73  ags(pPage, flags
c8e0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  );.  pPage->hdrO
c8f0: 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70  ffset = hdr;.  p
c900: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
c910: 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67   = first;.  pPag
c920: 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64  e->aDataEnd = &d
c930: 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53  ata[pBt->usableS
c940: 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61  ize];.  pPage->a
c950: 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
c960: 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d  first];.  pPage-
c970: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
c980: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
c990: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
c9a0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36  pBt->pageSize<=6
c9b0: 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d  5536 );.  pPage-
c9c0: 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36  >maskPage = (u16
c9d0: 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
c9e0: 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  - 1);.  pPage->n
c9f0: 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  Cell = 0;.  pPag
ca00: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d  e->isInit = 1;.}
ca10: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  .../*.** Convert
ca20: 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e   a DbPage obtain
ca30: 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ed from the page
ca40: 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65  r into a MemPage
ca50: 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20   used by.** the 
ca60: 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a  btree layer..*/.
ca70: 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
ca80: 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
ca90: 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  age(DbPage *pDbP
caa0: 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  age, Pgno pgno, 
cab0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
cac0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
cad0: 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c   = (MemPage*)sql
cae0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
caf0: 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50  a(pDbPage);.  pP
cb00: 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c  age->aData = sql
cb10: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
cb20: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61  (pDbPage);.  pPa
cb30: 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44  ge->pDbPage = pD
cb40: 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e  bPage;.  pPage->
cb50: 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61  pBt = pBt;.  pPa
cb60: 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  ge->pgno = pgno;
cb70: 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  .  pPage->hdrOff
cb80: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  set = pPage->pgn
cb90: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a  o==1 ? 100 : 0;.
cba0: 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20    return pPage; 
cbb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
cbc0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
cbd0: 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65  ger.  Initialize
cbe0: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
cbf0: 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
cc00: 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
cc10: 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  f needed..**.** 
cc20: 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74  If the noContent
cc30: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74   flag is set, it
cc40: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
cc50: 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
cc60: 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  .** the content 
cc70: 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
cc80: 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f  his time.  So do
cc90: 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64   not go to the d
cca0: 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20  isk.** to fetch 
ccb0: 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75  the content.  Ju
ccc0: 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63  st fill in the c
ccd0: 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f  ontent with zero
cce0: 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66  s for now..** If
ccf0: 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77   in the future w
cd00: 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  e call sqlite3Pa
cd10: 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68  gerWrite() on th
cd20: 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a  is page, that.**
cd30: 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73   means we have s
cd40: 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e  tarted to be con
cd50: 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e  cerned about con
cd60: 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73  tent and the dis
cd70: 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64  k.** read should
cd80: 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70   occur at that p
cd90: 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oint..*/.static 
cda0: 69 6e 74 20 62 74 72 65 65 47 65 74 50 61 67 65  int btreeGetPage
cdb0: 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
cdc0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
cdd0: 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
cde0: 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
cdf0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
ce00: 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
ce10: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
ce20: 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
ce30: 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
ce40: 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
ce50: 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74  .  int noContent
ce60: 2c 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  ,       /* Do no
ce70: 74 20 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74  t load page cont
ce80: 65 6e 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 20  ent if true */. 
ce90: 20 69 6e 74 20 62 52 65 61 64 6f 6e 6c 79 20 20   int bReadonly  
cea0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
ceb0: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d   a read-only (mm
cec0: 61 70 29 20 70 61 67 65 20 69 73 20 6f 6b 20 2a  ap) page is ok *
ced0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
cee0: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
cef0: 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  ;.  int flags = 
cf00: 28 6e 6f 43 6f 6e 74 65 6e 74 20 3f 20 50 41 47  (noContent ? PAG
cf10: 45 52 5f 41 43 51 55 49 52 45 5f 4e 4f 43 4f 4e  ER_ACQUIRE_NOCON
cf20: 54 45 4e 54 20 3a 20 30 29 20 0a 20 20 20 20 20  TENT : 0) .     
cf30: 20 20 20 20 20 20 20 7c 20 28 62 52 65 61 64 6f         | (bReado
cf40: 6e 6c 79 20 3f 20 50 41 47 45 52 5f 41 43 51 55  nly ? PAGER_ACQU
cf50: 49 52 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30  IRE_READONLY : 0
cf60: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 6f  );..  assert( no
cf70: 43 6f 6e 74 65 6e 74 3d 3d 30 20 7c 7c 20 62 52  Content==0 || bR
cf80: 65 61 64 6f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20  eadonly==0 );.  
cf90: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
cfa0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
cfb0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
cfc0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
cfd0: 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72  uire(pBt->pPager
cfe0: 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
cff0: 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67  *)&pDbPage, flag
d000: 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  s);.  if( rc ) r
d010: 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50  eturn rc;.  *ppP
d020: 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46  age = btreePageF
d030: 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
d040: 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
d050: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d060: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  K;.}../*.** Retr
d070: 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  ieve a page from
d080: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
d090: 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
d0a0: 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a  ed page is not.*
d0b0: 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
d0c0: 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74   pager cache ret
d0d0: 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61  urn NULL. Initia
d0e0: 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
d0f0: 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
d100: 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
d110: 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f  ts if needed..*/
d120: 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
d130: 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70  *btreePageLookup
d140: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
d150: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62  Pgno pgno){.  Db
d160: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
d170: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d180: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
d190: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62  >mutex) );.  pDb
d1a0: 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
d1b0: 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  gerLookup(pBt->p
d1c0: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
d1d0: 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20  if( pDbPage ){. 
d1e0: 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
d1f0: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
d200: 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
d210: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
d220: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
d230: 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
d240: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
d250: 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68   in pages. If th
d260: 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
d270: 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74  of.** error, ret
d280: 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69  urn ((unsigned i
d290: 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69  nt)-1)..*/.stati
d2a0: 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65  c Pgno btreePage
d2b0: 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a  count(BtShared *
d2c0: 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pBt){.  return p
d2d0: 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32  Bt->nPage;.}.u32
d2e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
d2f0: 74 50 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b  tPage(Btree *p){
d300: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d310: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
d320: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
d330: 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67  ( ((p->pBt->nPag
d340: 65 29 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30  e)&0x8000000)==0
d350: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 69 6e   );.  return (in
d360: 74 29 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  t)btreePagecount
d370: 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a  (p->pBt);.}../*.
d380: 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
d390: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64  om the pager and
d3a0: 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20   initialize it. 
d3b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
d3c0: 20 6a 75 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65   just a.** conve
d3d0: 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72 20 61  nience wrapper a
d3e0: 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65 20 63  round separate c
d3f0: 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 47 65 74  alls to btreeGet
d400: 50 61 67 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62  Page() and .** b
d410: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a  treeInitPage()..
d420: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
d430: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74  r occurs, then t
d440: 68 65 20 76 61 6c 75 65 20 2a 70 70 50 61 67 65  he value *ppPage
d450: 20 69 73 20 73 65 74 20 74 6f 20 69 73 20 75 6e   is set to is un
d460: 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d  defined. It.** m
d470: 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e  ay remain unchan
d480: 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62  ged, or it may b
d490: 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61  e set to an inva
d4a0: 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  lid value..*/.st
d4b0: 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49  atic int getAndI
d4c0: 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  nitPage(.  BtSha
d4d0: 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
d4e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
d4f0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
d500: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
d510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d520: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
d530: 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65  f the page to ge
d540: 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
d550: 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
d560: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
d570: 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72  the page pointer
d580: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62   here */.  int b
d590: 52 65 61 64 6f 6e 6c 79 20 20 20 20 20 20 20 20  Readonly        
d5a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
d5b0: 75 65 20 69 66 20 61 20 72 65 61 64 2d 6f 6e 6c  ue if a read-onl
d5c0: 79 20 28 6d 6d 61 70 29 20 70 61 67 65 20 69 73  y (mmap) page is
d5d0: 20 6f 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20   ok */.){.  int 
d5e0: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
d5f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d600: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
d610: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65  .  if( pgno>btre
d620: 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
d630: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
d640: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d650: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
d660: 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
d670: 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67  pBt, pgno, ppPag
d680: 65 2c 20 30 2c 20 62 52 65 61 64 6f 6e 6c 79 29  e, 0, bReadonly)
d690: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
d6a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
d6b0: 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
d6c0: 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
d6d0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
d6e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
d6f0: 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
d700: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
d710: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 74 65 73 74     }.  }..  test
d720: 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b  case( pgno==0 );
d730: 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
d740: 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
d750: 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65  _CORRUPT );.  re
d760: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
d770: 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50  * Release a MemP
d780: 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  age.  This shoul
d790: 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  d be called once
d7a0: 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a   for each prior.
d7b0: 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
d7c0: 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  GetPage..*/.stat
d7d0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
d7e0: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
d7f0: 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  ge){.  if( pPage
d800: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d810: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
d820: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
d830: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73  e->pBt );.    as
d840: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
d850: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
d860: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
d870: 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
d880: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d890: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
d8a0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
d8b0: 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
d8c0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
d8d0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
d8e0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
d8f0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
d900: 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d  agerUnref(pPage-
d910: 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d  >pDbPage);.  }.}
d920: 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61  ../*.** During a
d930: 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20   rollback, when 
d940: 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64  the pager reload
d950: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  s information in
d960: 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20  to the cache.** 
d970: 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68  so that the cach
d980: 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f  e is restored to
d990: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
d9a0: 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ate at the start
d9b0: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73   of.** the trans
d9c0: 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68  action, for each
d9d0: 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74   page restored t
d9e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
d9f0: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
da00: 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20  s routine needs 
da10: 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74  to reset the ext
da20: 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20  ra data section 
da30: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
da40: 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72  e.** page to agr
da50: 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ee with the rest
da60: 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74  ored data..*/.st
da70: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65  atic void pageRe
da80: 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44 61  init(DbPage *pDa
da90: 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ta){.  MemPage *
daa0: 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d  pPage;.  pPage =
dab0: 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69   (MemPage *)sqli
dac0: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
dad0: 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72  (pData);.  asser
dae0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  t( sqlite3PagerP
daf0: 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74  ageRefcount(pDat
db00: 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50  a)>0 );.  if( pP
db10: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
db20: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
db30: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
db40: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
db50: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   );.    pPage->i
db60: 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69  sInit = 0;.    i
db70: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
db80: 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74  ageRefcount(pDat
db90: 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  a)>1 ){.      /*
dba0: 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74   pPage might not
dbb0: 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65   be a btree page
dbc0: 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  ;  it might be a
dbd0: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  n overflow page.
dbe0: 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d        ** or ptrm
dbf0: 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72 65  ap page or a fre
dc00: 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73  e page.  In thos
dc10: 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c  e cases, the fol
dc20: 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  lowing.      ** 
dc30: 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69  call to btreeIni
dc40: 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b  tPage() will lik
dc50: 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ely return SQLIT
dc60: 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20  E_CORRUPT..     
dc70: 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20   ** But no harm 
dc80: 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e  is done by this.
dc90: 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79    And it is very
dca0: 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a   important that.
dcb0: 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e        ** btreeIn
dcc0: 69 74 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c  itPage() be call
dcd0: 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65  ed on every btre
dce0: 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b  e page so we mak
dcf0: 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  e.      ** the c
dd00: 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61  all for every pa
dd10: 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e  ge that comes in
dd20: 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e   for re-initing.
dd30: 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49   */.      btreeI
dd40: 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
dd50: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
dd60: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** Invoke the bu
dd70: 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61  sy handler for a
dd80: 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69   btree..*/.stati
dd90: 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b  c int btreeInvok
dda0: 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69  eBusyHandler(voi
ddb0: 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68  d *pArg){.  BtSh
ddc0: 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53  ared *pBt = (BtS
ddd0: 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61  hared*)pArg;.  a
dde0: 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29  ssert( pBt->db )
ddf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
de00: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
de10: 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  Bt->db->mutex) )
de20: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
de30: 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
de40: 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75  ler(&pBt->db->bu
de50: 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f  syHandler);.}../
de60: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61  *.** Open a data
de70: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a  base file..** .*
de80: 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74  * zFilename is t
de90: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
dea0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
deb0: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
dec0: 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65  ULL.** then an e
ded0: 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
dee0: 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54  e is created.  T
def0: 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  he ephemeral dat
df00: 61 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62  abase might.** b
df10: 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e  e exclusively in
df20: 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d   memory, or it m
df30: 69 67 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d  ight use a disk-
df40: 62 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63  based memory cac
df50: 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61  he..** Either wa
df60: 79 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  y, the ephemeral
df70: 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62   database will b
df80: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
df90: 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e  deleted .** when
dfa0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
dfb0: 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  se() is called..
dfc0: 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
dfd0: 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
dfe0: 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f   then an in-memo
dff0: 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63  ry database is c
e000: 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69  reated.** that i
e010: 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  s automatically 
e020: 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69  destroyed when i
e030: 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
e040: 2a 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20 70  ** The "flags" p
e050: 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
e060: 74 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74  tmask that might
e070: 20 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69   contain bits li
e080: 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54  ke.** BTREE_OMIT
e090: 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20  _JOURNAL and/or 
e0a0: 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a  BTREE_MEMORY..**
e0b0: 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
e0c0: 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f  ase is already o
e0d0: 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d  pened in the sam
e0e0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
e0f0: 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20  ction.** and we 
e100: 61 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61  are in shared ca
e110: 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  che mode, then t
e120: 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69  he open will fai
e130: 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c  l with an.** SQL
e140: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65  ITE_CONSTRAINT e
e150: 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74  rror.  We cannot
e160: 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f   allow two or mo
e170: 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f  re BtShared.** o
e180: 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61  bjects in the sa
e190: 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
e1a0: 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69  ection since doi
e1b0: 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a  ng so will lead.
e1c0: 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77  ** to problems w
e1d0: 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  ith locking..*/.
e1e0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
e1f0: 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
e200: 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
e210: 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f  /* VFS to use fo
e220: 72 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f  r this b-tree */
e230: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
e240: 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
e250: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  me of the file c
e260: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54  ontaining the BT
e270: 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ree database */.
e280: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
e290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
e2a0: 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
e2b0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72   handle */.  Btr
e2c0: 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20  ee **ppBtree,   
e2d0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
e2e0: 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a  to new Btree obj
e2f0: 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65  ect written here
e300: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
e310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e320: 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   Options */.  in
e330: 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
e340: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
e350: 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
e360: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
e370: 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  en() */.){.  BtS
e380: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20  hared *pBt = 0; 
e390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
e3a0: 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74  hared part of bt
e3b0: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
e3c0: 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20  .  Btree *p;    
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3e0: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72    /* Handle to r
e3f0: 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  eturn */.  sqlit
e400: 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f  e3_mutex *mutexO
e410: 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65  pen = 0;  /* Pre
e420: 76 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e  vents a race con
e430: 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23  dition. Ticket #
e440: 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63  3537 */.  int rc
e450: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
e460: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
e470: 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69  lt code from thi
e480: 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
e490: 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20  u8 nReserve;    
e4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e4b0: 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64  * Byte of unused
e4c0: 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70   space on each p
e4d0: 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
e4e0: 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72  d char zDbHeader
e4f0: 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62  [100];  /* Datab
e500: 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65  ase header conte
e510: 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65  nt */..  /* True
e520: 20 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65   if opening an e
e530: 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72  phemeral, tempor
e540: 61 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ary database */.
e550: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65    const int isTe
e560: 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  mpDb = zFilename
e570: 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65  ==0 || zFilename
e580: 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65  [0]==0;..  /* Se
e590: 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69  t the variable i
e5a0: 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66  sMemdb to true f
e5b0: 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
e5c0: 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20  database, or .  
e5d0: 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66  ** false for a f
e5e0: 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61  ile-based databa
e5f0: 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  se..  */.#ifdef 
e600: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
e610: 52 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74  RYDB.  const int
e620: 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65   isMemdb = 0;.#e
e630: 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  lse.  const int 
e640: 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65  isMemdb = (zFile
e650: 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a  name && strcmp(z
e660: 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f  Filename, ":memo
e670: 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20  ry:")==0).      
e680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e690: 20 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26   || (isTempDb &&
e6a0: 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65   sqlite3TempInMe
e6b0: 6d 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20 20  mory(db)).      
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6d0: 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20   || (vfsFlags & 
e6e0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f  SQLITE_OPEN_MEMO
e6f0: 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a  RY)!=0;.#endif..
e700: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
e710: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66  );.  assert( pVf
e720: 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s!=0 );.  assert
e730: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
e740: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
e750: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  );.  assert( (fl
e760: 61 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73  ags&0xff)==flags
e770: 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66   );   /* flags f
e780: 69 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a  it in 8 bits */.
e790: 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52  .  /* Only a BTR
e7a0: 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61  EE_SINGLE databa
e7b0: 73 65 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f  se can be BTREE_
e7c0: 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61  UNORDERED */.  a
e7d0: 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
e7e0: 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
e7f0: 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==0 || (flags & 
e800: 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30  BTREE_SINGLE)!=0
e810: 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45   );..  /* A BTRE
e820: 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73  E_SINGLE databas
e830: 65 20 69 73 20 61 6c 77 61 79 73 20 61 20 74 65  e is always a te
e840: 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65  mporary and/or e
e850: 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73  phemeral */.  as
e860: 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42  sert( (flags & B
e870: 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20  TREE_SINGLE)==0 
e880: 7c 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a  || isTempDb );..
e890: 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b    if( isMemdb ){
e8a0: 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54  .    flags |= BT
e8b0: 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a  REE_MEMORY;.  }.
e8c0: 20 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20    if( (vfsFlags 
e8d0: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  & SQLITE_OPEN_MA
e8e0: 49 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73  IN_DB)!=0 && (is
e8f0: 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44  Memdb || isTempD
e900: 62 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61  b) ){.    vfsFla
e910: 67 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26  gs = (vfsFlags &
e920: 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   ~SQLITE_OPEN_MA
e930: 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f  IN_DB) | SQLITE_
e940: 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20  OPEN_TEMP_DB;.  
e950: 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d  }.  p = sqlite3M
e960: 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
e970: 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20  (Btree));.  if( 
e980: 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  !p ){.    return
e990: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
e9a0: 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20   }.  p->inTrans 
e9b0: 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
e9c0: 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e  p->db = db;.#ifn
e9d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e9e0: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70  SHARED_CACHE.  p
e9f0: 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20  ->lock.pBtree = 
ea00: 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61  p;.  p->lock.iTa
ea10: 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  ble = 1;.#endif.
ea20: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
ea30: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
ea40: 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
ea50: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
ea60: 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a  DISKIO).  /*.  *
ea70: 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20  * If this Btree 
ea80: 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  is a candidate f
ea90: 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c  or shared cache,
eaa0: 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a   try to find an.
eab0: 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74    ** existing Bt
eac0: 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68  Shared object th
ead0: 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20  at we can share 
eae0: 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20  with.  */.  if( 
eaf0: 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28  isTempDb==0 && (
eb00: 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76  isMemdb==0 || (v
eb10: 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
eb20: 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a  PEN_URI)!=0) ){.
eb30: 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67 73      if( vfsFlags
eb40: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53   & SQLITE_OPEN_S
eb50: 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20  HAREDCACHE ){.  
eb60: 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74      int nFullPat
eb70: 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
eb80: 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
eb90: 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
eba0: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
ebb0: 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e  alloc(nFullPathn
ebc0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 4d 55 54 45  ame);.      MUTE
ebd0: 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
ebe0: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
ebf0: 72 65 64 3b 20 29 0a 20 20 20 20 20 20 70 2d 3e  red; ).      p->
ec00: 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
ec10: 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61      if( !zFullPa
ec20: 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
ec30: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
ec40: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
ec50: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
ec60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
ec70: 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20  ( isMemdb ){.   
ec80: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c       memcpy(zFul
ec90: 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65  lPathname, zFile
eca0: 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72  name, sqlite3Str
ecb0: 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
ecc0: 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
ecd0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
ece0: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
ecf0: 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
ed00: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
ed10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed20: 20 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61           nFullPa
ed30: 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74  thname, zFullPat
ed40: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
ed50: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
ed60: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ed70: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
ed80: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ed90: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
eda0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
edb0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
edc0: 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48   }.#if SQLITE_TH
edd0: 52 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d  READSAFE.      m
ede0: 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74  utexOpen = sqlit
edf0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
ee00: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
ee10: 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71  _OPEN);.      sq
ee20: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
ee30: 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  r(mutexOpen);.  
ee40: 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20      mutexShared 
ee50: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
ee60: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
ee70: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
ee80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
ee90: 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
eea0: 53 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a  Shared);.#endif.
eeb0: 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c        for(pBt=GL
eec0: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
eed0: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
eee0: 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74  eList); pBt; pBt
eef0: 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  =pBt->pNext){.  
ef00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
ef10: 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  t->nRef>0 );.   
ef20: 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63       if( 0==strc
ef30: 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  mp(zFullPathname
ef40: 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  , sqlite3PagerFi
ef50: 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67  lename(pBt->pPag
ef60: 65 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20  er, 0)).        
ef70: 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
ef80: 74 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d  te3PagerVfs(pBt-
ef90: 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29  >pPager)==pVfs )
efa0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
efb0: 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66  iDb;.          f
efc0: 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31  or(iDb=db->nDb-1
efd0: 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29  ; iDb>=0; iDb--)
efe0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 74  {.            Bt
eff0: 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d  ree *pExisting =
f000: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
f010: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  t;.            i
f020: 66 28 20 70 45 78 69 73 74 69 6e 67 20 26 26 20  f( pExisting && 
f030: 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d  pExisting->pBt==
f040: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
f050: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
f060: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
f070: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20  ared);.         
f080: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
f090: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70  ex_leave(mutexOp
f0a0: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  en);.           
f0b0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
f0c0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
f0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
f0e0: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
f0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
f100: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  urn SQLITE_CONST
f110: 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20  RAINT;.         
f120: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
f130: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42  .          p->pB
f140: 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20  t = pBt;.       
f150: 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a     pBt->nRef++;.
f160: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
f170: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f180: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
f190: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
f1a0: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
f1b0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
f1c0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
f1d0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
f1e0: 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65  E_DEBUG.    else
f1f0: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65  {.      /* In de
f200: 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72  bug mode, we mar
f210: 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74  k all persistent
f220: 20 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68   databases as sh
f230: 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20  arable.      ** 
f240: 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61  even when they a
f250: 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78  re not.  This ex
f260: 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b  ercises the lock
f270: 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20  ing code and.   
f280: 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65     ** gives more
f290: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72   opportunity for
f2a0: 20 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33   asserts(sqlite3
f2b0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20  _mutex_held()). 
f2c0: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
f2d0: 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69  ts to find locki
f2e0: 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20  ng problems..   
f2f0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73     */.      p->s
f300: 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
f310: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65   }.#endif.  }.#e
f320: 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d  ndif.  if( pBt==
f330: 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  0 ){.    /*.    
f340: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
f350: 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75   asserts make su
f360: 72 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72  re that structur
f370: 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62  es used by the b
f380: 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  tree are.    ** 
f390: 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20  the right size. 
f3a0: 20 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72   This is to guar
f3b0: 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63  d against size c
f3c0: 68 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75  hanges that resu
f3d0: 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63  lt.    ** when c
f3e0: 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69  ompiling on a di
f3f0: 66 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63  fferent architec
f400: 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ture..    */.   
f410: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
f420: 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f  i64)==8 || sizeo
f430: 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20  f(i64)==4 );.   
f440: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
f450: 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f  u64)==8 || sizeo
f460: 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20  f(u64)==4 );.   
f470: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
f480: 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u32)==4 );.    a
f490: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31  ssert( sizeof(u1
f4a0: 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73  6)==2 );.    ass
f4b0: 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f  ert( sizeof(Pgno
f4c0: 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70  )==4 );.  .    p
f4d0: 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  Bt = sqlite3Mall
f4e0: 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
f4f0: 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  pBt) );.    if( 
f500: 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
f510: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
f520: 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  M;.      goto bt
f530: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
f540: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
f550: 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56  ite3PagerOpen(pV
f560: 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72  fs, &pBt->pPager
f570: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
f580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f590: 20 20 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a         EXTRA_SIZ
f5a0: 45 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61  E, flags, vfsFla
f5b0: 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b  gs, pageReinit);
f5c0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
f5d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f5e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
f5f0: 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
f600: 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65  pBt->pPager,size
f610: 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44  of(zDbHeader),zD
f620: 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a  bHeader);.    }.
f630: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
f640: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
f650: 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
f660: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ut;.    }.    pB
f670: 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28  t->openFlags = (
f680: 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42  u8)flags;.    pB
f690: 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  t->db = db;.    
f6a0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
f6b0: 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e  usyhandler(pBt->
f6c0: 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76  pPager, btreeInv
f6d0: 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20  okeBusyHandler, 
f6e0: 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74  pBt);.    p->pBt
f6f0: 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70   = pBt;.  .    p
f700: 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b  Bt->pCursor = 0;
f710: 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
f720: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
f730: 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
f740: 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72  only(pBt->pPager
f750: 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ) ) pBt->btsFlag
f760: 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
f770: 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  LY;.#ifdef SQLIT
f780: 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
f790: 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
f7a0: 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f  s |= BTS_SECURE_
f7b0: 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20  DELETE;.#endif. 
f7c0: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
f7d0: 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36   = (zDbHeader[16
f7e0: 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64  ]<<8) | (zDbHead
f7f0: 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20  er[17]<<16);.   
f800: 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
f810: 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70  ze<512 || pBt->p
f820: 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
f830: 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20  AX_PAGE_SIZE.   
f840: 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e        || ((pBt->
f850: 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d  pageSize-1)&pBt-
f860: 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b  >pageSize)!=0 ){
f870: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
f880: 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Size = 0;.#ifnde
f890: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
f8a0: 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
f8b0: 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e  * If the magic n
f8c0: 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77  ame ":memory:" w
f8d0: 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e  ill create an in
f8e0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
f8f0: 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
f900: 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61  leave the autoVa
f910: 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28  cuum mode at 0 (
f920: 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75  do not auto-vacu
f930: 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20  um), even if.   
f940: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46     ** SQLITE_DEF
f950: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
f960: 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20  is true. On the 
f970: 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20  other hand, if. 
f980: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f       ** SQLITE_O
f990: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73  MIT_MEMORYDB has
f9a0: 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74   been defined, t
f9b0: 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69  hen ":memory:" i
f9c0: 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a  s just a.      *
f9d0: 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e  * regular file-n
f9e0: 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
f9f0: 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  e the auto-vacuu
fa00: 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72  m applies as per
fa10: 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a   normal..      *
fa20: 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c  /.      if( zFil
fa30: 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64  ename && !isMemd
fa40: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  b ){.        pBt
fa50: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
fa60: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
fa70: 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20  UTOVACUUM ? 1 : 
fa80: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  0);.        pBt-
fa90: 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53  >incrVacuum = (S
faa0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
fab0: 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20  TOVACUUM==2 ? 1 
fac0: 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  : 0);.      }.#e
fad0: 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65  ndif.      nRese
fae0: 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rve = 0;.    }el
faf0: 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65 72  se{.      nReser
fb00: 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32  ve = zDbHeader[2
fb10: 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62  0];.      pBt->b
fb20: 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
fb30: 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23  AGESIZE_FIXED;.#
fb40: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fb50: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
fb60: 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
fb70: 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
fb80: 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
fb90: 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
fba0: 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
fbb0: 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
fbc0: 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a  DbHeader[36 + 7*
fbd0: 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
fbe0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
fbf0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
fc00: 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
fc10: 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
fc20: 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a  ize, nReserve);.
fc30: 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
fc40: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
fc50: 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  ;.    pBt->usabl
fc60: 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
fc70: 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65  eSize - nReserve
fc80: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
fc90: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37  Bt->pageSize & 7
fca0: 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79  )==0 );  /* 8-by
fcb0: 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  te alignment of 
fcc0: 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a  pageSize */.   .
fcd0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
fce0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
fcf0: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
fd00: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
fd10: 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64  ISKIO).    /* Ad
fd20: 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72  d the new BtShar
fd30: 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  ed object to the
fd40: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61   linked list sha
fd50: 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e  rable BtShareds.
fd60: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
fd70: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
fd80: 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43       MUTEX_LOGIC
fd90: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
fda0: 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a  *mutexShared; ).
fdb0: 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20        pBt->nRef 
fdc0: 3d 20 31 3b 0a 20 20 20 20 20 20 4d 55 54 45 58  = 1;.      MUTEX
fdd0: 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68 61  _LOGIC( mutexSha
fde0: 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  red = sqlite3Mut
fdf0: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
fe00: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
fe10: 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28 20  ER);).      if( 
fe20: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
fe30: 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62  E && sqlite3Glob
fe40: 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
fe50: 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70  tex ){.        p
fe60: 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  Bt->mutex = sqli
fe70: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
fe80: 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29  LITE_MUTEX_FAST)
fe90: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42  ;.        if( pB
fea0: 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  t->mutex==0 ){. 
feb0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
fec0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
fed0: 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
fee0: 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  Failed = 0;.    
fef0: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
ff00: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20  _open_out;.     
ff10: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ff20: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
ff30: 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
ff40: 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ed);.      pBt->
ff50: 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42  pNext = GLOBAL(B
ff60: 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
ff70: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
ff80: 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42  ;.      GLOBAL(B
ff90: 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
ffa0: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
ffb0: 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71   = pBt;.      sq
ffc0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
ffd0: 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
ffe0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
fff0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
10000 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
10010 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
10020 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
10030 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66  _DISKIO).  /* If
10040 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75   the new Btree u
10050 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70  ses a sharable p
10060 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c  BtShared, then l
10070 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a  ink the new.  **
10080 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20   Btree into the 
10090 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72  list of all shar
100a0 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20  able Btrees for 
100b0 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74  the same connect
100c0 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69  ion..  ** The li
100d0 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73  st is kept in as
100e0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79  cending order by
100f0 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20   pBt address..  
10100 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72  */.  if( p->shar
10110 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  able ){.    int 
10120 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53  i;.    Btree *pS
10130 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ib;.    for(i=0;
10140 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
10150 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69  {.      if( (pSi
10160 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  b = db->aDb[i].p
10170 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e  Bt)!=0 && pSib->
10180 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
10190 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
101a0 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d  >pPrev ){ pSib =
101b0 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a   pSib->pPrev; }.
101c0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
101d0 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a  Bt<pSib->pBt ){.
101e0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
101f0 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  xt = pSib;.     
10200 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20       p->pPrev = 
10210 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69  0;.          pSi
10220 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  b->pPrev = p;.  
10230 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10240 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
10250 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69  ib->pNext && pSi
10260 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d  b->pNext->pBt<p-
10270 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
10280 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d      pSib = pSib-
10290 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
102a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
102b0 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70  >pNext = pSib->p
102c0 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
102d0 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b  p->pPrev = pSib;
102e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
102f0 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
10300 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d         p->pNext-
10310 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
10320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10330 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20    pSib->pNext = 
10340 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
10350 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10360 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
10370 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20  ndif.  *ppBtree 
10380 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e  = p;..btree_open
10390 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d  _out:.  if( rc!=
103a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
103b0 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d   if( pBt && pBt-
103c0 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20  >pPager ){.     
103d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
103e0 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
103f0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
10400 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
10410 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10420 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20  );.    *ppBtree 
10430 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
10440 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72    /* If the B-Tr
10450 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ee was successfu
10460 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20  lly opened, set 
10470 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
10480 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20 20  size to the.    
10490 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  ** default value
104a0 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20 6f  . Except, when o
104b0 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69  pening on an exi
104c0 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61 67  sting shared pag
104d0 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a  er-cache,.    **
104e0 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74   do not change t
104f0 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73  he pager-cache s
10500 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
10510 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
10520 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d  Schema(p, 0, 0)=
10530 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
10540 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
10550 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  size(p->pBt->pPa
10560 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  ger, SQLITE_DEFA
10570 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b  ULT_CACHE_SIZE);
10580 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
10590 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20   mutexOpen ){.  
105a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
105b0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74  3_mutex_held(mut
105c0 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73  exOpen) );.    s
105d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
105e0 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  ve(mutexOpen);. 
105f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
10600 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
10610 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  nt the BtShared.
10620 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57  nRef counter.  W
10630 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a  hen it reaches z
10640 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74  ero,.** remove t
10650 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75  he BtShared stru
10660 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73  cture from the s
10670 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65  haring list.  Re
10680 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
10690 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
106a0 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65  f counter reache
106b0 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  s zero and retur
106c0 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74  n.** false if it
106d0 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69   is still positi
106e0 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ve..*/.static in
106f0 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72  t removeFromShar
10700 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65 64  ingList(BtShared
10710 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20   *pBt){.#ifndef 
10720 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
10730 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45 58  ED_CACHE.  MUTEX
10740 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
10750 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20  mutex *pMaster; 
10760 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c  ).  BtShared *pL
10770 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76  ist;.  int remov
10780 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ed = 0;..  asser
10790 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
107a0 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75  _notheld(pBt->mu
107b0 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f  tex) );.  MUTEX_
107c0 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d  LOGIC( pMaster =
107d0 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
107e0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
107f0 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20  STATIC_MASTER); 
10800 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ).  sqlite3_mute
10810 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
10820 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pBt->nRef--;
10830 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66  .  if( pBt->nRef
10840 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47  <=0 ){.    if( G
10850 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
10860 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
10870 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a  heList)==pBt ){.
10880 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
10890 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
108a0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
108b0 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
108c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
108d0 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ist = GLOBAL(BtS
108e0 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
108f0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
10900 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
10910 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c  AYS(pList) && pL
10920 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20  ist->pNext!=pBt 
10930 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
10940 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20  =pList->pNext;. 
10950 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
10960 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29   ALWAYS(pList) )
10970 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  {.        pList-
10980 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e  >pNext = pBt->pN
10990 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
109a0 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54   }.    if( SQLIT
109b0 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a  E_THREADSAFE ){.
109c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
109d0 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75  tex_free(pBt->mu
109e0 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tex);.    }.    
109f0 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  removed = 1;.  }
10a00 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
10a10 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
10a20 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65  .  return remove
10a30 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  d;.#else.  retur
10a40 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 1;.#endif.}../
10a50 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70  *.** Make sure p
10a60 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f  Bt->pTmpSpace po
10a70 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63  ints to an alloc
10a80 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f  ation of .** MX_
10a90 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62  CELL_SIZE(pBt) b
10aa0 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ytes..*/.static 
10ab0 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d  void allocateTem
10ac0 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20  pSpace(BtShared 
10ad0 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42  *pBt){.  if( !pB
10ae0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
10af0 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
10b00 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ce = sqlite3Page
10b10 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67  Malloc( pBt->pag
10b20 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  eSize );.  }.}..
10b30 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70  /*.** Free the p
10b40 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c  Bt->pTmpSpace al
10b50 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  location.*/.stat
10b60 69 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70  ic void freeTemp
10b70 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a  Space(BtShared *
10b80 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  pBt){.  sqlite3P
10b90 61 67 65 46 72 65 65 28 20 70 42 74 2d 3e 70 54  ageFree( pBt->pT
10ba0 6d 70 53 70 61 63 65 29 3b 0a 20 20 70 42 74 2d  mpSpace);.  pBt-
10bb0 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a  >pTmpSpace = 0;.
10bc0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
10bd0 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  n open database 
10be0 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61  and invalidate a
10bf0 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69  ll cursors..*/.i
10c00 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
10c10 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  lose(Btree *p){.
10c20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
10c30 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75  = p->pBt;.  BtCu
10c40 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f  rsor *pCur;..  /
10c50 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
10c60 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74  ors opened via t
10c70 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a  his handle.  */.
10c80 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10c90 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
10ca0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
10cb0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
10cc0 72 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70  r(p);.  pCur = p
10cd0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77  Bt->pCursor;.  w
10ce0 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20  hile( pCur ){.  
10cf0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70    BtCursor *pTmp
10d00 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75   = pCur;.    pCu
10d10 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
10d20 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70  .    if( pTmp->p
10d30 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20  Btree==p ){.    
10d40 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
10d50 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b  oseCursor(pTmp);
10d60 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10d70 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   Rollback any ac
10d80 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
10d90 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61   and free the ha
10da0 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a  ndle structure..
10db0 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f    ** The call to
10dc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
10dd0 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e  lback() drops an
10de0 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65  y table-locks he
10df0 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20  ld by.  ** this 
10e00 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73  handle..  */.  s
10e10 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
10e20 61 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b  ack(p, SQLITE_OK
10e30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
10e40 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a  eLeave(p);..  /*
10e50 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74   If there are st
10e60 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61  ill other outsta
10e70 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
10e80 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62   to the shared-b
10e90 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74  tree.  ** struct
10ea0 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e  ure, return now.
10eb0 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   The remainder o
10ec0 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  f this procedure
10ed0 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70   cleans .  ** up
10ee0 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
10ef0 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
10f00 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
10f10 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d  =0 && p->locked=
10f20 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e  =0 );.  if( !p->
10f30 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f  sharable || remo
10f40 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
10f50 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a  t(pBt) ){.    /*
10f60 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c   The pBt is no l
10f70 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61  onger on the sha
10f80 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65  ring list, so we
10f90 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20   can access.    
10fa0 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61  ** it without ha
10fb0 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65  ving to hold the
10fc0 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20   mutex..    **. 
10fd0 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20     ** Clean out 
10fe0 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42  and delete the B
10ff0 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a  tShared object..
11000 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
11010 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  t( !pBt->pCursor
11020 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
11030 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
11040 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
11050 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
11060 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61   && pBt->pSchema
11070 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78   ){.      pBt->x
11080 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e  FreeSchema(pBt->
11090 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
110a0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
110b0 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d  e(0, pBt->pSchem
110c0 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70  a);.    freeTemp
110d0 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
110e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
110f0 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
11100 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
11110 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72  ED_CACHE.  asser
11120 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
11130 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
11140 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
11150 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
11160 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ) p->pPrev->pNex
11170 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
11180 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70  if( p->pNext ) p
11190 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
111a0 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69   p->pPrev;.#endi
111b0 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  f..  sqlite3_fre
111c0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
111d0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
111e0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69  ** Change the li
111f0 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65  mit on the numbe
11200 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f 77  r of pages allow
11210 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  ed in the cache.
11220 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  .**.** The maxim
11230 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63  um number of cac
11240 68 65 20 70 61 67 65 73 20 69 73 20 73 65 74 20  he pages is set 
11250 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65 0a  to the absolute.
11260 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61  ** value of mxPa
11270 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20 69  ge.  If mxPage i
11280 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20  s negative, the 
11290 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70  pager will.** op
112a0 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f  erate asynchrono
112b0 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e  usly - it will n
112c0 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66 73  ot stop to do fs
112d0 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73  ync()s.** to ins
112e0 75 72 65 20 64 61 74 61 20 69 73 20 77 72 69 74  ure data is writ
112f0 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ten to the disk 
11300 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a 2a  surface before.*
11310 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54  * continuing.  T
11320 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c  ransactions stil
11330 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68 72  l work if synchr
11340 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a  onous is off,.**
11350 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
11360 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72  e cannot be corr
11370 75 70 74 65 64 20 69 66 20 74 68 69 73 20 70 72  upted if this pr
11380 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73  ogram.** crashes
11390 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f 70  .  But if the op
113a0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
113b0 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20  rashes or there 
113c0 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74 20  is.** an abrupt 
113d0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 68  power failure wh
113e0 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  en synchronous i
113f0 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61 62  s off, the datab
11400 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20  ase.** could be 
11410 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
11420 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72 65  sistent and unre
11430 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65 2e  coverable state.
11440 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20  .** Synchronous 
11450 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74  is on by default
11460 20 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   so database cor
11470 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a  ruption is not.*
11480 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72  * normally a wor
11490 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ry..*/.int sqlit
114a0 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53  e3BtreeSetCacheS
114b0 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
114c0 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53  t mxPage){.  BtS
114d0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
114e0 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
114f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
11500 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
11510 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
11520 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
11530 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
11540 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
11550 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71  r, mxPage);.  sq
11560 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
11570 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
11580 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
11590 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69   Change the limi
115a0 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20  t on the amount 
115b0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
115c0 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65  file that may be
115d0 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65  .** memory mappe
115e0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
115f0 33 42 74 72 65 65 53 65 74 4d 6d 61 70 53 69 7a  3BtreeSetMmapSiz
11600 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
11610 6e 4d 61 70 29 7b 0a 20 20 42 74 53 68 61 72 65  nMap){.  BtShare
11620 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
11630 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11640 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
11650 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
11660 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
11670 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
11680 50 61 67 65 72 53 65 74 4d 6d 61 70 73 69 7a 65  PagerSetMmapsize
11690 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 4d  (pBt->pPager, nM
116a0 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ap);.  sqlite3Bt
116b0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
116c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
116d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
116e0 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73   the way data is
116f0 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
11700 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72  in order to incr
11710 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65  ease or decrease
11720 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65  .** how well the
11730 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74   database resist
11740 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  s damage due to 
11750 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70  OS crashes and p
11760 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73  ower.** failures
11770 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68  .  Level 1 is th
11780 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68  e same as asynch
11790 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73  ronous (no syncs
117a0 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20  () occur and.** 
117b0 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20  there is a high 
117c0 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
117d0 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20  amage)  Level 2 
117e0 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20  is the default. 
117f0 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76   There.** is a v
11800 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d  ery low but non-
11810 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79  zero probability
11820 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76   of damage.  Lev
11830 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65  el 3 reduces the
11840 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20  .** probability 
11850 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61  of damage to nea
11860 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20  r zero but with 
11870 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61  a write performa
11880 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a  nce reduction..*
11890 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
118a0 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
118b0 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  MAS.int sqlite3B
118c0 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76  treeSetSafetyLev
118d0 65 6c 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  el(.  Btree *p, 
118e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
118f0 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74  The btree to set
11900 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65   the safety leve
11910 6c 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 65  l on */.  int le
11920 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vel,            
11930 20 2f 2a 20 50 52 41 47 4d 41 20 73 79 6e 63 68   /* PRAGMA synch
11940 72 6f 6e 6f 75 73 2e 20 20 31 3d 4f 46 46 2c 20  ronous.  1=OFF, 
11950 32 3d 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c 4c  2=NORMAL, 3=FULL
11960 20 2a 2f 0a 20 20 69 6e 74 20 66 75 6c 6c 53 79   */.  int fullSy
11970 6e 63 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nc,          /* 
11980 50 52 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e 63  PRAGMA fullfsync
11990 2e 20 2a 2f 0a 20 20 69 6e 74 20 63 6b 70 74 46  . */.  int ckptF
119a0 75 6c 6c 53 79 6e 63 20 20 20 20 20 20 20 2f 2a  ullSync       /*
119b0 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69   PRAGMA checkpoi
119c0 6e 74 5f 66 75 6c 6c 66 79 6e 63 20 2a 2f 0a 29  nt_fullfync */.)
119d0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
119e0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
119f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11a00 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
11a10 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
11a20 72 74 28 20 6c 65 76 65 6c 3e 3d 31 20 26 26 20  rt( level>=1 && 
11a30 6c 65 76 65 6c 3c 3d 33 20 29 3b 0a 20 20 73 71  level<=3 );.  sq
11a40 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
11a50 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
11a60 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  erSetSafetyLevel
11a70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65  (pBt->pPager, le
11a80 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 2c 20 63  vel, fullSync, c
11a90 6b 70 74 46 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  kptFullSync);.  
11aa0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11ab0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
11ac0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
11ad0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
11ae0 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
11af0 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74 20  en btree is set 
11b00 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  to safety level 
11b10 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  1.  In other.** 
11b20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
11b30 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20  UE if no sync() 
11b40 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69  occurs on the di
11b50 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  sk files..*/.int
11b60 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e   sqlite3BtreeSyn
11b70 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65 20  cDisabled(Btree 
11b80 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
11b90 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
11ba0 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
11bb0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11bc0 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
11bd0 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74  ex) );  .  sqlit
11be0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
11bf0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26  .  assert( pBt &
11c00 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b  & pBt->pPager );
11c10 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
11c20 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e  agerNosync(pBt->
11c30 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74  pPager);.  sqlit
11c40 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
11c50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11c60 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
11c70 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20  e default pages 
11c80 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d  size and the num
11c90 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
11ca0 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a  bytes per page..
11cb0 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61  ** Or, if the pa
11cc0 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65  ge size has alre
11cd0 61 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20  ady been fixed, 
11ce0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
11cf0 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f  ADONLY .** witho
11d00 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74  ut changing anyt
11d10 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hing..**.** The 
11d20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62  page size must b
11d30 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62  e a power of 2 b
11d40 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36  etween 512 and 6
11d50 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61  5536.  If the pa
11d60 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c  ge.** size suppl
11d70 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65  ied does not mee
11d80 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  t this constrain
11d90 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  t then the page 
11da0 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63  size is not.** c
11db0 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61  hanged..**.** Pa
11dc0 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e  ge sizes are con
11dd0 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61  strained to be a
11de0 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f   power of two so
11df0 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e   that the region
11e00 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62  .** of the datab
11e10 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  ase file used fo
11e20 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e  r locking (begin
11e30 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f  ning at PENDING_
11e40 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72  BYTE,.** the fir
11e50 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
11e60 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30   1GB boundary, 0
11e70 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73  x40000000) needs
11e80 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20   to occur.** at 
11e90 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
11ea0 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
11eb0 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73  f parameter nRes
11ec0 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61  erve is less tha
11ed0 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
11ee0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
11ef0 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72  ved.** bytes per
11f00 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e   page is left un
11f10 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  changed..**.** I
11f20 66 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 68  f the iFix!=0 th
11f30 65 6e 20 74 68 65 20 42 54 53 5f 50 41 47 45 53  en the BTS_PAGES
11f40 49 5a 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69  IZE_FIXED flag i
11f50 73 20 73 65 74 20 73 6f 20 74 68 61 74 20 74 68  s set so that th
11f60 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61  e page size.** a
11f70 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f  nd autovacuum mo
11f80 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72  de can no longer
11f90 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a   be changed..*/.
11fa0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
11fb0 53 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  SetPageSize(Btre
11fc0 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69  e *p, int pageSi
11fd0 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
11fe0 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69  , int iFix){.  i
11ff0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
12000 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  K;.  BtShared *p
12010 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
12020 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
12030 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c  =-1 && nReserve<
12040 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65  =255 );.  sqlite
12050 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
12060 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
12070 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49  ags & BTS_PAGESI
12080 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20  ZE_FIXED ){.    
12090 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
120a0 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
120b0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
120c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73  ;.  }.  if( nRes
120d0 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52  erve<0 ){.    nR
120e0 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61  eserve = pBt->pa
120f0 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
12100 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20  ableSize;.  }.  
12110 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
12120 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c  >=0 && nReserve<
12130 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61  =255 );.  if( pa
12140 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
12150 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
12160 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26  MAX_PAGE_SIZE &&
12170 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53  .        ((pageS
12180 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
12190 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
121a0 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
121b0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
121c0 72 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31  rt( !pBt->pPage1
121d0 20 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f   && !pBt->pCurso
121e0 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61  r );.    pBt->pa
121f0 67 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61  geSize = (u32)pa
12200 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65  geSize;.    free
12210 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
12220 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
12230 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
12240 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
12250 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20  &pBt->pageSize, 
12260 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74  nReserve);.  pBt
12270 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
12280 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28  Bt->pageSize - (
12290 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20  u16)nReserve;.  
122a0 69 66 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e  if( iFix ) pBt->
122b0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
122c0 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a  PAGESIZE_FIXED;.
122d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
122e0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
122f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
12300 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
12310 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20  ly defined page 
12320 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  size.*/.int sqli
12330 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53  te3BtreeGetPageS
12340 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ize(Btree *p){. 
12350 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e   return p->pBt->
12360 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66  pageSize;.}..#if
12370 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
12380 48 41 53 5f 43 4f 44 45 43 29 20 7c 7c 20 64 65  HAS_CODEC) || de
12390 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
123a0 55 47 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  UG)./*.** This f
123b0 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c  unction is simil
123c0 61 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ar to sqlite3Btr
123d0 65 65 47 65 74 52 65 73 65 72 76 65 28 29 2c 20  eeGetReserve(), 
123e0 65 78 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a  except that it.*
123f0 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61  * may only be ca
12400 6c 6c 65 64 20 69 66 20 69 74 20 69 73 20 67 75  lled if it is gu
12410 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
12420 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69  e b-tree mutex i
12430 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c  s already.** hel
12440 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  d..**.** This is
12450 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73   useful in one s
12460 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74  pecial case in t
12470 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f  he backup API co
12480 64 65 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a  de where it is.*
12490 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65  * known that the
124a0 20 73 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d   shared b-tree m
124b0 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75  utex is held, bu
124c0 74 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74  t the mutex on t
124d0 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
124e0 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73  handle that owns
124f0 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74   *p is not. In t
12500 68 69 73 20 63 61 73 65 20 69 66 20 73 71 6c 69  his case if sqli
12510 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a  te3BtreeEnter().
12520 2a 2a 20 77 65 72 65 20 74 6f 20 62 65 20 63 61  ** were to be ca
12530 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63  lled, it might c
12540 6f 6c 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65  ollide with some
12550 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e   other operation
12560 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
12570 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ase handle that 
12580 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67  owns *p, causing
12590 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76   undefined behav
125a0 69 6f 75 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iour..*/.int sql
125b0 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
125c0 72 76 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65  rveNoMutex(Btree
125d0 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
125e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
125f0 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  ld(p->pBt->mutex
12600 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  ) );.  return p-
12610 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  >pBt->pageSize -
12620 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53   p->pBt->usableS
12630 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  ize;.}.#endif /*
12640 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
12650 43 20 7c 7c 20 53 51 4c 49 54 45 5f 44 45 42 55  C || SQLITE_DEBU
12660 47 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e  G */..#if !defin
12670 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
12680 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c  AGER_PRAGMAS) ||
12690 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
126a0 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a  _OMIT_VACUUM)./*
126b0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
126c0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
126d0 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  f space at the e
126e0 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65  nd of every page
126f0 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74   that.** are int
12700 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e  entually left un
12710 75 73 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  used.  This is t
12720 68 65 20 22 72 65 73 65 72 76 65 64 22 20 73 70  he "reserved" sp
12730 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73  ace that is.** s
12740 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62 79  ometimes used by
12750 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a   extensions..*/.
12760 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
12770 47 65 74 52 65 73 65 72 76 65 28 42 74 72 65 65  GetReserve(Btree
12780 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *p){.  int n;. 
12790 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
127a0 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e  er(p);.  n = p->
127b0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
127c0 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  p->pBt->usableSi
127d0 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ze;.  sqlite3Btr
127e0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
127f0 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
12800 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   Set the maximum
12810 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20   page count for 
12820 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78  a database if mx
12830 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
12840 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20  ..** No changes 
12850 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61  are made if mxPa
12860 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74  ge is 0 or negat
12870 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ive..** Regardle
12880 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ss of the value 
12890 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
128a0 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  n the maximum pa
128b0 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
128c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78   sqlite3BtreeMax
128d0 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20  PageCount(Btree 
128e0 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
128f0 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
12900 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
12910 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50  ;.  n = sqlite3P
12920 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
12930 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
12940 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
12950 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
12960 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
12970 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 42  ./*.** Set the B
12980 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
12990 20 66 6c 61 67 20 69 66 20 6e 65 77 46 6c 61 67   flag if newFlag
129a0 20 69 73 20 30 20 6f 72 20 31 2e 20 20 49 66 20   is 0 or 1.  If 
129b0 6e 65 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a  newFlag is -1,.*
129c0 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63  * then make no c
129d0 68 61 6e 67 65 73 2e 20 20 41 6c 77 61 79 73 20  hanges.  Always 
129e0 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  return the value
129f0 20 6f 66 20 74 68 65 20 42 54 53 5f 53 45 43 55   of the BTS_SECU
12a00 52 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 73 65 74  RE_DELETE.** set
12a10 74 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 63  ting after the c
12a20 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  hange..*/.int sq
12a30 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65  lite3BtreeSecure
12a40 44 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c  Delete(Btree *p,
12a50 20 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20   int newFlag){. 
12a60 20 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d   int b;.  if( p=
12a70 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
12a80 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
12a90 65 72 28 70 29 3b 0a 20 20 69 66 28 20 6e 65 77  er(p);.  if( new
12aa0 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70  Flag>=0 ){.    p
12ab0 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
12ac0 26 3d 20 7e 42 54 53 5f 53 45 43 55 52 45 5f 44  &= ~BTS_SECURE_D
12ad0 45 4c 45 54 45 3b 0a 20 20 20 20 69 66 28 20 6e  ELETE;.    if( n
12ae0 65 77 46 6c 61 67 20 29 20 70 2d 3e 70 42 74 2d  ewFlag ) p->pBt-
12af0 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
12b00 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a  _SECURE_DELETE;.
12b10 20 20 7d 20 0a 20 20 62 20 3d 20 28 70 2d 3e 70    } .  b = (p->p
12b20 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
12b30 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
12b40 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 42  )!=0;.  sqlite3B
12b50 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
12b60 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 23 65 6e 64  return b;.}.#end
12b70 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
12b80 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
12b90 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65  _PRAGMAS) || !de
12ba0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
12bb0 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a  T_VACUUM) */../*
12bc0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27  .** Change the '
12bd0 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
12be0 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74  perty of the dat
12bf0 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61  abase. If the 'a
12c00 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61  utoVacuum'.** pa
12c10 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
12c20 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76  ero, then auto-v
12c30 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e  acuum mode is en
12c40 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20  abled. If zero, 
12c50 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  it.** is disable
12c60 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76  d. The default v
12c70 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74  alue for the aut
12c80 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74  o-vacuum propert
12c90 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69  y is .** determi
12ca0 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54  ned by the SQLIT
12cb0 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
12cc0 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69  CUUM macro..*/.i
12cd0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
12ce0 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
12cf0 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56  ee *p, int autoV
12d00 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53  acuum){.#ifdef S
12d10 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
12d20 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53  ACUUM.  return S
12d30 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
12d40 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64  #else.  BtShared
12d50 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
12d60 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12d70 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20  E_OK;.  u8 av = 
12d80 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a  (u8)autoVacuum;.
12d90 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
12da0 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28  nter(p);.  if( (
12db0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
12dc0 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
12dd0 45 44 29 21 3d 30 20 26 26 20 28 61 76 20 3f 31  ED)!=0 && (av ?1
12de0 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61  :0)!=pBt->autoVa
12df0 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
12e00 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
12e10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
12e20 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
12e30 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42   av ?1:0;.    pB
12e40 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
12e50 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a  av==2 ?1:0;.  }.
12e60 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
12e70 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
12e80 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f   rc;.#endif.}../
12e90 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
12ea0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75  value of the 'au
12eb0 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
12ec0 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63  rty. If auto-vac
12ed0 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c  uum is .** enabl
12ee0 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64  ed 1 is returned
12ef0 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a  . Otherwise 0..*
12f00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
12f10 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeGetAutoVacuum(
12f20 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65  Btree *p){.#ifde
12f30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
12f40 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
12f50 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  n BTREE_AUTOVACU
12f60 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20  UM_NONE;.#else. 
12f70 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
12f80 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
12f90 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21  .  rc = (.    (!
12fa0 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  p->pBt->autoVacu
12fb0 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
12fc0 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28  CUUM_NONE:.    (
12fd0 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63  !p->pBt->incrVac
12fe0 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56  uum)?BTREE_AUTOV
12ff0 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20  ACUUM_FULL:.    
13000 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
13010 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c  _INCR.  );.  sql
13020 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
13030 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
13040 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
13050 20 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65   Get a reference
13060 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68   to pPage1 of th
13070 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
13080 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61    This will.** a
13090 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65  lso acquire a re
130a0 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66  adlock on that f
130b0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ile..**.** SQLIT
130c0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
130d0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
130e0 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
130f0 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65   a.** well-forme
13100 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  d database file,
13110 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52   then SQLITE_COR
13120 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64  RUPT is returned
13130 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ..** SQLITE_BUSY
13140 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
13150 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
13160 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f  locked.  SQLITE_
13170 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75  NOMEM.** is retu
13180 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f  rned if we run o
13190 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a  ut of memory. .*
131a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
131b0 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20  kBtree(BtShared 
131c0 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  *pBt){.  int rc;
131d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
131e0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f   Result code fro
131f0 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a  m subfunctions *
13200 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
13210 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65  ge1;     /* Page
13220 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61   1 of the databa
13230 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
13240 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
13250 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
13260 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
13270 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  base */.  int nP
13280 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f  ageFile = 0;   /
13290 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
132a0 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
132b0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
132c0 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20 20 20  nPageHeader;    
132d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
132e0 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
132f0 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ase according to
13300 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72   hdr */..  asser
13310 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
13320 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
13330 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
13340 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b  Bt->pPage1==0 );
13350 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
13360 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70  agerSharedLock(p
13370 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69  Bt->pPager);.  i
13380 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13390 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
133a0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
133b0 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
133c0 31 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  1, 0, 0);.  if( 
133d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
133e0 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
133f0 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e   Do some checkin
13400 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65  g to help insure
13410 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65   the file we ope
13420 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20  ned really is.  
13430 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62  ** a valid datab
13440 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a  ase file. .  */.
13450 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 48    nPage = nPageH
13460 65 61 64 65 72 20 3d 20 67 65 74 34 62 79 74 65  eader = get4byte
13470 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (28+(u8*)pPage1-
13480 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74  >aData);.  sqlit
13490 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
134a0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
134b0 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66 28  PageFile);.  if(
134c0 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d   nPage==0 || mem
134d0 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61 67  cmp(24+(u8*)pPag
134e0 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28 75  e1->aData, 92+(u
134f0 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
13500 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50  ,4)!=0 ){.    nP
13510 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b  age = nPageFile;
13520 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65  .  }.  if( nPage
13530 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20 70 61  >0 ){.    u32 pa
13540 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33 32 20  geSize;.    u32 
13550 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
13560 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67  u8 *page1 = pPag
13570 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72  e1->aData;.    r
13580 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44  c = SQLITE_NOTAD
13590 42 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  B;.    if( memcm
135a0 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48  p(page1, zMagicH
135b0 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b  eader, 16)!=0 ){
135c0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
135d0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
135e0 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
135f0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
13600 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31   if( page1[18]>1
13610 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62   ){.      pBt->b
13620 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52  tsFlags |= BTS_R
13630 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  EAD_ONLY;.    }.
13640 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
13650 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ]>1 ){.      got
13660 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
13670 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65  led;.    }.#else
13680 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
13690 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>2 ){.      pB
136a0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
136b0 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20  TS_READ_ONLY;.  
136c0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
136d0 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20  1[19]>2 ){.     
136e0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
136f0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
13700 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72      /* If the wr
13710 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73  ite version is s
13720 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61  et to 2, this da
13730 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65  tabase should be
13740 20 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a   accessed.    **
13750 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66   in WAL mode. If
13760 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20   the log is not 
13770 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70  already open, op
13780 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20  en it now. Then 
13790 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  .    ** return S
137a0 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74  QLITE_OK and ret
137b0 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75  urn without popu
137c0 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e  lating BtShared.
137d0 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54  pPage1..    ** T
137e0 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74  he caller detect
137f0 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73  s this and calls
13800 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
13810 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20  gain. This is.  
13820 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73    ** required as
13830 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20   the version of 
13840 70 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79  page 1 currently
13850 20 69 6e 20 74 68 65 20 70 61 67 65 31 20 62 75   in the page1 bu
13860 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ffer.    ** may 
13870 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65 73  not be the lates
13880 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72  t version - ther
13890 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72  e may be a newer
138a0 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a   one in the log.
138b0 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20      ** file..   
138c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65   */.    if( page
138d0 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42 74  1[19]==2 && (pBt
138e0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
138f0 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20  _NO_WAL)==0 ){. 
13900 20 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e 20       int isOpen 
13910 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
13920 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
13930 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Wal(pBt->pPager,
13940 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20   &isOpen);.     
13950 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13960 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
13970 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
13980 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73  iled;.      }els
13990 65 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20  e if( isOpen==0 
139a0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
139b0 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
139c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
139d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
139e0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  }.      rc = SQL
139f0 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20  ITE_NOTADB;.    
13a00 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
13a10 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62   The maximum emb
13a20 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d  edded fraction m
13a30 75 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 32  ust be exactly 2
13a40 35 25 2e 20 20 41 6e 64 20 74 68 65 20 6d 69 6e  5%.  And the min
13a50 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65  imum.    ** embe
13a60 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75  dded fraction mu
13a70 73 74 20 62 65 20 31 32 2e 35 25 20 66 6f 72 20  st be 12.5% for 
13a80 62 6f 74 68 20 6c 65 61 66 2d 64 61 74 61 20 61  both leaf-data a
13a90 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61  nd non-leaf-data
13aa0 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69  ..    ** The ori
13ab0 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c  ginal design all
13ac0 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e  owed these amoun
13ad0 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20  ts to vary, but 
13ae0 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72  as of.    ** ver
13af0 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72  sion 3.6.0, we r
13b00 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62  equire them to b
13b10 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a  e fixed..    */.
13b20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26      if( memcmp(&
13b30 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30  page1[21], "\100
13b40 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20  \040\040",3)!=0 
13b50 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
13b60 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
13b70 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 53  .    }.    pageS
13b80 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d  ize = (page1[16]
13b90 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37  <<8) | (page1[17
13ba0 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20  ]<<16);.    if( 
13bb0 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
13bc0 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20 20 20  geSize)!=0.     
13bd0 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  || pageSize>SQLI
13be0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
13bf0 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69   .     || pageSi
13c00 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a  ze<=256 .    ){.
13c10 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
13c20 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
13c30 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
13c40 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
13c50 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c 65 53  0 );.    usableS
13c60 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d  ize = pageSize -
13c70 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20   page1[20];.    
13c80 69 66 28 20 28 75 33 32 29 70 61 67 65 53 69 7a  if( (u32)pageSiz
13c90 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e!=pBt->pageSize
13ca0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74   ){.      /* Aft
13cb0 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 66  er reading the f
13cc0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
13cd0 20 64 61 74 61 62 61 73 65 20 61 73 73 75 6d 69   database assumi
13ce0 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20  ng a page size. 
13cf0 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61       ** of BtSha
13d00 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65  red.pageSize, we
13d10 20 68 61 76 65 20 64 69 73 63 6f 76 65 72 65 64   have discovered
13d20 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
13d30 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ize is.      ** 
13d40 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a  actually pageSiz
13d50 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  e. Unlock the da
13d60 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42  tabase, leave pB
13d70 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20  t->pPage1 at.   
13d80 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72     ** zero and r
13d90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
13da0 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
13db0 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
13dc0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61  ion.      ** aga
13dd0 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72 72  in with the corr
13de0 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20  ect page-size.. 
13df0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
13e00 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
13e10 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73  );.      pBt->us
13e20 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
13e30 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74  eSize;.      pBt
13e40 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
13e50 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65  eSize;.      fre
13e60 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
13e70 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
13e80 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
13e90 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
13ea0 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
13eb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ed0 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61      pageSize-usa
13ee0 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  bleSize);.      
13ef0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
13f00 0a 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 64  .    if( (pBt->d
13f10 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
13f20 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d  E_RecoveryMode)=
13f30 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67  =0 && nPage>nPag
13f40 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72  eFile ){.      r
13f50 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
13f60 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
13f70 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
13f80 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
13f90 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c   if( usableSize<
13fa0 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  480 ){.      got
13fb0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
13fc0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
13fd0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
13fe0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74  ageSize;.    pBt
13ff0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
14000 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64  sableSize;.#ifnd
14010 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
14020 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42  UTOVACUUM.    pB
14030 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
14040 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
14050 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
14060 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
14070 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
14080 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a  e(&page1[36 + 7*
14090 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
140a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f  .  }..  /* maxLo
140b0 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d  cal is the maxim
140c0 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
140d0 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f  load to store lo
140e0 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61  cally for.  ** a
140f0 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72   cell.  Make sur
14100 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  e it is small en
14110 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20  ough so that at 
14120 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a  least minFanout.
14130 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77    ** cells can w
14140 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70  ill fit on one p
14150 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20  age.  We assume 
14160 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68  a 10-byte page h
14170 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69  eader..  ** Besi
14180 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c  des the payload,
14190 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73   the cell must s
141a0 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32  tore:.  **     2
141b0 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f  -byte pointer to
141c0 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20   the cell.  **  
141d0 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20     4-byte child 
141e0 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20  pointer.  **    
141f0 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c   9-byte nKey val
14200 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
14210 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20  te nData value. 
14220 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f   **     4-byte o
14230 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
14240 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63  nter.  ** So a c
14250 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
14260 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72  a 2-byte pointer
14270 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68  , a header which
14280 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20   is as much as. 
14290 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e   ** 17 bytes lon
142a0 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20  g, 0 to N bytes 
142b0 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20  of payload, and 
142c0 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79  an optional 4 by
142d0 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a  te overflow.  **
142e0 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20   page pointer.. 
142f0 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f   */.  pBt->maxLo
14300 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74  cal = (u16)((pBt
14310 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
14320 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *64/255 - 23);. 
14330 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d   pBt->minLocal =
14340 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
14350 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
14360 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
14370 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29  >maxLeaf = (u16)
14380 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
14390 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d   - 35);.  pBt->m
143a0 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28  inLeaf = (u16)((
143b0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
143c0 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29  12)*32/255 - 23)
143d0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61 78  ;.  if( pBt->max
143e0 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20  Local>127 ){.   
143f0 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
14400 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d  yload = 127;.  }
14410 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d  else{.    pBt->m
14420 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d  ax1bytePayload =
14430 20 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63   (u8)pBt->maxLoc
14440 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  al;.  }.  assert
14450 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b  ( pBt->maxLeaf +
14460 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53   23 <= MX_CELL_S
14470 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42  IZE(pBt) );.  pB
14480 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67  t->pPage1 = pPag
14490 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65  e1;.  pBt->nPage
144a0 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75   = nPage;.  retu
144b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
144c0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
144d0 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
144e0 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e  pPage1);.  pBt->
144f0 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65  pPage1 = 0;.  re
14500 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14510 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
14520 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75  o outstanding cu
14530 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65  rsors and we are
14540 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64   not in the midd
14550 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73  le.** of a trans
14560 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65  action but there
14570 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20   is a read lock 
14580 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  on the database,
14590 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   then.** this ro
145a0 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65  utine unrefs the
145b0 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
145c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
145d0 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74   which .** has t
145e0 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c  he effect of rel
145f0 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20  easing the read 
14600 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lock..**.** If t
14610 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61  here is a transa
14620 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
14630 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
14640 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
14650 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63  tatic void unloc
14660 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42  kBtreeIfUnused(B
14670 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
14680 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14690 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
146a0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
146b0 65 72 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f  ert( pBt->pCurso
146c0 72 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54  r==0 || pBt->inT
146d0 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53  ransaction>TRANS
146e0 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70  _NONE );.  if( p
146f0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
14700 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
14710 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20   pBt->pPage1!=0 
14720 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
14730 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
14740 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
14750 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
14760 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
14770 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  r)==1 );.    ass
14780 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
14790 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 72  ->aData );.    r
147a0 65 6c 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e  eleasePage(pBt->
147b0 70 50 61 67 65 31 29 3b 0a 20 20 20 20 70 42 74  pPage1);.    pBt
147c0 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
147d0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42  }.}../*.** If pB
147e0 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  t points to an e
147f0 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63  mpty file then c
14800 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70 74  onvert that empt
14810 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61  y file.** into a
14820 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61 62   new empty datab
14830 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  ase by initializ
14840 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
14850 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74  ge of.** the dat
14860 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
14870 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65   int newDatabase
14880 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
14890 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b  .  MemPage *pP1;
148a0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
148b0 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63   *data;.  int rc
148c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
148d0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
148e0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
148f0 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e   if( pBt->nPage>
14900 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
14910 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
14920 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
14930 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e1;.  assert( pP
14940 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d  1!=0 );.  data =
14950 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72   pP1->aData;.  r
14960 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
14970 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61  Write(pP1->pDbPa
14980 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
14990 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
149a0 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63  cpy(data, zMagic
149b0 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
149c0 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20  MagicHeader));. 
149d0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
149e0 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31  zMagicHeader)==1
149f0 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20  6 );.  data[16] 
14a00 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67  = (u8)((pBt->pag
14a10 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b  eSize>>8)&0xff);
14a20 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75  .  data[17] = (u
14a30 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  8)((pBt->pageSiz
14a40 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20  e>>16)&0xff);.  
14a50 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20  data[18] = 1;.  
14a60 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20  data[19] = 1;.  
14a70 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
14a80 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61  bleSize<=pBt->pa
14a90 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75  geSize && pBt->u
14aa0 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70  sableSize+255>=p
14ab0 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
14ac0 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29   data[20] = (u8)
14ad0 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
14ae0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
14af0 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20  );.  data[21] = 
14b00 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d  64;.  data[22] =
14b10 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20   32;.  data[23] 
14b20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26  = 32;.  memset(&
14b30 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30  data[24], 0, 100
14b40 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  -24);.  zeroPage
14b50 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59  (pP1, PTF_INTKEY
14b60 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45  |PTF_LEAF|PTF_LE
14b70 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d  AFDATA );.  pBt-
14b80 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
14b90 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b  _PAGESIZE_FIXED;
14ba0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14bb0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
14bc0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
14bd0 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  utoVacuum==1 || 
14be0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
14bf0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
14c00 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
14c10 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56  =1 || pBt->incrV
14c20 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75  acuum==0 );.  pu
14c30 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
14c40 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74  + 4*4], pBt->aut
14c50 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34  oVacuum);.  put4
14c60 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
14c70 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56  7*4], pBt->incrV
14c80 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20  acuum);.#endif. 
14c90 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b   pBt->nPage = 1;
14ca0 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b  .  data[31] = 1;
14cb0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14cc0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
14cd0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66 69 72  itialize the fir
14ce0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
14cf0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 63 72  atabase file (cr
14d00 65 61 74 69 6e 67 20 61 20 64 61 74 61 62 61 73  eating a databas
14d10 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20  e.** consisting 
14d20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
14d30 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f   and no schema o
14d40 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72 6e 20  bjects). Return 
14d50 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20  SQLITE_OK.** if 
14d60 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
14d70 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
14d80 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
14d90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
14da0 65 65 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70  eeNewDb(Btree *p
14db0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
14dc0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
14dd0 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e  (p);.  p->pBt->n
14de0 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d  Page = 0;.  rc =
14df0 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 2d 3e   newDatabase(p->
14e00 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  pBt);.  sqlite3B
14e10 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
14e20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
14e30 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20  .** Ensure that 
14e40 61 6e 79 20 72 6f 6f 74 20 70 61 67 65 20 72 65  any root page re
14e50 66 65 72 65 6e 63 65 73 20 68 65 6c 64 20 62 79  ferences held by
14e60 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 20 61 72   open cursors ar
14e70 65 20 6e 6f 74 0a 2a 2a 20 6d 6d 61 70 20 70 61  e not.** mmap pa
14e80 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ges..*/.static i
14e90 6e 74 20 62 74 72 65 65 53 77 61 70 4f 75 74 4d  nt btreeSwapOutM
14ea0 6d 61 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  map(BtShared *pB
14eb0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
14ec0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
14ed0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
14ee0 63 6f 64 65 20 2a 2f 0a 20 20 42 74 43 75 72 73  code */.  BtCurs
14ef0 6f 72 20 2a 70 43 73 72 3b 20 20 20 20 20 20 20  or *pCsr;       
14f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
14f10 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
14f20 6f 75 67 68 20 61 6c 6c 20 6f 70 65 6e 20 63 75  ough all open cu
14f30 72 73 6f 72 73 20 2a 2f 0a 0a 20 20 66 6f 72 28  rsors */..  for(
14f40 70 43 73 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f  pCsr=pBt->pCurso
14f50 72 3b 20 70 43 73 72 20 26 26 20 72 63 3d 3d 53  r; pCsr && rc==S
14f60 51 4c 49 54 45 5f 4f 4b 3b 20 70 43 73 72 3d 70  QLITE_OK; pCsr=p
14f70 43 73 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Csr->pNext){.   
14f80 20 69 66 28 20 70 43 73 72 2d 3e 69 50 61 67 65   if( pCsr->iPage
14f90 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d  >=0 ){.      Mem
14fa0 50 61 67 65 20 2a 70 50 67 20 3d 20 70 43 73 72  Page *pPg = pCsr
14fb0 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 20  ->apPage[0];.   
14fc0 20 20 20 69 66 28 20 70 50 67 20 26 26 20 70 50     if( pPg && pP
14fd0 67 2d 3e 70 44 62 50 61 67 65 2d 3e 66 6c 61 67  g->pDbPage->flag
14fe0 73 20 26 20 50 47 48 44 52 5f 4d 4d 41 50 20 29  s & PGHDR_MMAP )
14ff0 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  {.        MemPag
15000 65 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20  e *pNew = 0;.   
15010 20 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64       rc = getAnd
15020 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 50  InitPage(pBt, pP
15030 67 2d 3e 70 67 6e 6f 2c 20 26 70 4e 65 77 2c 20  g->pgno, &pNew, 
15040 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
15050 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
15060 20 70 43 73 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCsr->iPage==0 
15070 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 73  ){.          pCs
15080 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 3d 20  r->info.pCell = 
15090 70 4e 65 77 2d 3e 61 44 61 74 61 20 2b 20 28 70  pNew->aData + (p
150a0 43 73 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20  Csr->info.pCell 
150b0 2d 20 70 50 67 2d 3e 61 44 61 74 61 29 3b 0a 20  - pPg->aData);. 
150c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
150d0 20 70 43 73 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCsr->apPage[0]
150e0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20   = pNew;.       
150f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67   releasePage(pPg
15100 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
15110 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
15120 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
15130 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
15140 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15150 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74  ** Attempt to st
15160 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61  art a new transa
15170 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74  ction. A write-t
15180 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
15190 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20   started if the 
151a0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
151b0 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65  is nonzero, othe
151c0 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a  rwise a read-.**
151d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49   transaction.  I
151e0 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
151f0 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f  ument is 2 or mo
15200 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  re and exclusive
15210 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
15220 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e  is started, mean
15230 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  ing that no othe
15240 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c  r process is all
15250 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73  owed.** to acces
15260 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  s the database. 
15270 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74   A preexisting t
15280 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e  ransaction may n
15290 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65  ot be.** upgrade
152a0 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  d to exclusive b
152b0 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  y calling this r
152c0 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20  outine a second 
152d0 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78  time - the.** ex
152e0 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f  clusivity flag o
152f0 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20  nly works for a 
15300 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
15310 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  .**.** A write-t
15320 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
15330 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72  be started befor
15340 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79  e attempting any
15350 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20   .** changes to 
15360 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e  the database.  N
15370 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
15380 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a  wing routines .*
15390 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65  * will work unle
153a0 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ss a transaction
153b0 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73   is started firs
153c0 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71  t:.**.**      sq
153d0 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
153e0 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
153f0 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
15400 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20  teIndex().**    
15410 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
15420 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  earTable().**   
15430 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44     sqlite3BtreeD
15440 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  ropTable().**   
15450 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49     sqlite3BtreeI
15460 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20  nsert().**      
15470 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65  sqlite3BtreeDele
15480 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  te().**      sql
15490 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d  ite3BtreeUpdateM
154a0 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61  eta().**.** If a
154b0 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70  n initial attemp
154c0 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65  t to acquire the
154d0 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61   lock fails beca
154e0 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74  use of lock cont
154f0 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68  ention.** and th
15500 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70  e database was p
15510 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b  reviously unlock
15520 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20  ed, then invoke 
15530 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
15540 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
15550 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65  one.  But if the
15560 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  re was previousl
15570 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64  y a read-lock, d
15580 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20  o not.** invoke 
15590 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
155a0 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53   - just return S
155b0 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c  QLITE_BUSY.  SQL
155c0 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20  ITE_BUSY is .** 
155d0 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68  returned when th
155e0 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
155f0 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72   read-lock in or
15600 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64  der to avoid a d
15610 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  eadlock..**.** S
15620 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65  uppose there are
15630 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41   two processes A
15640 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61   and B.  A has a
15650 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42   read lock and B
15660 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76   has.** a reserv
15670 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65  ed lock.  B trie
15680 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20  s to promote to 
15690 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73  exclusive but is
156a0 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65   blocked because
156b0 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20  .** of A's read 
156c0 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74  lock.  A tries t
156d0 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73  o promote to res
156e0 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f  erved but is blo
156f0 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e  cked by B..** On
15700 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  e or the other o
15710 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73  f the two proces
15720 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61  ses must give wa
15730 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62  y or there can b
15740 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73  e.** no progress
15750 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20  .  By returning 
15760 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20  SQLITE_BUSY and 
15770 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  not invoking the
15780 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a   busy callback.*
15790 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79  * when A already
157a0 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
157b0 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41  , we encourage A
157c0 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20   to give up and 
157d0 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64  let B.** proceed
157e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
157f0 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28  BtreeBeginTrans(
15800 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72  Btree *p, int wr
15810 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  flag){.  sqlite3
15820 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20   *pBlock = 0;.  
15830 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
15840 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
15850 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
15860 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
15870 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e  er(p);.  btreeIn
15880 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f  tegrity(p);..  /
15890 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69  * If the btree i
158a0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77  s already in a w
158b0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
158c0 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20  , or it.  ** is 
158d0 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61  already in a rea
158e0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  d-transaction an
158f0 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  d a read-transac
15900 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71  tion.  ** is req
15910 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20  uested, this is 
15920 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
15930 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
15940 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28  TRANS_WRITE || (
15950 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
15960 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61  S_READ && !wrfla
15970 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  g) ){.    goto t
15980 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
15990 20 20 61 73 73 65 72 74 28 20 49 66 4e 6f 74 4f    assert( IfNotO
159a0 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72  mitAV(pBt->bDoTr
159b0 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20  uncate)==0 );.. 
159c0 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61   /* Write transa
159d0 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70  ctions are not p
159e0 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61  ossible on a rea
159f0 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
15a00 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62  */.  if( (pBt->b
15a10 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
15a20 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77  AD_ONLY)!=0 && w
15a30 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20  rflag ){.    rc 
15a40 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
15a50 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  Y;.    goto tran
15a60 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69  s_begun;.  }..#i
15a70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15a80 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
15a90 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64   /* If another d
15aa0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68  atabase handle h
15ab0 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  as already opene
15ac0 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61  d a write transa
15ad0 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74  ction .  ** on t
15ae0 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65  his shared-btree
15af0 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
15b00 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72   second write tr
15b10 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a  ansaction is.  *
15b20 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74  * requested, ret
15b30 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
15b40 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77  D..  */.  if( (w
15b50 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e  rflag && pBt->in
15b60 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
15b70 4e 53 5f 57 52 49 54 45 29 0a 20 20 20 7c 7c 20  NS_WRITE).   || 
15b80 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
15b90 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30   BTS_PENDING)!=0
15ba0 0a 20 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b  .  ){.    pBlock
15bb0 20 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d   = pBt->pWriter-
15bc0 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  >db;.  }else if(
15bd0 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20   wrflag>1 ){.   
15be0 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
15bf0 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42      for(pIter=pB
15c00 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
15c10 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
15c20 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
15c30 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70  pIter->pBtree!=p
15c40 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 6c 6f   ){.        pBlo
15c50 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72  ck = pIter->pBtr
15c60 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20  ee->db;.        
15c70 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
15c80 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
15c90 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c  Block ){.    sql
15ca0 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
15cb0 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c  ocked(p->db, pBl
15cc0 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  ock);.    rc = S
15cd0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
15ce0 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 67 6f  REDCACHE;.    go
15cf0 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
15d00 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
15d10 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f   Any read-only o
15d20 72 20 72 65 61 64 2d 77 72 69 74 65 20 74 72 61  r read-write tra
15d30 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73  nsaction implies
15d40 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
15d50 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f  .  ** page 1. So
15d60 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73   if some other s
15d70 68 61 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65  hared-cache clie
15d80 6e 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  nt already has a
15d90 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a   write-lock .  *
15da0 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65  * on page 1, the
15db0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e   transaction can
15dc0 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a  not be opened. *
15dd0 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79 53 68  /.  rc = querySh
15de0 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
15df0 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  ck(p, MASTER_ROO
15e00 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20  T, READ_LOCK);. 
15e10 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
15e20 72 63 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f  rc ) goto trans_
15e30 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62  begun;..  pBt->b
15e40 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
15e50 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b  INITIALLY_EMPTY;
15e60 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67  .  if( pBt->nPag
15e70 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46  e==0 ) pBt->btsF
15e80 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54  lags |= BTS_INIT
15e90 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64  IALLY_EMPTY;.  d
15ea0 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20  o {.    /* Call 
15eb0 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69  lockBtree() unti
15ec0 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50  l either pBt->pP
15ed0 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65  age1 is populate
15ee0 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  d or.    ** lock
15ef0 42 74 72 65 65 28 29 20 72 65 74 75 72 6e 73 20  Btree() returns 
15f00 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20  something other 
15f10 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  than SQLITE_OK. 
15f20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20  lockBtree().    
15f30 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ** may return SQ
15f40 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76  LITE_OK but leav
15f50 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65  e pBt->pPage1 se
15f60 74 20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a  t to 0 if after.
15f70 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70      ** reading p
15f80 61 67 65 20 31 20 69 74 20 64 69 73 63 6f 76 65  age 1 it discove
15f90 72 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  rs that the page
15fa0 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74  -size of the dat
15fb0 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69  abase .    ** fi
15fc0 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70  le is not pBt->p
15fd0 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73  ageSize. In this
15fe0 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28   case lockBtree(
15ff0 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20  ) will update.  
16000 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69    ** pBt->pageSi
16010 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73  ze to the page-s
16020 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
16030 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a  on disk..    */.
16040 20 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e      while( pBt->
16050 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c  pPage1==0 && SQL
16060 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f  ITE_OK==(rc = lo
16070 63 6b 42 74 72 65 65 28 70 42 74 29 29 20 29 3b  ckBtree(pBt)) );
16080 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
16090 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
160a0 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  g ){.      if( (
160b0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
160c0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
160d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
160e0 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
160f0 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  Y;.      }else{.
16100 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
16110 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70  ite3PagerBegin(p
16120 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61  Bt->pPager,wrfla
16130 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49  g>1,sqlite3TempI
16140 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b  nMemory(p->db));
16150 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
16160 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16170 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
16180 65 65 53 77 61 70 4f 75 74 4d 6d 61 70 28 70 42  eeSwapOutMmap(pB
16190 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
161a0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
161b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
161c0 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
161d0 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
161e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
161f0 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72    }.  .    if( r
16200 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16210 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65        unlockBtre
16220 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
16230 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
16240 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54  (rc&0xFF)==SQLIT
16250 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69  E_BUSY && pBt->i
16260 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
16270 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20  ANS_NONE &&.    
16280 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b        btreeInvok
16290 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74  eBusyHandler(pBt
162a0 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ) );..  if( rc==
162b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
162c0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
162d0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
162e0 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73       pBt->nTrans
162f0 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65  action++;.#ifnde
16300 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
16310 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20  ARED_CACHE.     
16320 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
16330 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
16340 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72  rt( p->lock.pBtr
16350 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b  ee==p && p->lock
16360 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20  .iTable==1 );.  
16370 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c        p->lock.eL
16380 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b  ock = READ_LOCK;
16390 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b  .        p->lock
163a0 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  .pNext = pBt->pL
163b0 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74  ock;.        pBt
163c0 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f  ->pLock = &p->lo
163d0 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ck;.      }.#end
163e0 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  if.    }.    p->
163f0 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61  inTrans = (wrfla
16400 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52  g?TRANS_WRITE:TR
16410 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69  ANS_READ);.    i
16420 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42  f( p->inTrans>pB
16430 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
16440 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   ){.      pBt->i
16450 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70  nTransaction = p
16460 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d  ->inTrans;.    }
16470 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20  .    if( wrflag 
16480 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  ){.      MemPage
16490 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
164a0 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66 20  pPage1;.#ifndef 
164b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
164c0 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 61  ED_CACHE.      a
164d0 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72  ssert( !pBt->pWr
164e0 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42  iter );.      pB
164f0 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a  t->pWriter = p;.
16500 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
16510 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c  ags &= ~BTS_EXCL
16520 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66 28  USIVE;.      if(
16530 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74 2d   wrflag>1 ) pBt-
16540 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
16550 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64  _EXCLUSIVE;.#end
16560 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  if..      /* If 
16570 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61 64  the db-size head
16580 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63 6f  er field is inco
16590 72 72 65 63 74 20 28 61 73 20 69 74 20 6d 61 79  rrect (as it may
165a0 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20   be if an old.  
165b0 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61      ** client ha
165c0 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20 74  s been writing t
165d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
165e0 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f 77  ), update it now
165f0 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a  . Doing.      **
16600 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61 74   this sooner rat
16610 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20 6d  her than later m
16620 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
16630 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65 6c  e size can safel
16640 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d 72  y .      ** re-r
16650 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
16660 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65 20   size from page 
16670 31 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e 74  1 if a savepoint
16680 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a   or transaction.
16690 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63        ** rollbac
166a0 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  k occurs within 
166b0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
166c0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
166d0 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  if( pBt->nPage!=
166e0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
166f0 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a  ->aData[28]) ){.
16700 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
16710 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
16720 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
16730 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
16740 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16750 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
16760 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
16770 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  28], pBt->nPage)
16780 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16790 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a    }.    }.  }...
167a0 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69  trans_begun:.  i
167b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
167c0 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
167d0 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d    /* This call m
167e0 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 74  akes sure that t
167f0 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65  he pager has the
16800 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20   correct number 
16810 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73  of.    ** open s
16820 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68  avepoints. If th
16830 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
16840 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
16850 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20  an 0 and.    ** 
16860 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
16870 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
16880 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c  pen, then it wil
16890 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65  l be opened here
168a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
168b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
168c0 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  enSavepoint(pBt-
168d0 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e  >pPager, p->db->
168e0 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d  nSavepoint);.  }
168f0 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
16900 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ty(p);.  sqlite3
16910 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
16920 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
16930 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16940 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f  IT_AUTOVACUUM../
16950 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69  *.** Set the poi
16960 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
16970 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65   for all childre
16980 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e  n of page pPage.
16990 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61   Also, if.** pPa
169a0 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c  ge contains cell
169b0 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
169c0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
169d0 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  set the pointer.
169e0 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  ** map entries f
169f0 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
16a00 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a  pages as well..*
16a10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
16a20 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d  ChildPtrmaps(Mem
16a30 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
16a40 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
16a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a60 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61     /* Counter va
16a70 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  riable */.  int 
16a80 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
16a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16aa0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
16ab0 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20  s in page pPage 
16ac0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
16ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ae0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
16af0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68  n code */.  BtSh
16b00 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
16b10 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73 49  e->pBt;.  u8 isI
16b20 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d  nitOrig = pPage-
16b30 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20  >isInit;.  Pgno 
16b40 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67  pgno = pPage->pg
16b50 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  no;..  assert( s
16b60 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
16b70 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
16b80 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 62  tex) );.  rc = b
16b90 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
16ba0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
16bb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16bc0 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70  goto set_child_p
16bd0 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a  trmaps_out;.  }.
16be0 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
16bf0 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69  >nCell;..  for(i
16c00 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
16c10 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ){.    u8 *pCell
16c20 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
16c30 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d  e, i);..    ptrm
16c40 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61  apPutOvflPtr(pPa
16c50 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b  ge, pCell, &rc);
16c60 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ..    if( !pPage
16c70 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
16c80 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d  Pgno childPgno =
16c90 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
16ca0 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  ;.      ptrmapPu
16cb0 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
16cc0 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
16cd0 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20  pgno, &rc);.    
16ce0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  }.  }..  if( !pP
16cf0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
16d00 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
16d10 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
16d20 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
16d30 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
16d40 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
16d50 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
16d60 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c  MAP_BTREE, pgno,
16d70 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f   &rc);.  }..set_
16d80 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
16d90 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  t:.  pPage->isIn
16da0 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b  it = isInitOrig;
16db0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16dc0 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65  ./*.** Somewhere
16dd0 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20 70   on pPage is a p
16de0 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69  ointer to page i
16df0 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68  From.  Modify th
16e00 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a  is pointer so.**
16e10 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
16e20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65  to iTo. Paramete
16e30 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62 65  r eType describe
16e40 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f  s the type of po
16e50 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d  inter to.** be m
16e60 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c  odified, as  fol
16e70 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  lows:.**.** PTRM
16e80 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50  AP_BTREE:     pP
16e90 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70  age is a btree-p
16ea0 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
16eb0 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69   points at a chi
16ec0 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ld .**          
16ed0 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f 66           page of
16ee0 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54   pPage..**.** PT
16ef0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20  RMAP_OVERFLOW1: 
16f00 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
16f10 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
16f20 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  er points at an 
16f30 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20  overflow.**     
16f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
16f50 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ge pointed to by
16f60 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c   one of the cell
16f70 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  s on pPage..**.*
16f80 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
16f90 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20  W2: pPage is an 
16fa0 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54  overflow-page. T
16fb0 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
16fc0 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a  s at the next.**
16fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fe0 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65     overflow page
16ff0 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f   in the list..*/
17000 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69  .static int modi
17010 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65  fyPagePointer(Me
17020 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67  mPage *pPage, Pg
17030 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69  no iFrom, Pgno i
17040 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20  To, u8 eType){. 
17050 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
17060 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
17070 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
17080 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
17090 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
170a0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
170b0 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79  ge) );.  if( eTy
170c0 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
170d0 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  LOW2 ){.    /* T
170e0 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c  he pointer is al
170f0 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34  ways the first 4
17100 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61   bytes of the pa
17110 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
17120 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74    */.    if( get
17130 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
17140 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ta)!=iFrom ){.  
17150 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17160 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
17170 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79      }.    put4by
17180 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
17190 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   iTo);.  }else{.
171a0 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69      u8 isInitOri
171b0 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  g = pPage->isIni
171c0 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  t;.    int i;.  
171d0 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20    int nCell;..  
171e0 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28    btreeInitPage(
171f0 70 50 61 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c  pPage);.    nCel
17200 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
17210 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
17220 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
17230 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d       u8 *pCell =
17240 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
17250 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65   i);.      if( e
17260 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
17270 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20  RFLOW1 ){.      
17280 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
17290 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 50 61  .        btreePa
172a0 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
172b0 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
172c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66  .        if( inf
172d0 6f 2e 69 4f 76 65 72 66 6c 6f 77 0a 20 20 20 20  o.iOverflow.    
172e0 20 20 20 20 20 26 26 20 70 43 65 6c 6c 2b 69 6e       && pCell+in
172f0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 3c 3d  fo.iOverflow+3<=
17300 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61  pPage->aData+pPa
17310 67 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20 20 20  ge->maskPage.   
17320 20 20 20 20 20 20 26 26 20 69 46 72 6f 6d 3d 3d        && iFrom==
17330 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
17340 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
17350 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
17360 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
17370 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
17380 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20  flow], iTo);.   
17390 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
173a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
173b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
173c0 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
173d0 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
173e0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43       put4byte(pC
173f0 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20  ell, iTo);.     
17400 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17410 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
17420 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69    }.  .    if( i
17430 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ==nCell ){.     
17440 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
17450 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20  AP_BTREE || .   
17460 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28         get4byte(
17470 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
17480 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
17490 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  ])!=iFrom ){.   
174a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
174b0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
174c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
174d0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
174e0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
174f0 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b  Offset+8], iTo);
17500 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67  .    }..    pPag
17510 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
17520 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65  itOrig;.  }.  re
17530 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17540 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
17550 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
17560 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74 6f   page pDbPage to
17570 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50   location iFreeP
17580 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64  age in the .** d
17590 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44 62  atabase. The pDb
175a0 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20 72  Page reference r
175b0 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a  emains valid..**
175c0 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69 74  .** The isCommit
175d0 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20   flag indicates 
175e0 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
175f0 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65   need to remembe
17600 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f  r that.** the jo
17610 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62  urnal needs to b
17620 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  e sync()ed befor
17630 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
17640 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a  pDbPage->pgno .*
17650 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  * can be written
17660 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20   to. The caller 
17670 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d  has already prom
17680 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74  ised not to writ
17690 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67  e to that.** pag
176a0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
176b0 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20   relocatePage(. 
176c0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
176d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
176e0 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
176f0 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20  *pDbPage,       
17700 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f   /* Open page to
17710 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54   move */.  u8 eT
17720 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
17730 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
17740 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20  ap 'type' entry 
17750 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
17760 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20   Pgno iPtrPage, 
17770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
17780 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e  nter map 'page-n
17790 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  o' entry for pDb
177a0 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
177b0 46 72 65 65 50 61 67 65 2c 20 20 20 20 20 20 20  FreePage,       
177c0 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69     /* The locati
177d0 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61  on to move pDbPa
177e0 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69  ge to */.  int i
177f0 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20  sCommit         
17800 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20      /* isCommit 
17810 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20 73  flag passed to s
17820 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
17830 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50  age */.){.  MemP
17840 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20  age *pPtrPage;  
17850 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
17860 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  t contains a poi
17870 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20  nter to pDbPage 
17880 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67  */.  Pgno iDbPag
17890 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  e = pDbPage->pgn
178a0 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  o;.  Pager *pPag
178b0 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
178c0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
178d0 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54  ssert( eType==PT
178e0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c  RMAP_OVERFLOW2 |
178f0 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
17900 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20  OVERFLOW1 || .  
17910 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41      eType==PTRMA
17920 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
17930 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
17940 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  E );.  assert( s
17950 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
17960 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
17970 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61  .  assert( pDbPa
17980 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  ge->pBt==pBt );.
17990 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20  .  /* Move page 
179a0 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73  iDbPage from its
179b0 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
179c0 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  n to page number
179d0 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20   iFreePage */.  
179e0 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55  TRACE(("AUTOVACU
179f0 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f  UM: Moving %d to
17a00 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70   free page %d (p
17a10 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20  tr page %d type 
17a20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69  %d)\n", .      i
17a30 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
17a40 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79  e, iPtrPage, eTy
17a50 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  pe));.  rc = sql
17a60 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
17a70 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67  e(pPager, pDbPag
17a80 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65  e->pDbPage, iFre
17a90 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29  ePage, isCommit)
17aa0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
17ab0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
17ac0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44  urn rc;.  }.  pD
17ad0 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46  bPage->pgno = iF
17ae0 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49  reePage;..  /* I
17af0 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20  f pDbPage was a 
17b00 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e  btree-page, then
17b10 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69   it may have chi
17b20 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20  ld pages and/or 
17b30 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20  cells.  ** that 
17b40 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
17b50 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69  w pages. The poi
17b60 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
17b70 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20   for all these. 
17b80 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74   ** pages need t
17b90 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20  o be changed..  
17ba0 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61  **.  ** If pDbPa
17bb0 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
17bc0 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  w page, then the
17bd0 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d   first 4 bytes m
17be0 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20  ay store a.  ** 
17bf0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62  pointer to a sub
17c00 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
17c10 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69   page. If this i
17c20 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
17c30 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  .  ** the pointe
17c40 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62  r map needs to b
17c50 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68  e updated for th
17c60 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  e subsequent ove
17c70 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f  rflow page..  */
17c80 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
17c90 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
17ca0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
17cb0 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
17cc0 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
17cd0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
17ce0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17cf0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
17d00 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   rc;.    }.  }el
17d10 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78  se{.    Pgno nex
17d20 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  tOvfl = get4byte
17d30 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29  (pDbPage->aData)
17d40 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76  ;.    if( nextOv
17d50 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  fl!=0 ){.      p
17d60 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65  trmapPut(pBt, ne
17d70 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  xtOvfl, PTRMAP_O
17d80 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50  VERFLOW2, iFreeP
17d90 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  age, &rc);.     
17da0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17db0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
17dc0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
17dd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
17de0 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73   Fix the databas
17df0 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67  e pointer on pag
17e00 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20  e iPtrPage that 
17e10 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61  pointed at iDbPa
17e20 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  ge so.  ** that 
17e30 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72  it points at iFr
17e40 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78  eePage. Also fix
17e50 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
17e60 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20   entry for.  ** 
17e70 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20  iPtrPage..  */. 
17e80 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
17e90 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
17ea0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
17eb0 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61  Page(pBt, iPtrPa
17ec0 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30  ge, &pPtrPage, 0
17ed0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
17ee0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17ef0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
17f00 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
17f10 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
17f20 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61  (pPtrPage->pDbPa
17f30 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
17f40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17f50 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
17f60 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20  pPtrPage);.     
17f70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17f80 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66  }.    rc = modif
17f90 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74  yPagePointer(pPt
17fa0 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20  rPage, iDbPage, 
17fb0 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
17fc0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
17fd0 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
17fe0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17ff0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72  _OK ){.      ptr
18000 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65  mapPut(pBt, iFre
18010 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50  ePage, eType, iP
18020 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20  trPage, &rc);.  
18030 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
18040 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61   rc;.}../* Forwa
18050 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72  rd declaration r
18060 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56  equired by incrV
18070 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a  acuumStep(). */.
18080 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
18090 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53  ateBtreePage(BtS
180a0 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65  hared *, MemPage
180b0 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e   **, Pgno *, Pgn
180c0 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50  o, u8);../*.** P
180d0 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20  erform a single 
180e0 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65  step of an incre
180f0 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49  mental-vacuum. I
18100 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
18110 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
18120 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  K. If there is n
18130 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e  o work to do (an
18140 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 70  d therefore no p
18150 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c  oint in .** call
18160 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
18170 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e  n again), return
18180 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72   SQLITE_DONE. Or
18190 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a  , if an error .*
181a0 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  * occurs, return
181b0 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
181c0 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f  r code..**.** Mo
181d0 72 65 20 73 70 65 63 69 66 69 63 6c 79 2c 20 74  re specificly, t
181e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
181f0 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61  empts to re-orga
18200 6e 69 7a 65 20 74 68 65 20 64 61 74 61 62 61 73  nize the databas
18210 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68  e so .** that th
18220 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74  e last page of t
18230 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  he file currentl
18240 79 20 69 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c  y in use is no l
18250 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a  onger in use..**
18260 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 46  .** Parameter nF
18270 69 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  in is the number
18280 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74   of pages that t
18290 68 69 73 20 64 61 74 61 62 61 73 65 20 77 6f 75  his database wou
182a0 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65  ld contain.** we
182b0 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
182c0 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74   called until it
182d0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
182e0 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  DONE..**.** If t
182f0 68 65 20 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d  he bCommit param
18300 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
18310 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
18320 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
18330 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c   .** caller will
18340 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e   keep calling in
18350 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 75  crVacuumStep() u
18360 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20  ntil it returns 
18370 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20  SQLITE_DONE .** 
18380 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f  or an error. bCo
18390 6d 6d 69 74 20 69 73 20 70 61 73 73 65 64 20 74  mmit is passed t
183a0 72 75 65 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d  rue for an auto-
183b0 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 6d 69  vacuum-on-commmi
183c0 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c  t .** operation,
183d0 20 6f 72 20 66 61 6c 73 65 20 66 6f 72 20 61 6e   or false for an
183e0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
183f0 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uum..*/.static i
18400 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  nt incrVacuumSte
18410 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
18420 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f   Pgno nFin, Pgno
18430 20 69 4c 61 73 74 50 67 2c 20 69 6e 74 20 62 43   iLastPg, int bC
18440 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e  ommit){.  Pgno n
18450 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20  FreeList;       
18460 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
18470 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20   pages still on 
18480 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f  the free-list */
18490 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
184a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
184b0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
184c0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
184d0 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29  ( iLastPg>nFin )
184e0 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50  ;..  if( !PTRMAP
184f0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
18500 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67  stPg) && iLastPg
18510 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
18520 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
18530 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67  u8 eType;.    Pg
18540 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20  no iPtrPage;..  
18550 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65    nFreeList = ge
18560 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
18570 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
18580 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69  .    if( nFreeLi
18590 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  st==0 ){.      r
185a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
185b0 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  E;.    }..    rc
185c0 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
185d0 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70  , iLastPg, &eTyp
185e0 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20  e, &iPtrPage);. 
185f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18600 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
18610 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
18620 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
18630 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
18640 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
18650 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
18660 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  T;.    }..    if
18670 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
18680 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
18690 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30    if( bCommit==0
186a0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
186b0 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66  emove the page f
186c0 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72  rom the files fr
186d0 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73  ee-list. This is
186e0 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20   not required.  
186f0 20 20 20 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d        ** if bCom
18700 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e  mit is non-zero.
18710 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
18720 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c  he free-list wil
18730 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
18740 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
18750 6f 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  o after this fun
18760 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73  ction returns, s
18770 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20  o it doesn't .  
18780 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20        ** matter 
18790 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74  if it still cont
187a0 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67  ains some garbag
187b0 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20  e entries..     
187c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67     */.        Pg
187d0 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20  no iFreePg;.    
187e0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
187f0 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
18800 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
18810 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
18820 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c  Pg, &iFreePg, iL
18830 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45  astPg, BTALLOC_E
18840 58 41 43 54 29 3b 0a 20 20 20 20 20 20 20 20 69  XACT);.        i
18850 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18860 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
18870 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
18880 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
18890 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73  t( iFreePg==iLas
188a0 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72  tPg );.        r
188b0 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
188c0 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
188d0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
188e0 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20  Pgno iFreePg;   
188f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
18900 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20  ex of free page 
18910 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20  to move pLastPg 
18920 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50  to */.      MemP
18930 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20  age *pLastPg;.  
18940 20 20 20 20 75 38 20 65 4d 6f 64 65 20 3d 20 42      u8 eMode = B
18950 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a  TALLOC_ANY;   /*
18960 20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20   Mode parameter 
18970 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  for allocateBtre
18980 65 50 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 20  ePage() */.     
18990 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b   Pgno iNear = 0;
189a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65             /* ne
189b0 61 72 62 79 20 70 61 72 61 6d 65 74 65 72 20 66  arby parameter f
189c0 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  or allocateBtree
189d0 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20  Page() */..     
189e0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
189f0 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  ge(pBt, iLastPg,
18a00 20 26 70 4c 61 73 74 50 67 2c 20 30 2c 20 30 29   &pLastPg, 0, 0)
18a10 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
18a20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18a30 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
18a40 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
18a50 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  * If bCommit is 
18a60 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20  zero, this loop 
18a70 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63  runs exactly onc
18a80 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74  e and page pLast
18a90 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  Pg.      ** is s
18aa0 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20  wapped with the 
18ab0 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  first free page 
18ac0 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66  pulled off the f
18ad0 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  ree list..      
18ae0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74  **.      ** On t
18af0 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
18b00 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72 65  f bCommit is gre
18b10 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
18b20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20  then keep.      
18b30 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ** looping until
18b40 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63   a free-page loc
18b50 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ated within the 
18b60 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73  first nFin pages
18b70 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
18b80 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a   file is found..
18b90 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
18ba0 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  f( bCommit==0 ){
18bb0 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d  .        eMode =
18bc0 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20   BTALLOC_LE;.   
18bd0 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69       iNear = nFi
18be0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
18bf0 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65   do {.        Me
18c00 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
18c10 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
18c20 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
18c30 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
18c40 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20 65  FreePg, iNear, e
18c50 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Mode);.        i
18c60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18c70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
18c80 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
18c90 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  g);.          re
18ca0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
18cb0 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61   }.        relea
18cc0 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
18cd0 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 62  .      }while( b
18ce0 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65 50  Commit && iFreeP
18cf0 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20  g>nFin );.      
18d00 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c  assert( iFreePg<
18d10 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
18d20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c   .      rc = rel
18d30 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
18d40 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69  LastPg, eType, i
18d50 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67  PtrPage, iFreePg
18d60 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20  , bCommit);.    
18d70 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
18d80 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66  astPg);.      if
18d90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18da0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
18db0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
18dc0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62    }.  }..  if( b
18dd0 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
18de0 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61 73   do {.      iLas
18df0 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c  tPg--;.    }whil
18e00 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44  e( iLastPg==PEND
18e10 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
18e20 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50  t) || PTRMAP_ISP
18e30 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
18e40 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44  ) );.    pBt->bD
18e50 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20  oTruncate = 1;. 
18e60 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
18e70 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72  iLastPg;.  }.  r
18e80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18e90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61  .}../*.** The da
18ea0 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79  tabase opened by
18eb0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
18ec0 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  ent is an auto-v
18ed0 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a 2a  acuum database.*
18ee0 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69 6e  * nOrig pages in
18ef0 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67   size containing
18f00 20 6e 46 72 65 65 20 66 72 65 65 20 70 61 67 65   nFree free page
18f10 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65 78  s. Return the ex
18f20 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20  pected .** size 
18f30 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
18f40 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69  in pages followi
18f50 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  ng an auto-vacuu
18f60 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  m operation..*/.
18f70 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e 61  static Pgno fina
18f80 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72 65 64  lDbSize(BtShared
18f90 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69   *pBt, Pgno nOri
18fa0 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a  g, Pgno nFree){.
18fb0 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20    int nEntry;   
18fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fd0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
18fe0 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74  ntries on one pt
18ff0 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50  rmap page */.  P
19000 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20  gno nPtrmap;    
19010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19020 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d  * Number of PtrM
19030 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20 66  ap pages to be f
19040 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  reed */.  Pgno n
19050 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  Fin;            
19060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
19070 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
19080 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73  nEntry = pBt->us
19090 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50  ableSize/5;.  nP
190a0 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e  trmap = (nFree-n
190b0 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45  Orig+PTRMAP_PAGE
190c0 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e  NO(pBt, nOrig)+n
190d0 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20  Entry)/nEntry;. 
190e0 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20   nFin = nOrig - 
190f0 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b  nFree - nPtrmap;
19100 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e  .  if( nOrig>PEN
19110 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
19120 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44  Bt) && nFin<PEND
19130 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
19140 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d  t) ){.    nFin--
19150 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50  ;.  }.  while( P
19160 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
19170 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d  , nFin) || nFin=
19180 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
19190 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e  GE(pBt) ){.    n
191a0 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65  Fin--;.  }..  re
191b0 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a  turn nFin;.}../*
191c0 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
191d0 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
191e0 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61  opened before ca
191f0 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
19200 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f  ion..** It perfo
19210 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69  rms a single uni
19220 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64  t of work toward
19230 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s an incremental
19240 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49   vacuum..**.** I
19250 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
19260 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69  l vacuum is fini
19270 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20  shed after this 
19280 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e  function has run
19290 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ,.** SQLITE_DONE
192a0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
192b0 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73   it is not finis
192c0 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  hed, but no erro
192d0 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53  r occurred,.** S
192e0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
192f0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
19300 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
19310 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  code. .*/.int sq
19320 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61  lite3BtreeIncrVa
19330 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
19340 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
19350 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
19360 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
19370 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
19380 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
19390 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
193a0 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54  _WRITE && p->inT
193b0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
193c0 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  E );.  if( !pBt-
193d0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
193e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
193f0 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ONE;.  }else{.  
19400 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62    Pgno nOrig = b
19410 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
19420 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72  t);.    Pgno nFr
19430 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
19440 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
19450 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f  a[36]);.    Pgno
19460 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53   nFin = finalDbS
19470 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20  ize(pBt, nOrig, 
19480 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66 28  nFree);..    if(
19490 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20   nOrig<nFin ){. 
194a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
194b0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
194c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72     }else if( nFr
194d0 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
194e0 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
194f0 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
19500 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19510 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19520 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
19530 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
19540 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 69  ;.        rc = i
19550 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
19560 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20  t, nFin, nOrig, 
19570 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
19580 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19590 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
195a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
195b0 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
195c0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
195d0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
195e0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
195f0 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67  a[28], pBt->nPag
19600 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
19610 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
19620 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
19630 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
19640 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
19650 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19660 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
19670 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72  ine is called pr
19680 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61  ior to sqlite3Pa
19690 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61  gerCommit when a
196a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
196b0 69 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20  is commited for 
196c0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
196d0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  atabase..**.** I
196e0 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  f SQLITE_OK is r
196f0 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70  eturned, then *p
19700 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f  nTrunc is set to
19710 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
19720 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  ages.** the data
19730 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
19740 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
19750 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d   during the comm
19760 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20  it process. .** 
19770 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73  i.e. the databas
19780 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67  e has been reorg
19790 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f  anized so that o
197a0 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70  nly the first *p
197b0 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20  nTrunc.** pages 
197c0 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  are in use..*/.s
197d0 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61  tatic int autoVa
197e0 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61  cuumCommit(BtSha
197f0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
19800 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
19810 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
19820 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
19830 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20    VVA_ONLY( int 
19840 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61  nRef = sqlite3Pa
19850 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
19860 65 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  er) );..  assert
19870 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
19880 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
19890 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65   );.  invalidate
198a0 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
198b0 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28  (pBt);.  assert(
198c0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
198d0 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e  ;.  if( !pBt->in
198e0 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  crVacuum ){.    
198f0 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20  Pgno nFin;      
19900 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
19910 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
19920 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63 75  e after autovacu
19930 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e  uming */.    Pgn
19940 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  o nFree;        
19950 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
19960 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
19970 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a  st initially */.
19980 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20      Pgno iFree; 
19990 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
199a0 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66 72  xt page to be fr
199b0 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  eed */.    Pgno 
199c0 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a  nOrig;        /*
199d0 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 62   Database size b
199e0 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f  efore freeing */
199f0 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74  ..    nOrig = bt
19a00 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
19a10 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41  );.    if( PTRMA
19a20 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f  P_ISPAGE(pBt, nO
19a30 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50  rig) || nOrig==P
19a40 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
19a50 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
19a60 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
19a70 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61  ible to create a
19a80 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77 68   database for wh
19a90 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61  ich the final pa
19aa0 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ge.      ** is e
19ab0 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d  ither a pointer-
19ac0 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65 20  map page or the 
19ad0 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67  pending-byte pag
19ae0 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20  e. If one.      
19af0 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ** is encountere
19b00 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  d, this indicate
19b10 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  s corruption..  
19b20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74      */.      ret
19b30 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
19b40 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
19b50 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34      nFree = get4
19b60 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
19b70 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
19b80 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44     nFin = finalD
19b90 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67  bSize(pBt, nOrig
19ba0 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69 66  , nFree);.    if
19bb0 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72  ( nFin>nOrig ) r
19bc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
19bd0 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 20 20  RUPT_BKPT;..    
19be0 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b  for(iFree=nOrig;
19bf0 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72   iFree>nFin && r
19c00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46  c==SQLITE_OK; iF
19c10 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63  ree--){.      rc
19c20 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
19c30 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72  p(pBt, nFin, iFr
19c40 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  ee, 1);.    }.  
19c50 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54    if( (rc==SQLIT
19c60 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51  E_DONE || rc==SQ
19c70 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65  LITE_OK) && nFre
19c80 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  e>0 ){.      rc 
19c90 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
19ca0 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  ite(pBt->pPage1-
19cb0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
19cc0 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
19cd0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
19ce0 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74  ], 0);.      put
19cf0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
19d00 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30  e1->aData[36], 0
19d10 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
19d20 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
19d30 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29  aData[28], nFin)
19d40 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 44 6f  ;.      pBt->bDo
19d50 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20  Truncate = 1;.  
19d60 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
19d70 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20   nFin;.    }.   
19d80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19d90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
19da0 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
19db0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
19dc0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e    }..  assert( n
19dd0 52 65 66 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  Ref==sqlite3Page
19de0 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72  rRefcount(pPager
19df0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
19e00 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66  ;.}..#else /* if
19e10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19e20 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23  _AUTOVACUUM */.#
19e30 20 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64   define setChild
19e40 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54  Ptrmaps(x) SQLIT
19e50 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  E_OK.#endif../*.
19e60 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
19e70 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
19e80 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68  hase of a two-ph
19e90 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69  ase commit.  Thi
19ea0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75  s routine.** cau
19eb0 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  ses a rollback j
19ec0 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65  ournal to be cre
19ed0 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73  ated (if it does
19ee0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
19ef0 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c  st).** and popul
19f00 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68  ated with enough
19f10 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20   information so 
19f20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20  that if a power 
19f30 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74  loss occurs.** t
19f40 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  he database can 
19f50 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  be restored to i
19f60 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
19f70 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63  e by playing bac
19f80 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k.** the journal
19f90 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74  .  Then the cont
19fa0 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ents of the jour
19fb0 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20  nal are flushed 
19fc0 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69  out to.** the di
19fd0 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a  sk.  After the j
19fe0 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79  ournal is safely
19ff0 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63   on oxide, the c
1a000 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a  hanges to the.**
1a010 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72   database are wr
1a020 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64  itten into the d
1a030 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
1a040 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64   flushed to oxid
1a050 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64  e..** At the end
1a060 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74   of this call, t
1a070 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
1a080 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73  nal still exists
1a090 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20   on the.** disk 
1a0a0 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c  and we are still
1a0b0 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63   holding all loc
1a0c0 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73  ks, so the trans
1a0d0 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a  action has not.*
1a0e0 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65  * committed.  Se
1a0f0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
1a100 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 66  mmitPhaseTwo() f
1a110 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68  or the second ph
1a120 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f  ase of the.** co
1a130 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  mmit process..**
1a140 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73  .** This call is
1a150 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77   a no-op if no w
1a160 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1a170 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63   is currently ac
1a180 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a  tive on pBt..**.
1a190 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79  ** Otherwise, sy
1a1a0 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
1a1b0 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72  file for the btr
1a1c0 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20  ee pBt. zMaster 
1a1d0 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
1a1e0 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
1a1f0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
1a200 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72  hat should be wr
1a210 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a  itten into the.*
1a220 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  * individual jou
1a230 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73  rnal file, or is
1a240 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e   NULL, indicatin
1a250 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  g no master jour
1a260 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69  nal file .** (si
1a270 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
1a280 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a  ansaction)..**.*
1a290 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63  * When this is c
1a2a0 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65  alled, the maste
1a2b0 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64  r journal should
1a2c0 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65   already have be
1a2d0 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70  en.** created, p
1a2e0 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68  opulated with th
1a2f0 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  is journal point
1a300 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f  er and synced to
1a310 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63   disk..**.** Onc
1a320 65 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e  e this is routin
1a330 65 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20  e has returned, 
1a340 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72  the only thing r
1a350 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69  equired to commi
1a360 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74  t.** the write-t
1a370 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74  ransaction for t
1a380 68 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c  his database fil
1a390 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74  e is to delete t
1a3a0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69  he journal..*/.i
1a3b0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1a3c0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74  ommitPhaseOne(Bt
1a3d0 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ree *p, const ch
1a3e0 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
1a3f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1a400 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  OK;.  if( p->inT
1a410 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1a420 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  E ){.    BtShare
1a430 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1a440 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1a450 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64  eEnter(p);.#ifnd
1a460 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1a470 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
1a480 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
1a490 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  m ){.      rc = 
1a4a0 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
1a4b0 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28  (pBt);.      if(
1a4c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a4d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1a4e0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1a4f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1a500 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1a510 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44  .    if( pBt->bD
1a520 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20  oTruncate ){.   
1a530 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54     sqlite3PagerT
1a540 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74  runcateImage(pBt
1a550 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e  ->pPager, pBt->n
1a560 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Page);.    }.#en
1a570 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  dif.    rc = sql
1a580 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1a590 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61  haseOne(pBt->pPa
1a5a0 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  ger, zMaster, 0)
1a5b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1a5c0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
1a5d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a5e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1a5f0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72  ion is called fr
1a600 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d  om both BtreeCom
1a610 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e  mitPhaseTwo() an
1a620 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  d BtreeRollback(
1a630 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63  ).** at the conc
1a640 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e  lusion of a tran
1a650 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
1a660 69 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64  ic void btreeEnd
1a670 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65  Transaction(Btre
1a680 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
1a690 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1a6a0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1a6b0 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
1a6c0 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66  x(p) );..#ifndef
1a6d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1a6e0 4f 56 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e 62  OVACUUM.  pBt->b
1a6f0 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 30 3b 0a  DoTruncate = 0;.
1a700 23 65 6e 64 69 66 0a 20 20 62 74 72 65 65 43 6c  #endif.  btreeCl
1a710 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
1a720 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  t);.  if( p->inT
1a730 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  rans>TRANS_NONE 
1a740 26 26 20 70 2d 3e 64 62 2d 3e 61 63 74 69 76 65  && p->db->active
1a750 56 64 62 65 43 6e 74 3e 31 20 29 7b 0a 20 20 20  VdbeCnt>1 ){.   
1a760 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
1a770 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73 74   other active st
1a780 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65  atements that be
1a790 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74  long to this dat
1a7a0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e  abase.    ** han
1a7b0 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74  dle, downgrade t
1a7c0 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72  o a read-only tr
1a7d0 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f  ansaction. The o
1a7e0 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a  ther statements.
1a7f0 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c      ** may still
1a800 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d   be reading from
1a810 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1a820 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65  */.    downgrade
1a830 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
1a840 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
1a850 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
1a860 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73  ANS_READ;.  }els
1a870 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  e{.    /* If the
1a880 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20   handle had any 
1a890 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74  kind of transact
1a8a0 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d  ion open, decrem
1a8b0 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ent the .    ** 
1a8c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1a8d0 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20  t of the shared 
1a8e0 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72  btree. If the tr
1a8f0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20  ansaction count 
1a900 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20  .    ** reaches 
1a910 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72 65  0, set the share
1a920 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
1a930 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63  _NONE. The unloc
1a940 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29  kBtreeIfUnused()
1a950 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c  .    ** call bel
1a960 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74  ow will unlock t
1a970 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20  he pager.  */.  
1a980 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1a990 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  !=TRANS_NONE ){.
1a9a0 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68        clearAllSh
1a9b0 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1a9c0 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42  cks(p);.      pB
1a9d0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
1a9e0 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  -;.      if( 0==
1a9f0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
1aa00 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  n ){.        pBt
1aa10 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1aa20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
1aa30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1aa40 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 72   /* Set the curr
1aa50 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1aa60 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
1aa70 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ONE and unlock t
1aa80 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  he .    ** pager
1aa90 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c   if this call cl
1aaa0 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65  osed the only re
1aab0 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
1aac0 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  saction.  */.   
1aad0 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
1aae0 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e  ANS_NONE;.    un
1aaf0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
1ab00 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  d(pBt);.  }..  b
1ab10 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
1ab20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
1ab30 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
1ab40 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70  n currently in p
1ab50 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  rogress..**.** T
1ab60 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
1ab70 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e  ements the secon
1ab80 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70  d phase of a 2-p
1ab90 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
1aba0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  e.** sqlite3Btre
1abb0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
1abc0 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  ) routine does t
1abd0 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61  he first phase a
1abe0 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nd should.** be 
1abf0 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f  invoked prior to
1ac00 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
1ac10 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69  utine.  The sqli
1ac20 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1ac30 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74  aseOne().** rout
1ac40 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20  ine did all the 
1ac50 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20  work of writing 
1ac60 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20  information out 
1ac70 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73  to disk and flus
1ac80 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  hing the.** cont
1ac90 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65  ents so that the
1aca0 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e  y are written on
1acb0 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74  to the disk plat
1acc0 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a  ter.  All this.*
1acd0 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f  * routine has to
1ace0 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72   do is delete or
1acf0 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72   truncate or zer
1ad00 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e 20  o the header in 
1ad10 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  the.** the rollb
1ad20 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69  ack journal (whi
1ad30 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72  ch causes the tr
1ad40 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d  ansaction to com
1ad50 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70  mit) and.** drop
1ad60 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   locks..**.** No
1ad70 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72  rmally, if an er
1ad80 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
1ad90 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
1ada0 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74   is attempting t
1adb0 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74  o .** finalize t
1adc0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f  he underlying jo
1add0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69 73  urnal file, this
1ade0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1adf0 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a  s an error and.*
1ae00 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  * the upper laye
1ae10 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 61  r will attempt a
1ae20 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76   rollback. Howev
1ae30 65 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e  er, if the secon
1ae40 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73  d argument.** is
1ae50 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74   non-zero then t
1ae60 68 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e 73  his b-tree trans
1ae70 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f  action is part o
1ae80 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a  f a multi-file .
1ae90 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
1aea0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  In this case, th
1aeb0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
1aec0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
1aed0 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62 79  ommitted .** (by
1aee0 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73 74   deleting a mast
1aef0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  er journal file)
1af00 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20   and the caller 
1af10 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69 73  will ignore this
1af20 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72   .** functions r
1af30 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20  eturn code. So, 
1af40 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72  even if an error
1af50 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 70   occurs in the p
1af60 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72  ager layer,.** r
1af70 65 73 65 74 20 74 68 65 20 62 2d 74 72 65 65 20  eset the b-tree 
1af80 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61 6c  objects internal
1af90 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63 61   state to indica
1afa0 74 65 20 74 68 61 74 20 74 68 65 20 77 72 69 74  te that the writ
1afb0 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
1afc0 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64   has been closed
1afd0 2e 20 54 68 69 73 20 69 73 20 71 75 69 74 65 20  . This is quite 
1afe0 73 61 66 65 2c 20 61 73 20 74 68 65 20 70 61 67  safe, as the pag
1aff0 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20  er will have.** 
1b000 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20  transitioned to 
1b010 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
1b020 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
1b030 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
1b040 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
1b050 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
1b060 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
1b070 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
1b080 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
1b090 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
1b0a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b0b0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1b0c0 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  Two(Btree *p, in
1b0d0 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20  t bCleanup){..  
1b0e0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
1b0f0 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74  TRANS_NONE ) ret
1b100 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1b110 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1b120 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e  er(p);.  btreeIn
1b130 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f  tegrity(p);..  /
1b140 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20  * If the handle 
1b150 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e  has a write-tran
1b160 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f  saction open, co
1b170 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64 2d  mmit the shared-
1b180 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61  btrees .  ** tra
1b190 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74  nsaction and set
1b1a0 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
1b1b0 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e  e to TRANS_READ.
1b1c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
1b1d0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1b1e0 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ITE ){.    int r
1b1f0 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  c;.    BtShared 
1b200 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1b210 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
1b220 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1b230 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
1b240 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
1b250 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b  Transaction>0 );
1b260 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1b270 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1b280 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72  eTwo(pBt->pPager
1b290 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1b2a0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65  QLITE_OK && bCle
1b2b0 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  anup==0 ){.     
1b2c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1b2d0 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74  ve(p);.      ret
1b2e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1b2f0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
1b300 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
1b310 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45  D;.  }..  btreeE
1b320 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29  ndTransaction(p)
1b330 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1b340 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1b350 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1b360 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70  ./*.** Do both p
1b370 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69  hases of a commi
1b380 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1b390 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72  3BtreeCommit(Btr
1b3a0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
1b3b0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1b3c0 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
1b3d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1b3e0 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30  mitPhaseOne(p, 0
1b3f0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1b400 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1b410 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
1b420 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 2c  ommitPhaseTwo(p,
1b430 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
1b440 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1b450 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1b460 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1b470 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1b480 20 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74 65   number of write
1b490 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e  -cursors open on
1b4a0 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54 68   this handle. Th
1b4b0 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a  is is for use.**
1b4c0 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70   in assert() exp
1b4d0 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20  ressions, so it 
1b4e0 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64  is only compiled
1b4f0 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f   if NDEBUG is no
1b500 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a  t.** defined..**
1b510 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
1b520 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75  oses of this rou
1b530 74 69 6e 65 2c 20 61 20 77 72 69 74 65 2d 63 75  tine, a write-cu
1b540 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73  rsor is any curs
1b550 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61  or that.** is ca
1b560 70 61 62 6c 65 20 6f 66 20 77 72 69 74 69 6e 67  pable of writing
1b570 20 74 6f 20 74 68 65 20 64 61 74 61 62 73 65 2e   to the databse.
1b580 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 65    That means the
1b590 20 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f   cursor was.** o
1b5a0 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64  riginally opened
1b5b0 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 64   for writing and
1b5c0 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20   the cursor has 
1b5d0 6e 6f 74 20 62 65 20 64 69 73 61 62 6c 65 64 0a  not be disabled.
1b5e0 2a 2a 20 62 79 20 68 61 76 69 6e 67 20 69 74 73  ** by having its
1b5f0 20 73 74 61 74 65 20 63 68 61 6e 67 65 64 20 74   state changed t
1b600 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a  o CURSOR_FAULT..
1b610 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
1b620 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28  untWriteCursors(
1b630 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
1b640 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
1b650 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20  ;.  int r = 0;. 
1b660 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70   for(pCur=pBt->p
1b670 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43  Cursor; pCur; pC
1b680 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b  ur=pCur->pNext){
1b690 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 77  .    if( pCur->w
1b6a0 72 46 6c 61 67 20 26 26 20 70 43 75 72 2d 3e 65  rFlag && pCur->e
1b6b0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41  State!=CURSOR_FA
1b6c0 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a  ULT ) r++; .  }.
1b6d0 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65    return r;.}.#e
1b6e0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
1b6f0 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
1b700 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f  e state to CURSO
1b710 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20  R_FAULT and the 
1b720 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f  error.** code to
1b730 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65   errCode for eve
1b740 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74 53  ry cursor on BtS
1b750 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65  hared that pBtre
1b760 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e  e.** references.
1b770 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72  .**.** Every cur
1b780 73 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c 20  sor is tripped, 
1b790 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72  including cursor
1b7a0 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a  s that belong.**
1b7b0 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61   to other databa
1b7c0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
1b7d0 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65  hat happen to be
1b7e0 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20   sharing.** the 
1b7f0 63 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65  cache with pBtre
1b800 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
1b810 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65  utine gets calle
1b820 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63  d when a rollbac
1b830 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c  k occurs..** All
1b840 20 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20 74   cursors using t
1b850 68 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d 75  he same cache mu
1b860 73 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a 2a  st be tripped.**
1b870 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d   to prevent them
1b880 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20   from trying to 
1b890 75 73 65 20 74 68 65 20 62 74 72 65 65 20 61 66  use the btree af
1b8a0 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  ter.** the rollb
1b8b0 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61  ack.  The rollba
1b8c0 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c 65  ck may have dele
1b8d0 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72  ted tables.** or
1b8e0 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67 65   moved root page
1b8f0 73 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20  s, so it is not 
1b900 73 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a  sufficient to.**
1b910 20 73 61 76 65 20 74 68 65 20 73 74 61 74 65 20   save the state 
1b920 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20  of the cursor.  
1b930 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20  The cursor must 
1b940 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65  be.** invalidate
1b950 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
1b960 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
1b970 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74  rsors(Btree *pBt
1b980 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65  ree, int errCode
1b990 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
1b9a0 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 3d 3d  ;.  if( pBtree==
1b9b0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71  0 ) return;.  sq
1b9c0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1b9d0 70 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28 70  pBtree);.  for(p
1b9e0 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
1b9f0 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
1ba00 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69  Next){.    int i
1ba10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1ba20 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29  eeClearCursor(p)
1ba30 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20  ;.    p->eState 
1ba40 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a  = CURSOR_FAULT;.
1ba50 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20      p->skipNext 
1ba60 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 66  = errCode;.    f
1ba70 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50  or(i=0; i<=p->iP
1ba80 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
1ba90 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e   releasePage(p->
1baa0 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
1bab0 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d    p->apPage[i] =
1bac0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
1bad0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1bae0 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a  e(pBtree);.}../*
1baf0 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65  .** Rollback the
1bb00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
1bb10 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63  progress.  All c
1bb20 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a  ursors will be.*
1bb30 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74  * invalided by t
1bb40 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  his operation.  
1bb50 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
1bb60 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74  se a cursor.** t
1bb70 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20  hat was open at 
1bb80 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
1bb90 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
1bba0 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69  will result.** i
1bbb0 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  n an error..**.*
1bbc0 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
1bbd0 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
1bbe0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1bbf0 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
1bc00 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
1bc10 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
1bc20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
1bc30 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
1bc40 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1bc50 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a  Rollback(Btree *
1bc60 70 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 29  p, int tripCode)
1bc70 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
1bc80 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1bc90 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
1bca0 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69  *pPage1;..  sqli
1bcb0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1bcc0 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65  ;.  if( tripCode
1bcd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1bce0 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f 64 65     rc = tripCode
1bcf0 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
1bd00 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
1bd10 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
1bd20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1bd30 20 69 66 28 20 74 72 69 70 43 6f 64 65 20 29 7b   if( tripCode ){
1bd40 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1bd50 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
1bd60 70 2c 20 74 72 69 70 43 6f 64 65 29 3b 0a 20 20  p, tripCode);.  
1bd70 7d 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  }.  btreeIntegri
1bd80 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d  ty(p);..  if( p-
1bd90 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1bda0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
1bdb0 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72   rc2;..    asser
1bdc0 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d  t( TRANS_WRITE==
1bdd0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1bde0 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20  on );.    rc2 = 
1bdf0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
1be00 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72  back(pBt->pPager
1be10 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d  );.    if( rc2!=
1be20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1be30 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
1be40 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72   }..    /* The r
1be50 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65  ollback may have
1be60 20 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70   destroyed the p
1be70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c  Page1->aData val
1be80 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63  ue.  So.    ** c
1be90 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67 65  all btreeGetPage
1bea0 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61  () on page 1 aga
1beb0 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a  in to make.    *
1bec0 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61  * sure pPage1->a
1bed0 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72  Data is set corr
1bee0 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66  ectly. */.    if
1bef0 28 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  ( btreeGetPage(p
1bf00 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
1bf10 30 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0, 0)==SQLITE_OK
1bf20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   ){.      int nP
1bf30 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32  age = get4byte(2
1bf40 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  8+(u8*)pPage1->a
1bf50 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73  Data);.      tes
1bf60 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20  tcase( nPage==0 
1bf70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61  );.      if( nPa
1bf80 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50  ge==0 ) sqlite3P
1bf90 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
1bfa0 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
1bfb0 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
1bfc0 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  se( pBt->nPage!=
1bfd0 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70  nPage );.      p
1bfe0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67  Bt->nPage = nPag
1bff0 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  e;.      release
1c000 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
1c010 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1c020 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72  countWriteCursor
1c030 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20  s(pBt)==0 );.   
1c040 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1c050 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
1c060 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e  ;.  }..  btreeEn
1c070 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b  dTransaction(p);
1c080 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1c090 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1c0a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
1c0b0 74 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74  tart a statement
1c0c0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
1c0d0 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
1c0e0 69 6f 6e 20 63 61 6e 20 63 61 6e 20 62 65 20 72  ion can can be r
1c0f0 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e  olled.** back in
1c100 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74  dependently of t
1c110 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
1c120 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74  ion. You must st
1c130 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
1c140 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61  n .** before sta
1c150 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73  rting a subtrans
1c160 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74  action. The subt
1c170 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e  ransaction is en
1c180 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ded automaticall
1c190 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69  y .** if the mai
1c1a0 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  n transaction co
1c1b0 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62  mmits or rolls b
1c1c0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65  ack..**.** State
1c1d0 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
1c1e0 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72  ions are used ar
1c1f0 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20  ound individual 
1c200 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  SQL statements.*
1c210 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61  * that are conta
1c220 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45  ined within a BE
1c230 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f  GIN...COMMIT blo
1c240 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72  ck.  If a constr
1c250 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63  aint.** error oc
1c260 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
1c270 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65  statement, the e
1c280 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e  ffect of that on
1c290 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63  e statement.** c
1c2a0 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
1c2b0 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
1c2c0 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
1c2d0 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
1c2e0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61  ion..**.** A sta
1c2f0 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73  tement sub-trans
1c300 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  action is implem
1c310 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e  ented as an anon
1c320 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e  ymous savepoint.
1c330 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61   The.** value pa
1c340 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
1c350 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
1c360 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
1c370 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a   of savepoints,.
1c380 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  ** including the
1c390 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73   new anonymous s
1c3a0 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f  avepoint, open o
1c3b0 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e  n the B-Tree. i.
1c3c0 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61  e. if there.** a
1c3d0 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76  re no active sav
1c3e0 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f  epoints and no o
1c3f0 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74  ther statement-t
1c400 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e  ransactions open
1c410 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20  ,.** iStatement 
1c420 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79  is 1. This anony
1c430 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63  mous savepoint c
1c440 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f  an be released o
1c450 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a  r rolled back.**
1c460 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74   using the sqlit
1c470 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
1c480 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
1c490 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1c4a0 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20  BeginStmt(Btree 
1c4b0 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65  *p, int iStateme
1c4c0 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  nt){.  int rc;. 
1c4d0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1c4e0 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
1c4f0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1c500 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
1c510 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1c520 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
1c530 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1c540 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d   BTS_READ_ONLY)=
1c550 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1c560 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a  iStatement>0 );.
1c570 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
1c580 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76  ment>p->db->nSav
1c590 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65  epoint );.  asse
1c5a0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
1c5b0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1c5c0 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74  ITE );.  /* At t
1c5d0 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20  he pager level, 
1c5e0 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
1c5f0 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76  saction is a sav
1c600 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a  epoint with.  **
1c610 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65   an index greate
1c620 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70  r than all savep
1c630 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65 78  oints created ex
1c640 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20  plicitly using. 
1c650 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   ** SQL statemen
1c660 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61  ts. It is illega
1c670 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61  l to open, relea
1c680 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61  se or rollback a
1c690 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76  ny.  ** such sav
1c6a0 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68  epoints while th
1c6b0 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
1c6c0 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e  saction savepoin
1c6d0 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a  t is active..  *
1c6e0 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
1c6f0 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
1c700 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
1c710 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73  iStatement);.  s
1c720 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1c730 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1c740 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
1c750 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
1c760 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
1c770 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53   op, is always S
1c780 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
1c790 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e  K.** or SAVEPOIN
1c7a0 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20  T_RELEASE. This 
1c7b0 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20  function either 
1c7c0 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c  releases or roll
1c7d0 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61  s back the.** sa
1c7e0 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69  vepoint identifi
1c7f0 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
1c800 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65  iSavepoint, depe
1c810 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c  nding on the val
1c820 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a  ue .** of op..**
1c830 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53  .** Normally, iS
1c840 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61  avepoint is grea
1c850 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
1c860 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76  l to zero. Howev
1c870 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20  er, if op is.** 
1c880 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
1c890 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f  CK, then iSavepo
1c8a0 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20  int may also be 
1c8b0 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  -1. In this case
1c8c0 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
1c8d0 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  s of the entire 
1c8e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20  transaction are 
1c8f0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69  rolled back. Thi
1c900 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a  s is different.*
1c910 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20  * from a normal 
1c920 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
1c930 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b  back, as no lock
1c940 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 20 61  s are released a
1c950 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61  nd the.** transa
1c960 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70  ction remains op
1c970 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  en..*/.int sqlit
1c980 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
1c990 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f  (Btree *p, int o
1c9a0 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  p, int iSavepoin
1c9b0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
1c9c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
1c9d0 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  p && p->inTrans=
1c9e0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
1c9f0 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
1ca00 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
1ca10 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45  assert( op==SAVE
1ca20 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c  POINT_RELEASE ||
1ca30 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
1ca40 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61  OLLBACK );.    a
1ca50 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e  ssert( iSavepoin
1ca60 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f  t>=0 || (iSavepo
1ca70 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53  int==-1 && op==S
1ca80 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
1ca90 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  K) );.    sqlite
1caa0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1cab0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1cac0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70  PagerSavepoint(p
1cad0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20  Bt->pPager, op, 
1cae0 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
1caf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1cb00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
1cb10 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20  iSavepoint<0 && 
1cb20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1cb30 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45   BTS_INITIALLY_E
1cb40 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  MPTY)!=0 ){.    
1cb50 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
1cb60 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1cb70 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
1cb80 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70  se(pBt);.      p
1cb90 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34  Bt->nPage = get4
1cba0 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70  byte(28 + pBt->p
1cbb0 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a  Page1->aData);..
1cbc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1cbd0 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 77  abase size was w
1cbe0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1cbf0 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74 68 65  offset 28 of the
1cc00 20 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a   header.      **
1cc10 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
1cc20 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73  ction started, s
1cc30 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  o we know that t
1cc40 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73  he value at offs
1cc50 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69  et.      ** 28 i
1cc60 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20  s nonzero. */.  
1cc70 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
1cc80 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20  >nPage>0 );.    
1cc90 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
1cca0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
1ccb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1ccc0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
1ccd0 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  ew cursor for th
1cce0 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f  e BTree whose ro
1ccf0 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67  ot is on the pag
1cd00 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20  e.** iTable. If 
1cd10 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
1cd20 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  or is requested,
1cd30 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
1cd40 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65  hat.** the calle
1cd50 72 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 74  r already has at
1cd60 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e   least a read-on
1cd70 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ly transaction o
1cd80 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61  pen.** on the da
1cd90 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20  tabase already. 
1cda0 49 66 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f  If a write-curso
1cdb0 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  r is requested, 
1cdc0 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  then.** the call
1cdd0 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  er is assumed to
1cde0 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72   have an open wr
1cdf0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
1ce00 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67  .**.** If wrFlag
1ce10 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ==0, then the cu
1ce20 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65  rsor can only be
1ce30 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
1ce40 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d  g..** If wrFlag=
1ce50 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  =1, then the cur
1ce60 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64 20  sor can be used 
1ce70 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66  for reading or f
1ce80 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66  or.** writing if
1ce90 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e   other condition
1cea0 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72  s for writing ar
1ceb0 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65  e also met.  The
1cec0 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f  se.** are the co
1ced0 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75  nditions that mu
1cee0 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64  st be met in ord
1cef0 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74  er for writing t
1cf00 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a  o.** be allowed:
1cf10 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63  .**.** 1:  The c
1cf20 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20  ursor must have 
1cf30 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68  been opened with
1cf40 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a   wrFlag==1.**.**
1cf50 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62   2:  Other datab
1cf60 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
1cf70 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73  that share the s
1cf80 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a  ame pager cache.
1cf90 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68  **     but which
1cfa0 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
1cfb0 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44  READ_UNCOMMITTED
1cfc0 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68   state may not h
1cfd0 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f  ave.**     curso
1cfe0 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46  rs open with wrF
1cff0 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61  lag==0 on the sa
1d000 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72  me table.  Other
1d010 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20  wise.**     the 
1d020 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20  changes made by 
1d030 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f  this write curso
1d040 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62  r would be visib
1d050 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65  le to.**     the
1d060 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e   read cursors in
1d070 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62   the other datab
1d080 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
1d090 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61  **.** 3:  The da
1d0a0 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77  tabase must be w
1d0b0 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20  ritable (not on 
1d0c0 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29  read-only media)
1d0d0 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65  .**.** 4:  There
1d0e0 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69   must be an acti
1d0f0 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ve transaction..
1d100 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e  **.** No checkin
1d110 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b  g is done to mak
1d120 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65  e sure that page
1d130 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69   iTable really i
1d140 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61  s the.** root pa
1d150 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20  ge of a b-tree. 
1d160 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   If it is not, t
1d170 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61  hen the cursor a
1d180 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20  cquired.** will 
1d190 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74  not work correct
1d1a0 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  ly..**.** It is 
1d1b0 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
1d1c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1d1d0 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65  sorZero() has be
1d1e0 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20  en called.** on 
1d1f0 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69  pCur to initiali
1d200 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70  ze the memory sp
1d210 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76  ace prior to inv
1d220 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  oking this routi
1d230 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ne..*/.static in
1d240 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20  t btreeCursor(. 
1d250 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
1d260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d270 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
1d280 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
1d290 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
1d2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2b0 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
1d2c0 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
1d2d0 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
1d2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
1d300 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
1d310 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
1d320 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
1d330 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
1d340 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
1d350 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  o comparison fun
1d360 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72  ction */.  BtCur
1d370 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
1d380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d390 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e    /* Space for n
1d3a0 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  ew cursor */.){.
1d3b0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1d3c0 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  = p->pBt;       
1d3d0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
1d3e0 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65  ed b-tree handle
1d3f0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
1d400 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
1d410 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
1d420 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
1d430 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a  || wrFlag==1 );.
1d440 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
1d450 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65  ing assert state
1d460 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74 68 61  ments verify tha
1d470 74 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73  t if this is a s
1d480 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d  harable .  ** b-
1d490 74 72 65 65 20 64 61 74 61 62 61 73 65 2c 20 74  tree database, t
1d4a0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  he connection is
1d4b0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71   holding the req
1d4c0 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b  uired table lock
1d4d0 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61  s, .  ** and tha
1d4e0 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  t no other conne
1d4f0 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70  ction has any op
1d500 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20 63  en cursor that c
1d510 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20  onflicts with . 
1d520 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20   ** this lock.  
1d530 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61 73  */.  assert( has
1d540 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1d550 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20  Lock(p, iTable, 
1d560 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46  pKeyInfo!=0, wrF
1d570 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65  lag+1) );.  asse
1d580 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
1d590 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
1d5a0 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b  ts(p, iTable) );
1d5b0 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
1d5c0 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
1d5d0 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71  s opened the req
1d5e0 75 69 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f  uired transactio
1d5f0 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  n. */.  assert( 
1d600 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53  p->inTrans>TRANS
1d610 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72  _NONE );.  asser
1d620 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
1d630 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1d640 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
1d650 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
1d660 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d   && pBt->pPage1-
1d670 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28  >aData );..  if(
1d680 20 4e 45 56 45 52 28 77 72 46 6c 61 67 20 26 26   NEVER(wrFlag &&
1d690 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1d6a0 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
1d6b0 21 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  !=0) ){.    retu
1d6c0 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
1d6d0 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54  LY;.  }.  if( iT
1d6e0 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65  able==1 && btree
1d6f0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d  Pagecount(pBt)==
1d700 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
1d710 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20   wrFlag==0 );.  
1d720 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20    iTable = 0;.  
1d730 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74  }..  /* Now that
1d740 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73   no other errors
1d750 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69   can occur, fini
1d760 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  sh filling in th
1d770 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20  e BtCursor.  ** 
1d780 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69  variables and li
1d790 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e  nk the cursor in
1d7a0 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20  to the BtShared 
1d7b0 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72  list.  */.  pCur
1d7c0 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67  ->pgnoRoot = (Pg
1d7d0 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75  no)iTable;.  pCu
1d7e0 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20  r->iPage = -1;. 
1d7f0 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20   pCur->pKeyInfo 
1d800 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43  = pKeyInfo;.  pC
1d810 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ur->pBtree = p;.
1d820 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42    pCur->pBt = pB
1d830 74 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61  t;.  pCur->wrFla
1d840 67 20 3d 20 28 75 38 29 77 72 46 6c 61 67 3b 0a  g = (u8)wrFlag;.
1d850 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20    pCur->pNext = 
1d860 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
1d870 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  if( pCur->pNext 
1d880 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65  ){.    pCur->pNe
1d890 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72  xt->pPrev = pCur
1d8a0 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75  ;.  }.  pBt->pCu
1d8b0 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70  rsor = pCur;.  p
1d8c0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
1d8d0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
1d8e0 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69  pCur->cachedRowi
1d8f0 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  d = 0;.  return 
1d900 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74  SQLITE_OK;.}.int
1d910 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1d920 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  sor(.  Btree *p,
1d930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d950 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
1d960 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
1d970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d990 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
1d9a0 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
1d9b0 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
1d9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9e0 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30  /* 1 to write. 0
1d9f0 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
1da00 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a  struct KeyInfo *
1da10 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20  pKeyInfo,       
1da20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1da30 69 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d  irst arg to xCom
1da40 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75  pare() */.  BtCu
1da50 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
1da60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da70 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1da80 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65   new cursor here
1da90 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
1daa0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1dab0 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
1dac0 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69  btreeCursor(p, i
1dad0 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70  Table, wrFlag, p
1dae0 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a  KeyInfo, pCur);.
1daf0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1db00 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1db10 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
1db20 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
1db30 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65   a BtCursor obje
1db40 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a  ct in bytes..**.
1db50 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63  ** This interfac
1db60 65 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20  es is needed so 
1db70 74 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75  that users of cu
1db80 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c  rsors can preall
1db90 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69  ocate.** suffici
1dba0 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68  ent storage to h
1dbb0 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54  old a cursor.  T
1dbc0 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65  he BtCursor obje
1dbd0 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20  ct is opaque.** 
1dbe0 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79  to users so they
1dbf0 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73   cannot do the s
1dc00 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76  izeof() themselv
1dc10 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63  es - they must c
1dc20 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  all.** this rout
1dc30 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ine..*/.int sqli
1dc40 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69  te3BtreeCursorSi
1dc50 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75  ze(void){.  retu
1dc60 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  rn ROUND8(sizeof
1dc70 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a  (BtCursor));.}..
1dc80 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
1dc90 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c   memory that wil
1dca0 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  l be converted i
1dcb0 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f  nto a BtCursor o
1dcc0 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  bject..**.** The
1dcd0 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68   simple approach
1dce0 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74   here would be t
1dcf0 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65  o memset() the e
1dd00 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20  ntire object.** 
1dd10 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74  to zero.  But it
1dd20 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20   turns out that 
1dd30 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64  the apPage[] and
1dd40 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a   aiIdx[] arrays.
1dd50 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  ** do not need t
1dd60 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20  o be zeroed and 
1dd70 74 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20  they are large, 
1dd80 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20 61  so we can save a
1dd90 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74   lot.** of run-t
1dda0 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20  ime by skipping 
1ddb0 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
1ddc0 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d  on of those elem
1ddd0 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ents..*/.void sq
1dde0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1ddf0 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Zero(BtCursor *p
1de00 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  ){.  memset(p, 0
1de10 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72  , offsetof(BtCur
1de20 73 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a  sor, iPage));.}.
1de30 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  ./*.** Set the c
1de40 61 63 68 65 64 20 72 6f 77 69 64 20 76 61 6c 75  ached rowid valu
1de50 65 20 6f 66 20 65 76 65 72 79 20 63 75 72 73 6f  e of every curso
1de60 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  r in the same da
1de70 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61  tabase file.** a
1de80 73 20 70 43 75 72 20 61 6e 64 20 68 61 76 69 6e  s pCur and havin
1de90 67 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 20  g the same root 
1dea0 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20 70  page number as p
1deb0 43 75 72 2e 20 20 54 68 65 20 76 61 6c 75 65 20  Cur.  The value 
1dec0 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 69 52 6f  is.** set to iRo
1ded0 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  wid..**.** Only 
1dee0 70 6f 73 69 74 69 76 65 20 72 6f 77 69 64 20 76  positive rowid v
1def0 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64  alues are consid
1df00 65 72 65 64 20 76 61 6c 69 64 20 66 6f 72 20 74  ered valid for t
1df10 68 69 73 20 63 61 63 68 65 2e 0a 2a 2a 20 54 68  his cache..** Th
1df20 65 20 63 61 63 68 65 20 69 73 20 69 6e 69 74 69  e cache is initi
1df30 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2c 20  alized to zero, 
1df40 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e  indicating an in
1df50 76 61 6c 69 64 20 63 61 63 68 65 2e 0a 2a 2a 20  valid cache..** 
1df60 41 20 62 74 72 65 65 20 77 69 6c 6c 20 77 6f 72  A btree will wor
1df70 6b 20 66 69 6e 65 20 77 69 74 68 20 7a 65 72 6f  k fine with zero
1df80 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77   or negative row
1df90 69 64 73 2e 20 20 57 65 20 6a 75 73 74 20 63 61  ids.  We just ca
1dfa0 6e 6e 6f 74 0a 2a 2a 20 63 61 63 68 65 20 7a 65  nnot.** cache ze
1dfb0 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72  ro or negative r
1dfc0 6f 77 69 64 73 2c 20 77 68 69 63 68 20 6d 65 61  owids, which mea
1dfd0 6e 73 20 74 61 62 6c 65 73 20 74 68 61 74 20 75  ns tables that u
1dfe0 73 65 20 7a 65 72 6f 20 6f 72 0a 2a 2a 20 6e 65  se zero or.** ne
1dff0 67 61 74 69 76 65 20 72 6f 77 69 64 73 20 6d 69  gative rowids mi
1e000 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65  ght run a little
1e010 20 73 6c 6f 77 65 72 2e 20 20 42 75 74 20 69 6e   slower.  But in
1e020 20 70 72 61 63 74 69 63 65 2c 20 7a 65 72 6f 0a   practice, zero.
1e030 2a 2a 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72  ** or negative r
1e040 6f 77 69 64 73 20 61 72 65 20 76 65 72 79 20 75  owids are very u
1e050 6e 63 6f 6d 6d 6f 6e 20 73 6f 20 74 68 69 73 20  ncommon so this 
1e060 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20  should not be a 
1e070 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64  problem..*/.void
1e080 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
1e090 43 61 63 68 65 64 52 6f 77 69 64 28 42 74 43 75  CachedRowid(BtCu
1e0a0 72 73 6f 72 20 2a 70 43 75 72 2c 20 73 71 6c 69  rsor *pCur, sqli
1e0b0 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64  te3_int64 iRowid
1e0c0 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
1e0d0 3b 0a 20 20 66 6f 72 28 70 3d 70 43 75 72 2d 3e  ;.  for(p=pCur->
1e0e0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
1e0f0 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
1e100 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f    if( p->pgnoRoo
1e110 74 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t==pCur->pgnoRoo
1e120 74 20 29 20 70 2d 3e 63 61 63 68 65 64 52 6f 77  t ) p->cachedRow
1e130 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d  id = iRowid;.  }
1e140 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1e150 3e 63 61 63 68 65 64 52 6f 77 69 64 3d 3d 69 52  >cachedRowid==iR
1e160 6f 77 69 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  owid );.}../*.**
1e170 20 52 65 74 75 72 6e 20 74 68 65 20 63 61 63 68   Return the cach
1e180 65 64 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  ed rowid for the
1e190 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2e 20 20   given cursor.  
1e1a0 41 20 6e 65 67 61 74 69 76 65 20 6f 72 20 7a 65  A negative or ze
1e1b0 72 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  ro.** return val
1e1c0 75 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ue indicates tha
1e1d0 74 20 74 68 65 20 72 6f 77 69 64 20 63 61 63 68  t the rowid cach
1e1e0 65 20 69 73 20 69 6e 76 61 6c 69 64 20 61 6e 64  e is invalid and
1e1f0 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 67   should be.** ig
1e200 6e 6f 72 65 64 2e 20 20 49 66 20 74 68 65 20 72  nored.  If the r
1e210 6f 77 69 64 20 63 61 63 68 65 20 68 61 73 20 6e  owid cache has n
1e220 65 76 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e  ever before been
1e230 20 73 65 74 2c 20 74 68 65 6e 20 61 0a 2a 2a 20   set, then a.** 
1e240 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
1e250 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74  ..*/.sqlite3_int
1e260 36 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  64 sqlite3BtreeG
1e270 65 74 43 61 63 68 65 64 52 6f 77 69 64 28 42 74  etCachedRowid(Bt
1e280 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1e290 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 63 61   return pCur->ca
1e2a0 63 68 65 64 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a  chedRowid;.}../*
1e2b0 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73  .** Close a curs
1e2c0 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f  or.  The read lo
1e2d0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1e2e0 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61  se file is relea
1e2f0 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  sed.** when the 
1e300 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63  last cursor is c
1e310 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  losed..*/.int sq
1e320 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
1e330 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
1e340 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a  pCur){.  Btree *
1e350 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70  pBtree = pCur->p
1e360 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74  Btree;.  if( pBt
1e370 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ree ){.    int i
1e380 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  ;.    BtShared *
1e390 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
1e3a0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1e3b0 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
1e3c0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1e3d0 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72  ClearCursor(pCur
1e3e0 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
1e3f0 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  >pPrev ){.      
1e400 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  pCur->pPrev->pNe
1e410 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  xt = pCur->pNext
1e420 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e430 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
1e440 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
1e450 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
1e460 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
1e470 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70    pCur->pNext->p
1e480 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72  Prev = pCur->pPr
1e490 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ev;.    }.    fo
1e4a0 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e  r(i=0; i<=pCur->
1e4b0 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
1e4c0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1e4d0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b  Cur->apPage[i]);
1e4e0 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63  .    }.    unloc
1e4f0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
1e500 42 74 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64  Bt);.    invalid
1e510 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
1e520 28 70 43 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73  (pCur);.    /* s
1e530 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
1e540 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ); */.    sqlite
1e550 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
1e560 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ee);.  }.  retur
1e570 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1e580 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
1e590 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69  the BtCursor* gi
1e5a0 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
1e5b0 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a  ent has a valid.
1e5c0 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  ** BtCursor.info
1e5d0 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20   structure.  If 
1e5e0 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
1e5f0 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a  y valid, call.**
1e600 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
1e610 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e  ) to fill it in.
1e620 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  .**.** BtCursor.
1e630 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20  info is a cache 
1e640 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  of the informati
1e650 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  on in the curren
1e660 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67  t cell..** Using
1e670 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75   this cache redu
1e680 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ces the number o
1e690 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65  f calls to btree
1e6a0 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a  ParseCell()..**.
1e6b0 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20  ** 2007-06-25:  
1e6c0 54 68 65 72 65 20 69 73 20 61 20 62 75 67 20 69  There is a bug i
1e6d0 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20  n some versions 
1e6e0 6f 66 20 4d 53 56 43 20 74 68 61 74 20 63 61 75  of MSVC that cau
1e6f0 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c  se the.** compil
1e700 65 72 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e  er to crash when
1e710 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69   getCellInfo() i
1e720 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
1e730 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74   a macro..** But
1e740 20 74 68 65 72 65 20 69 73 20 61 20 6d 65 61 73   there is a meas
1e750 75 72 65 61 62 6c 65 20 73 70 65 65 64 20 61 64  ureable speed ad
1e760 76 61 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67  vantage to using
1e770 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63   the macro on gc
1e780 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20  c.** (when less 
1e790 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a  compiler optimiz
1e7a0 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20  ations like -Os 
1e7b0 6f 72 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20  or -O0 are used 
1e7c0 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69  and the.** compi
1e7d0 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67  ler is not doing
1e7e0 20 61 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e   agressive inlin
1e7f0 69 6e 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65  ing.)  So we use
1e800 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e   a real function
1e810 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64  .** for MSVC and
1e820 20 61 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65   a macro for eve
1e830 72 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54  rything else.  T
1e840 69 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a  icket #2457..*/.
1e850 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
1e860 20 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73   static void ass
1e870 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  ertCellInfo(BtCu
1e880 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20  rsor *pCur){.   
1e890 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
1e8a0 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
1e8b0 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20  pCur->iPage;.   
1e8c0 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30   memset(&info, 0
1e8d0 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b  , sizeof(info));
1e8e0 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
1e8f0 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ell(pCur->apPage
1e900 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61  [iPage], pCur->a
1e910 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e  iIdx[iPage], &in
1e920 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  fo);.    assert(
1e930 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26   memcmp(&info, &
1e940 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65  pCur->info, size
1e950 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a  of(info))==0 );.
1e960 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66    }.#else.  #def
1e970 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  ine assertCellIn
1e980 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23 69 66  fo(x).#endif.#if
1e990 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f  def _MSC_VER.  /
1e9a0 2a 20 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e  * Use a real fun
1e9b0 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f  ction in MSVC to
1e9c0 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67   work around bug
1e9d0 73 20 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c  s in that compil
1e9e0 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  er. */.  static 
1e9f0 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f  void getCellInfo
1ea00 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1ea10 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
1ea20 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b  info.nSize==0 ){
1ea30 0a 20 20 20 20 20 20 69 6e 74 20 69 50 61 67 65  .      int iPage
1ea40 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
1ea50 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65        btreeParse
1ea60 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
1ea70 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61  e[iPage],pCur->a
1ea80 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75  iIdx[iPage],&pCu
1ea90 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  r->info);.      
1eaa0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1eab0 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
1eac0 20 20 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c        assertCell
1ead0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20  Info(pCur);.    
1eae0 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69  }.  }.#else /* i
1eaf0 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a  f not _MSC_VER *
1eb00 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d 61 63  /.  /* Use a mac
1eb10 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20  ro in all other 
1eb20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74 68 61  compilers so tha
1eb30 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  t the function i
1eb40 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65  s inlined */.#de
1eb50 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f  fine getCellInfo
1eb60 28 70 43 75 72 29 20 20 20 20 20 20 20 20 20 20  (pCur)          
1eb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb90 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1eba0 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
1ebb0 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20 20  Size==0 ){      
1ebc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebe0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1ebf0 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
1ec00 43 75 72 2d 3e 69 50 61 67 65 3b 20 20 20 20 20  Cur->iPage;     
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1ec40 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
1ec50 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
1ec60 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49  iPage],pCur->aiI
1ec70 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d  dx[iPage],&pCur-
1ec80 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20 20 20 70 43  >info); \.    pC
1ec90 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1eca0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1ecb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecd0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c           \.  }el
1ece0 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  se{             
1ecf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
1ed30 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
1ed40 43 75 72 29 3b 20 20 20 20 20 20 20 20 20 20 20  Cur);           
1ed50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed70 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d             \.  }
1ed80 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f  .#endif /* _MSC_
1ed90 56 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  VER */..#ifndef 
1eda0 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e  NDEBUG  /* The n
1edb0 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64  ext routine used
1edc0 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73   only within ass
1edd0 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1ede0 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e   */./*.** Return
1edf0 20 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76   true if the giv
1ee00 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76  en BtCursor is v
1ee10 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63  alid.  A valid c
1ee20 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20  ursor is one.** 
1ee30 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c  that is currentl
1ee40 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  y pointing to a 
1ee50 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d  row in a (non-em
1ee60 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54  pty) table..** T
1ee70 68 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63  his is a verific
1ee80 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73  ation routine is
1ee90 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69   used only withi
1eea0 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
1eeb0 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ments..*/.int sq
1eec0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1eed0 49 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72  IsValid(BtCursor
1eee0 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
1eef0 6e 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e  n pCur && pCur->
1ef00 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1ef10 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ALID;.}.#endif /
1ef20 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a  * NDEBUG */../*.
1ef30 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f  ** Set *pSize to
1ef40 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1ef50 20 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74   buffer needed t
1ef60 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65  o hold the value
1ef70 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66   of.** the key f
1ef80 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65  or the current e
1ef90 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75  ntry.  If the cu
1efa0 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
1efb0 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c  ting.** to a val
1efc0 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65  id entry, *pSize
1efd0 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a   is set to 0. .*
1efe0 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65  *.** For a table
1eff0 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59   with the INTKEY
1f000 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20   flag set, this 
1f010 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1f020 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c  the key.** itsel
1f030 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65  f, not the numbe
1f040 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
1f050 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e key..**.** The
1f060 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73   caller must pos
1f070 69 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72  ition the cursor
1f080 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69   prior to invoki
1f090 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
1f0a0 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  .** .** This rou
1f0b0 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tine cannot fail
1f0c0 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72 65 74  .  It always ret
1f0d0 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  urns SQLITE_OK. 
1f0e0 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
1f0f0 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43  BtreeKeySize(BtC
1f100 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
1f110 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65   *pSize){.  asse
1f120 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1f130 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1f140 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1f150 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
1f160 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
1f170 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1f180 49 44 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  ID );.  if( pCur
1f190 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
1f1a0 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  _VALID ){.    *p
1f1b0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Size = 0;.  }els
1f1c0 65 7b 0a 20 20 20 20 67 65 74 43 65 6c 6c 49 6e  e{.    getCellIn
1f1d0 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 2a 70  fo(pCur);.    *p
1f1e0 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66  Size = pCur->inf
1f1f0 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 72 65  o.nKey;.  }.  re
1f200 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f210 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53  }../*.** Set *pS
1f220 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ize to the numbe
1f230 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61  r of bytes of da
1f240 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20  ta in the entry 
1f250 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75  the.** cursor cu
1f260 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
1f270 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  o..**.** The cal
1f280 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74  ler must guarant
1f290 65 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ee that the curs
1f2a0 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
1f2b0 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20  o a non-NULL.** 
1f2c0 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e  valid entry.  In
1f2d0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
1f2e0 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64  e calling proced
1f2f0 75 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74  ure must guarant
1f300 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  ee.** that the c
1f310 75 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72  ursor has Cursor
1f320 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  .eState==CURSOR_
1f330 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69  VALID..**.** Fai
1f340 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73  lure is not poss
1f350 69 62 6c 65 2e 20 20 54 68 69 73 20 66 75 6e 63  ible.  This func
1f360 74 69 6f 6e 20 61 6c 77 61 79 73 20 72 65 74 75  tion always retu
1f370 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
1f380 2a 20 49 74 20 6d 69 67 68 74 20 6a 75 73 74 20  * It might just 
1f390 61 73 20 77 65 6c 6c 20 62 65 20 61 20 70 72 6f  as well be a pro
1f3a0 63 65 64 75 72 65 20 28 72 65 74 75 72 6e 69 6e  cedure (returnin
1f3b0 67 20 76 6f 69 64 29 20 62 75 74 20 77 65 20 63  g void) but we c
1f3c0 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72 65  ontinue.** to re
1f3d0 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
1f3e0 72 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 20  result code for 
1f3f0 68 69 73 74 6f 72 69 63 61 6c 20 72 65 61 73 6f  historical reaso
1f400 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ns..*/.int sqlit
1f410 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28  e3BtreeDataSize(
1f420 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1f430 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61  u32 *pSize){.  a
1f440 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1f450 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1f460 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1f470 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1f480 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65  VALID );.  getCe
1f490 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1f4a0 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
1f4b0 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 72 65 74  nfo.nData;.  ret
1f4c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1f4d0 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
1f4e0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
1f4f0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
1f500 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
1f510 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  e (parameter.** 
1f520 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63  ovfl), this func
1f530 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70  tion finds the p
1f540 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
1f550 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
1f560 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69  he .** linked li
1f570 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70  st of overflow p
1f580 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c  ages. If possibl
1f590 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61  e, it uses the a
1f5a0 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f  uto-vacuum.** po
1f5b0 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69  inter-map data i
1f5c0 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e  nstead of readin
1f5d0 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  g the content of
1f5e0 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f   page ovfl to do
1f5f0 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61   so. .**.** If a
1f600 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61  n error occurs a
1f610 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1f620 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
1f630 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a   Otherwise:.**.*
1f640 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
1f650 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76  r of the next ov
1f660 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
1f670 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69  he linked list i
1f680 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f  s .** written to
1f690 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20   *pPgnoNext. If 
1f6a0 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65  page ovfl is the
1f6b0 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74   last page in it
1f6c0 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73  s linked .** lis
1f6d0 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73  t, *pPgnoNext is
1f6e0 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a   set to zero. .*
1f6f0 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69  *.** If ppPage i
1f700 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20  s not NULL, and 
1f710 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
1f720 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63  he MemPage objec
1f730 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  t corresponding.
1f740 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  ** to page numbe
1f750 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61  r pOvfl was obta
1f760 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61  ined, then *ppPa
1f770 67 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ge is set to poi
1f780 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65  nt to that.** re
1f790 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74  ference. It is t
1f7a0 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
1f7b0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
1f7c0 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50  to call releaseP
1f7d0 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50  age().** on *ppP
1f7e0 61 67 65 20 74 6f 20 66 72 65 65 20 74 68 65 20  age to free the 
1f7f0 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f  reference. In no
1f800 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f   reference was o
1f810 62 74 61 69 6e 65 64 20 28 62 65 63 61 75 73 65  btained (because
1f820 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  .** the pointer-
1f830 6d 61 70 20 77 61 73 20 75 73 65 64 20 74 6f 20  map was used to 
1f840 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65  obtain the value
1f850 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29   for *pPgnoNext)
1f860 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67  , then.** *ppPag
1f870 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  e is set to zero
1f880 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f890 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
1f8a0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1f8b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f8c0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1f8d0 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f  file */.  Pgno o
1f8e0 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vfl,            
1f8f0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
1f900 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
1f910 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50  number */.  MemP
1f920 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
1f930 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1f940 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20   MemPage handle 
1f950 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f  (may be NULL) */
1f960 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65  .  Pgno *pPgnoNe
1f970 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  xt              
1f980 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65  /* OUT: Next ove
1f990 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
1f9a0 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e  r */.){.  Pgno n
1f9b0 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  ext = 0;.  MemPa
1f9c0 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20  ge *pPage = 0;. 
1f9d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1f9e0 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
1f9f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1fa00 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1fa10 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f  ;.  assert(pPgno
1fa20 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20  Next);..#ifndef 
1fa30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1fa40 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20  VACUUM.  /* Try 
1fa50 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74  to find the next
1fa60 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
1fa70 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67  rflow list using
1fa80 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61   the.  ** autova
1fa90 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70  cuum pointer-map
1faa0 20 70 61 67 65 73 2e 20 47 75 65 73 73 20 74 68   pages. Guess th
1fab0 61 74 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  at the next page
1fac0 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76   in .  ** the ov
1fad0 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70  erflow list is p
1fae0 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c  age number (ovfl
1faf0 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67 75 65  +1). If that gue
1fb00 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f  ss turns .  ** o
1fb10 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20  ut to be wrong, 
1fb20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61  fall back to loa
1fb30 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66  ding the data of
1fb40 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62   page .  ** numb
1fb50 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72  er ovfl to deter
1fb60 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61  mine the next pa
1fb70 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a  ge number..  */.
1fb80 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
1fb90 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
1fba0 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f  o pgno;.    Pgno
1fbb0 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31   iGuess = ovfl+1
1fbc0 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  ;.    u8 eType;.
1fbd0 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d  .    while( PTRM
1fbe0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
1fbf0 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73  Guess) || iGuess
1fc00 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
1fc10 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1fc20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20    iGuess++;.    
1fc30 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65 73  }..    if( iGues
1fc40 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75 6e  s<=btreePagecoun
1fc50 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  t(pBt) ){.      
1fc60 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
1fc70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79  Bt, iGuess, &eTy
1fc80 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20  pe, &pgno);.    
1fc90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1fca0 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54  _OK && eType==PT
1fcb0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26  RMAP_OVERFLOW2 &
1fcc0 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a  & pgno==ovfl ){.
1fcd0 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69          next = i
1fce0 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72  Guess;.        r
1fcf0 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
1fd00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1fd10 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
1fd20 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20  ert( next==0 || 
1fd30 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1fd40 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1fd50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1fd60 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
1fd70 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67  pBt, ovfl, &pPag
1fd80 65 2c 20 30 2c 20 28 70 70 50 61 67 65 3d 3d 30  e, 0, (ppPage==0
1fd90 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ));.    assert( 
1fda0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
1fdb0 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20   pPage==0 );.   
1fdc0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1fdd0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74  OK ){.      next
1fde0 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61 67   = get4byte(pPag
1fdf0 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d  e->aData);.    }
1fe00 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65  .  }..  *pPgnoNe
1fe10 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28  xt = next;.  if(
1fe20 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a   ppPage ){.    *
1fe30 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a  ppPage = pPage;.
1fe40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c    }else{.    rel
1fe50 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
1fe60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72  .  }.  return (r
1fe70 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f  c==SQLITE_DONE ?
1fe80 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29   SQLITE_OK : rc)
1fe90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  ;.}../*.** Copy 
1fea0 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
1feb0 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72  er to a page, or
1fec0 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20   from a page to 
1fed0 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  a buffer..**.** 
1fee0 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f  pPayload is a po
1fef0 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73 74  inter to data st
1ff00 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65  ored on database
1ff10 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a   page pDbPage..*
1ff20 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f  * If argument eO
1ff30 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  p is false, then
1ff40 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
1ff50 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a  data are copied.
1ff60 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64  ** from pPayload
1ff70 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70   to the buffer p
1ff80 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42 75  ointed at by pBu
1ff90 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72 75  f. If eOp is tru
1ffa0 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74  e,.** then sqlit
1ffb0 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
1ffc0 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50  s called on pDbP
1ffd0 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79  age and nByte by
1ffe0 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61  tes.** of data a
1fff0 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74  re copied from t
20000 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20 74  he buffer pBuf t
20010 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a  o pPayload..**.*
20020 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
20030 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
20040 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e  ss, otherwise an
20050 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
20060 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50  static int copyP
20070 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a  ayload(.  void *
20080 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20  pPayload,       
20090 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
200a0 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  o page data */. 
200b0 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
200c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
200d0 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
200e0 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20  */.  int nByte, 
200f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20100 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
20110 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69  s to copy */.  i
20120 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20  nt eOp,         
20130 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e           /* 0 ->
20140 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c   copy from page,
20150 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61   1 -> copy to pa
20160 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ge */.  DbPage *
20170 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20 20  pDbPage         
20180 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
20190 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f  ning pPayload */
201a0 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b  .){.  if( eOp ){
201b0 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74  .    /* Copy dat
201c0 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f  a from buffer to
201d0 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20 6f   page (a write o
201e0 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
201f0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
20200 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
20210 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
20220 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
20230 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
20240 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
20250 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c  (pPayload, pBuf,
20260 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65   nByte);.  }else
20270 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
20280 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20  ta from page to 
20290 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20 6f  buffer (a read o
202a0 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
202b0 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50   memcpy(pBuf, pP
202c0 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a  ayload, nByte);.
202d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
202e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
202f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
20300 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f  s used to read o
20310 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c  r overwrite payl
20320 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  oad information.
20330 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79  ** for the entry
20340 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20 63   that the pCur c
20350 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
20360 67 20 74 6f 2e 20 49 66 20 74 68 65 20 65 4f 70  g to. If the eOp
20370 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
20380 20 30 2c 20 74 68 69 73 20 69 73 20 61 20 72 65   0, this is a re
20390 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 28 64 61  ad operation (da
203a0 74 61 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a  ta copied into.*
203b0 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 20  * buffer pBuf). 
203c0 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  If it is non-zer
203d0 6f 2c 20 61 20 77 72 69 74 65 20 28 64 61 74 61  o, a write (data
203e0 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20   copied from.** 
203f0 62 75 66 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a  buffer pBuf)..**
20400 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22  .** A total of "
20410 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20 72  amt" bytes are r
20420 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62  ead or written b
20430 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66  eginning at "off
20440 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73  set"..** Data is
20450 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d   read to or from
20460 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
20470 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74  ..**.** The cont
20480 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f  ent being read o
20490 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20  r written might 
204a0 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61  appear on the ma
204b0 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65  in page.** or be
204c0 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f   scattered out o
204d0 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  n multiple overf
204e0 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a  low pages..**.**
204f0 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72   If the BtCursor
20500 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  .isIncrblobHandl
20510 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61  e flag is set, a
20520 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  nd the current.*
20530 2a 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75  * cursor entry u
20540 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ses one or more 
20550 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
20560 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
20570 20 61 6c 6c 6f 63 61 74 65 73 20 73 70 61 63 65   allocates space
20580 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20   for and lazily 
20590 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20 6f 76  popluates the ov
205a0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
205b0 20 0a 2a 2a 20 63 61 63 68 65 20 61 72 72 61 79   .** cache array
205c0 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72   (BtCursor.aOver
205d0 66 6c 6f 77 29 2e 20 53 75 62 73 65 71 75 65 6e  flow). Subsequen
205e0 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73  t calls use this
205f0 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d 61 6b  .** cache to mak
20600 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65  e seeking to the
20610 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74   supplied offset
20620 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e   more efficient.
20630 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f  .**.** Once an o
20640 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
20650 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
20660 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d   allocated, it m
20670 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  ay be.** invalid
20680 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68  ated if some oth
20690 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65 73  er cursor writes
206a0 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62   to the same tab
206b0 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65  le, or if.** the
206c0 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64   cursor is moved
206d0 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
206e0 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  row. Additionall
206f0 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  y, in auto-vacuu
20700 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66  m.** mode, the f
20710 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20  ollowing events 
20720 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61  may invalidate a
20730 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  n overflow page-
20740 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  list cache..**.*
20750 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65  *   * An increme
20760 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20  ntal vacuum,.** 
20770 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20    * A commit in 
20780 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c  auto_vacuum="ful
20790 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20  l" mode,.**   * 
207a0 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65  Creating a table
207b0 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f   (may require mo
207c0 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77  ving an overflow
207d0 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69   page)..*/.stati
207e0 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c  c int accessPayl
207f0 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
20800 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
20810 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
20820 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
20830 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66  from */.  u32 of
20840 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f  fset,          /
20850 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20  * Begin reading 
20860 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61  this far into pa
20870 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61  yload */.  u32 a
20880 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
20890 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e  /* Read this man
208a0 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73  y bytes */.  uns
208b0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66  igned char *pBuf
208c0 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62  , /* Write the b
208d0 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62  ytes into this b
208e0 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20  uffer */ .  int 
208f0 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20  eOp             
20900 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64   /* zero to read
20910 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72  . non-zero to wr
20920 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  ite. */.){.  uns
20930 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79  igned char *aPay
20940 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  load;.  int rc =
20950 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33   SQLITE_OK;.  u3
20960 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49  2 nKey;.  int iI
20970 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  dx = 0;.  MemPag
20980 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
20990 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
209a0 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70  age]; /* Btree p
209b0 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65  age of current e
209c0 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72  ntry */.  BtShar
209d0 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
209e0 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
209f0 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74        /* Btree t
20a00 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e  his cursor belon
20a10 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65  gs to */..  asse
20a20 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61  rt( pPage );.  a
20a30 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
20a40 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
20a50 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
20a60 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
20a70 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e  >iPage]<pPage->n
20a80 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
20a90 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
20aa0 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67  ex(pCur) );..  g
20ab0 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
20ac0 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70  ;.  aPayload = p
20ad0 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20  Cur->info.pCell 
20ae0 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65  + pCur->info.nHe
20af0 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28  ader;.  nKey = (
20b00 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20  pPage->intKey ? 
20b10 30 20 3a 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  0 : (int)pCur->i
20b20 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66  nfo.nKey);..  if
20b30 28 20 4e 45 56 45 52 28 6f 66 66 73 65 74 2b 61  ( NEVER(offset+a
20b40 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e  mt > nKey+pCur->
20b50 69 6e 66 6f 2e 6e 44 61 74 61 29 20 0a 20 20 20  info.nData) .   
20b60 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75  || &aPayload[pCu
20b70 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20  r->info.nLocal] 
20b80 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  > &pPage->aData[
20b90 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d  pBt->usableSize]
20ba0 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79  .  ){.    /* Try
20bb0 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77  ing to read or w
20bc0 72 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e  rite past the en
20bd0 64 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73  d of the data is
20be0 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
20bf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
20c00 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
20c10 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
20c20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61  data must be rea
20c30 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f  d/written to/fro
20c40 6d 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65  m the btree page
20c50 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66   itself. */.  if
20c60 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69  ( offset<pCur->i
20c70 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
20c80 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
20c90 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e     if( a+offset>
20ca0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
20cb0 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70  l ){.      a = p
20cc0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
20cd0 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d   - offset;.    }
20ce0 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61  .    rc = copyPa
20cf0 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b  yload(&aPayload[
20d00 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61  offset], pBuf, a
20d10 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44  , eOp, pPage->pD
20d20 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73  bPage);.    offs
20d30 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66  et = 0;.    pBuf
20d40 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d   += a;.    amt -
20d50 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = a;.  }else{.  
20d60 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72    offset -= pCur
20d70 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
20d80 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
20d90 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
20da0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33   ){.    const u3
20db0 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74  2 ovflSize = pBt
20dc0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
20dd0 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74  ;  /* Bytes cont
20de0 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67  ent per ovfl pag
20df0 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65  e */.    Pgno ne
20e00 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78  xtPage;..    nex
20e10 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
20e20 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d  (&aPayload[pCur-
20e30 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a  >info.nLocal]);.
20e40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20e50 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
20e60 20 20 2f 2a 20 49 66 20 74 68 65 20 69 73 49 6e    /* If the isIn
20e70 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61  crblobHandle fla
20e80 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65  g is set and the
20e90 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66   BtCursor.aOverf
20ea0 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73  low[].    ** has
20eb0 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
20ec0 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74  ted, allocate it
20ed0 20 6e 6f 77 2e 20 54 68 65 20 61 72 72 61 79 20   now. The array 
20ee0 69 73 20 73 69 7a 65 64 20 61 74 0a 20 20 20 20  is sized at.    
20ef0 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72  ** one entry for
20f00 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70   each overflow p
20f10 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
20f20 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 0a 20  low chain. The. 
20f30 20 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65     ** page numbe
20f40 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  r of the first o
20f50 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
20f60 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66  stored in aOverf
20f70 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65  low[0],.    ** e
20f80 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30  tc. A value of 0
20f90 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f   in the aOverflo
20fa0 77 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e 73 20  w[] array means 
20fb0 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a  "not yet known".
20fc0 20 20 20 20 2a 2a 20 28 74 68 65 20 63 61 63 68      ** (the cach
20fd0 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75  e is lazily popu
20fe0 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20  lated)..    */. 
20ff0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49     if( pCur->isI
21000 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26  ncrblobHandle &&
21010 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f   !pCur->aOverflo
21020 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  w ){.      int n
21030 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e  Ovfl = (pCur->in
21040 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72  fo.nPayload-pCur
21050 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76  ->info.nLocal+ov
21060 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69  flSize-1)/ovflSi
21070 7a 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  ze;.      pCur->
21080 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e  aOverflow = (Pgn
21090 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  o *)sqlite3Mallo
210a0 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e  cZero(sizeof(Pgn
210b0 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20  o)*nOvfl);.     
210c0 20 2f 2a 20 6e 4f 76 66 6c 20 69 73 20 61 6c 77   /* nOvfl is alw
210d0 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20 20 49  ays positive.  I
210e0 66 20 69 74 20 77 65 72 65 20 7a 65 72 6f 2c 20  f it were zero, 
210f0 66 65 74 63 68 50 61 79 6c 6f 61 64 20 77 6f 75  fetchPayload wou
21100 6c 64 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a  ld have.      **
21110 20 62 65 65 6e 20 75 73 65 64 20 69 6e 73 74 65   been used inste
21120 61 64 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ad of this routi
21130 6e 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ne. */.      if(
21140 20 41 4c 57 41 59 53 28 6e 4f 76 66 6c 29 20 26   ALWAYS(nOvfl) &
21150 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  & !pCur->aOverfl
21160 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ow ){.        rc
21170 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
21180 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
21190 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76      /* If the ov
211a0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
211b0 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20   cache has been 
211c0 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
211d0 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66  e.    ** entry f
211e0 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71  or the first req
211f0 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70  uired overflow p
21200 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b  age is valid, sk
21210 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  ip.    ** direct
21220 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f  ly to it..    */
21230 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61  .    if( pCur->a
21240 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72  Overflow && pCur
21250 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73  ->aOverflow[offs
21260 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a  et/ovflSize] ){.
21270 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66        iIdx = (of
21280 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a  fset/ovflSize);.
21290 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
212a0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
212b0 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66  [iIdx];.      of
212c0 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f  fset = (offset%o
212d0 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  vflSize);.    }.
212e0 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72 28  #endif..    for(
212f0 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   ; rc==SQLITE_OK
21300 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78   && amt>0 && nex
21310 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a  tPage; iIdx++){.
21320 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21330 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
21340 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72      /* If requir
21350 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65  ed, populate the
21360 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
21370 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  ist cache. */.  
21380 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
21390 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
213a0 20 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d     assert(!pCur-
213b0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
213c0 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   || pCur->aOverf
213d0 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50  low[iIdx]==nextP
213e0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43  age);.        pC
213f0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
21400 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a  dx] = nextPage;.
21410 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a        }.#endif..
21420 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74        if( offset
21430 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  >=ovflSize ){.  
21440 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c        /* The onl
21450 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64  y reason to read
21460 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f   this page is to
21470 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65   obtain the page
21480 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
21490 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  er for the next 
214a0 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
214b0 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20  flow chain. The 
214c0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
214d0 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75  data is not requ
214e0 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74  ired. So first t
214f0 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65  ry to lookup the
21500 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20   overflow.      
21510 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63    ** page-list c
21520 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68  ache, if any, th
21530 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  en fall back to 
21540 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  the getOverflowP
21550 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a  age().        **
21560 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20   function..     
21570 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
21580 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
21590 4f 42 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  OB.        if( p
215a0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26  Cur->aOverflow &
215b0 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  & pCur->aOverflo
215c0 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20  w[iIdx+1] ){.   
215d0 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
215e0 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
215f0 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20  w[iIdx+1];.     
21600 20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69     } else .#endi
21610 66 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  f.          rc =
21620 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
21630 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20  (pBt, nextPage, 
21640 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20  0, &nextPage);. 
21650 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d         offset -=
21660 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20   ovflSize;.     
21670 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21680 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20  /* Need to read 
21690 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72  this page proper
216a0 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20  ly. It contains 
216b0 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20  some of the.    
216c0 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20      ** range of 
216d0 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69  data that is bei
216e0 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29  ng read (eOp==0)
216f0 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70   or written (eOp
21700 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f  !=0)..        */
21710 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
21720 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
21730 45 41 44 0a 20 20 20 20 20 20 20 20 73 71 6c 69  EAD.        sqli
21740 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 23 65  te3_file *fd;.#e
21750 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e 74  ndif.        int
21760 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20   a = amt;.      
21770 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74    if( a + offset
21780 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20   > ovflSize ){. 
21790 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66           a = ovf
217a0 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  lSize - offset;.
217b0 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65          }..#ifde
217c0 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
217d0 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
217e0 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20        /* If all 
217f0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
21800 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20 20  e true:.        
21810 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
21820 31 29 20 74 68 69 73 20 69 73 20 61 20 72 65 61  1) this is a rea
21830 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64  d operation, and
21840 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 32   .        **   2
21850 29 20 64 61 74 61 20 69 73 20 72 65 71 75 69 72  ) data is requir
21860 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72  ed from the star
21870 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66 6c  t of this overfl
21880 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20 20  ow page, and.   
21890 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68 65       **   3) the
218a0 20 64 61 74 61 62 61 73 65 20 69 73 20 66 69 6c   database is fil
218b0 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20  e-backed, and.  
218c0 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68        **   4) th
218d0 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77  ere is no open w
218e0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
218f0 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  , and.        **
21900 20 20 20 35 29 20 74 68 65 20 64 61 74 61 62 61     5) the databa
21910 73 65 20 69 73 20 6e 6f 74 20 61 20 57 41 4c 20  se is not a WAL 
21920 64 61 74 61 62 61 73 65 2c 0a 20 20 20 20 20 20  database,.      
21930 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
21940 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62 65  then data can be
21950 20 72 65 61 64 20 64 69 72 65 63 74 6c 79 20 66   read directly f
21960 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
21970 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20   file into the. 
21980 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74         ** output
21990 20 62 75 66 66 65 72 2c 20 62 79 70 61 73 73 69   buffer, bypassi
219a0 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  ng the page-cach
219b0 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54 68  e altogether. Th
219c0 69 73 20 73 70 65 65 64 73 0a 20 20 20 20 20 20  is speeds.      
219d0 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20    ** up loading 
219e0 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20 74 68  large records th
219f0 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65  at span many ove
21a00 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 20  rflow pages..   
21a10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
21a20 69 66 28 20 65 4f 70 3d 3d 30 20 20 20 20 20 20  if( eOp==0      
21a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a50 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f         /* (1) */
21a60 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f 66 66  .         && off
21a70 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20 20  set==0          
21a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21aa0 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20  /* (2) */.      
21ab0 20 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61     && pBt->inTra
21ac0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
21ad0 52 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20  READ            
21ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 34 29 20           /* (4) 
21af0 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  */.         && (
21b00 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  fd = sqlite3Page
21b10 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65  rFile(pBt->pPage
21b20 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20  r))->pMethods   
21b30 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20    /* (3) */.    
21b40 20 20 20 20 20 26 26 20 70 42 74 2d 3e 70 50 61       && pBt->pPa
21b50 67 65 31 2d 3e 61 44 61 74 61 5b 31 39 5d 3d 3d  ge1->aData[19]==
21b60 30 78 30 31 20 20 20 20 20 20 20 20 20 20 20 20  0x01            
21b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 35             /* (5
21b80 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a  ) */.        ){.
21b90 20 20 20 20 20 20 20 20 20 20 75 38 20 61 53 61            u8 aSa
21ba0 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20  ve[4];.         
21bb0 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70   u8 *aWrite = &p
21bc0 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20  Buf[-4];.       
21bd0 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c     memcpy(aSave,
21be0 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20   aWrite, 4);.   
21bf0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
21c00 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57  te3OsRead(fd, aW
21c10 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29  rite, a+4, (i64)
21c20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e  pBt->pageSize*(n
21c30 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20  extPage-1));.   
21c40 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
21c50 3d 20 67 65 74 34 62 79 74 65 28 61 57 72 69 74  = get4byte(aWrit
21c60 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  e);.          me
21c70 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61 53 61  mcpy(aWrite, aSa
21c80 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  ve, 4);.        
21c90 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
21ca0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
21cb0 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
21cc0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e;.          rc 
21cd0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  = sqlite3PagerAc
21ce0 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65  quire(pBt->pPage
21cf0 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44  r, nextPage, &pD
21d00 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20  bPage,.         
21d10 20 20 20 20 20 28 65 4f 70 3d 3d 30 20 3f 20 50       (eOp==0 ? P
21d20 41 47 45 52 5f 41 43 51 55 49 52 45 5f 52 45 41  AGER_ACQUIRE_REA
21d30 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20  DONLY : 0).     
21d40 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
21d50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21d60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
21d70 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71     aPayload = sq
21d80 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
21d90 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  a(pDbPage);.    
21da0 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
21db0 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79   = get4byte(aPay
21dc0 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20  load);.         
21dd0 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
21de0 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
21df0 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61  fset+4], pBuf, a
21e00 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b  , eOp, pDbPage);
21e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
21e20 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
21e30 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
21e40 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b       offset = 0;
21e50 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
21e60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
21e70 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20  mt -= a;.       
21e80 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
21e90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
21ea0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21eb0 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20  OK && amt>0 ){. 
21ec0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21ed0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
21ee0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
21ef0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61  }../*.** Read pa
21f00 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73  rt of the key as
21f10 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
21f20 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63  rsor pCur.  Exac
21f30 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74  tly.** "amt" byt
21f40 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
21f50 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  fered into pBuf[
21f60 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
21f70 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
21f80 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68  ffset"..**.** Th
21f90 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
21fa0 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20 69  sure that pCur i
21fb0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  s pointing to a 
21fc0 76 61 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20  valid row.** in 
21fd0 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
21fe0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
21ff0 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
22000 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
22010 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
22020 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
22030 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
22040 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
22050 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
22060 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
22070 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
22080 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42  qlite3BtreeKey(B
22090 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
220a0 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
220b0 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
220c0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
220d0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
220e0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
220f0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
22100 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
22110 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
22120 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
22130 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
22140 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e] );.  assert( 
22150 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
22160 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
22170 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
22180 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72  e]->nCell );.  r
22190 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c  eturn accessPayl
221a0 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
221b0 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64  , amt, (unsigned
221c0 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b   char*)pBuf, 0);
221d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
221e0 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
221f0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
22200 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
22210 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
22220 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
22230 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75  nsfered into pBu
22240 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
22250 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
22260 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
22270 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
22280 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
22290 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
222a0 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
222b0 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
222c0 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
222d0 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
222e0 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
222f0 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
22300 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
22310 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42  lite3BtreeData(B
22320 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
22330 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
22340 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
22350 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e  .  int rc;..#ifn
22360 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22370 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20  INCRBLOB.  if ( 
22380 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
22390 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
223a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
223b0 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e  E_ABORT;.  }.#en
223c0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63  dif..  assert( c
223d0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
223e0 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
223f0 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
22400 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
22410 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22420 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
22430 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
22440 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
22450 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22460 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
22470 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
22480 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73  Page] );.    ass
22490 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
224a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
224b0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
224c0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
224d0 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73  ;.    rc = acces
224e0 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
224f0 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66  ffset, amt, pBuf
22500 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
22510 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22520 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
22530 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f   to payload info
22540 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
22550 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
22560 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20  .** pCur cursor 
22570 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
22580 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
22590 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
225a0 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69   of.** the key i
225b0 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64  f skipKey==0 and
225c0 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
225d0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64  e beginning of d
225e0 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65  ata if.** skipKe
225f0 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62 65  y==1.  The numbe
22600 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76  r of bytes of av
22610 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74 61  ailable key/data
22620 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69   is written.** i
22630 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a  nto *pAmt.  If *
22640 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68  pAmt==0, then th
22650 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
22660 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20   will not be.** 
22670 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
22680 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
22690 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ine is an optimi
226a0 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63  zation.  It is c
226b0 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e  ommon for the en
226c0 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20  tire key.** and 
226d0 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74  data to fit on t
226e0 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e  he local page an
226f0 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  d for there to b
22700 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  e no overflow.**
22710 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68   pages.  When th
22720 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72  at is so, this r
22730 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73  outine can be us
22740 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ed to access the
22750 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61  .** key and data
22760 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20   without making 
22770 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20  a copy.  If the 
22780 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20  key and/or data 
22790 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f  spills.** onto o
227a0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74  verflow pages, t
227b0 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  hen accessPayloa
227c0 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64  d() must be used
227d0 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a   to reassemble.*
227e0 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61  * the key/data a
227f0 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20  nd copy it into 
22800 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62  a preallocated b
22810 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uffer..**.** The
22820 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
22830 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
22840 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79  e looks directly
22850 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64   into the cached
22860 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20  .** page of the 
22870 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64  database.  The d
22880 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65  ata might change
22890 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78   or move the nex
228a0 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74  t time.** any bt
228b0 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63  ree routine is c
228c0 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
228d0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
228e0 63 68 61 72 20 2a 66 65 74 63 68 50 61 79 6c 6f  char *fetchPaylo
228f0 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ad(.  BtCursor *
22900 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75  pCur,      /* Cu
22910 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
22920 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66   entry to read f
22930 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41  rom */.  int *pA
22940 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  mt,           /*
22950 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
22960 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
22970 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 69  ytes here */.  i
22980 6e 74 20 73 6b 69 70 4b 65 79 20 20 20 20 20 20  nt skipKey      
22990 20 20 20 20 2f 2a 20 72 65 61 64 20 62 65 67 69      /* read begi
229a0 6e 6e 69 6e 67 20 61 74 20 64 61 74 61 20 69 66  nning at data if
229b0 20 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f   this is true */
229c0 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
229d0 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20  har *aPayload;. 
229e0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
229f0 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 75  .  u32 nKey;.  u
22a00 33 32 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73  32 nLocal;..  as
22a10 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26  sert( pCur!=0 &&
22a20 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
22a30 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
22a40 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20  pCur->iPage]);. 
22a50 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
22a60 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
22a70 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
22a80 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
22a90 78 28 70 43 75 72 29 20 29 3b 0a 20 20 70 50 61  x(pCur) );.  pPa
22aa0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
22ab0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
22ac0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22ad0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
22ae0 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  e]<pPage->nCell 
22af0 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  );.  if( NEVER(p
22b00 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
22b10 3d 30 29 20 29 7b 0a 20 20 20 20 62 74 72 65 65  =0) ){.    btree
22b20 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
22b30 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
22b40 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78  ge], pCur->aiIdx
22b50 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20  [pCur->iPage],. 
22b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b70 20 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a    &pCur->info);.
22b80 20 20 7d 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d    }.  aPayload =
22b90 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c   pCur->info.pCel
22ba0 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d  l;.  aPayload +=
22bb0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61   pCur->info.nHea
22bc0 64 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65  der;.  if( pPage
22bd0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
22be0 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  nKey = 0;.  }els
22bf0 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 28 69  e{.    nKey = (i
22c00 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  nt)pCur->info.nK
22c10 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b  ey;.  }.  if( sk
22c20 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 50 61  ipKey ){.    aPa
22c30 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20  yload += nKey;. 
22c40 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72     nLocal = pCur
22c50 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20  ->info.nLocal - 
22c60 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nKey;.  }else{. 
22c70 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72     nLocal = pCur
22c80 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
22c90 20 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 63 61     assert( nLoca
22ca0 6c 3c 3d 6e 4b 65 79 20 29 3b 0a 20 20 7d 0a 20  l<=nKey );.  }. 
22cb0 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b   *pAmt = nLocal;
22cc0 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79 6c 6f  .  return aPaylo
22cd0 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f  ad;.}.../*.** Fo
22ce0 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
22cf0 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
22d00 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e  point to, return
22d10 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65   as.** many byte
22d20 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20  s of the key or 
22d30 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69  data as are avai
22d40 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63  lable on the loc
22d50 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67  al.** b-tree pag
22d60 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75  e.  Write the nu
22d70 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
22d80 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41  e bytes into *pA
22d90 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  mt..**.** The po
22da0 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69  inter returned i
22db0 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68  s ephemeral.  Th
22dc0 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d  e key/data may m
22dd0 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73  ove.** or be des
22de0 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65  troyed on the ne
22df0 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42  xt call to any B
22e00 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a  tree routine,.**
22e10 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73   including calls
22e20 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65   from other thre
22e30 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  ads against the 
22e40 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48  same cache..** H
22e50 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e  ence, a mutex on
22e60 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68   the BtShared sh
22e70 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69  ould be held pri
22e80 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a  or to calling.**
22e90 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
22ea0 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
22eb0 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67  nes is used to g
22ec0 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20  et quick access 
22ed0 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a  to key and data.
22ee0 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  ** in the common
22ef0 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f   case where no o
22f00 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
22f10 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74  e used..*/.const
22f20 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
22f30 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 43 75  reeKeyFetch(BtCu
22f40 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
22f50 2a 70 41 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20  *pAmt){.  const 
22f60 76 6f 69 64 20 2a 70 20 3d 20 30 3b 0a 20 20 61  void *p = 0;.  a
22f70 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
22f80 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
22f90 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
22fa0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
22fb0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
22fc0 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20  (pCur) );.  if( 
22fd0 41 4c 57 41 59 53 28 70 43 75 72 2d 3e 65 53 74  ALWAYS(pCur->eSt
22fe0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
22ff0 44 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 63  D) ){.    p = (c
23000 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68  onst void*)fetch
23010 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41  Payload(pCur, pA
23020 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  mt, 0);.  }.  re
23030 74 75 72 6e 20 70 3b 0a 7d 0a 63 6f 6e 73 74 20  turn p;.}.const 
23040 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72  void *sqlite3Btr
23050 65 65 44 61 74 61 46 65 74 63 68 28 42 74 43 75  eeDataFetch(BtCu
23060 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
23070 2a 70 41 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20  *pAmt){.  const 
23080 76 6f 69 64 20 2a 70 20 3d 20 30 3b 0a 20 20 61  void *p = 0;.  a
23090 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
230a0 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
230b0 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
230c0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
230d0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
230e0 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20  (pCur) );.  if( 
230f0 41 4c 57 41 59 53 28 70 43 75 72 2d 3e 65 53 74  ALWAYS(pCur->eSt
23100 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
23110 44 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 63  D) ){.    p = (c
23120 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68  onst void*)fetch
23130 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41  Payload(pCur, pA
23140 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65  mt, 1);.  }.  re
23150 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn p;.}.../*.*
23160 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
23170 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20  r down to a new 
23180 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65  child page.  The
23190 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e   newPgno argumen
231a0 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65  t is the.** page
231b0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63   number of the c
231c0 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76  hild page to mov
231d0 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  e to..**.** This
231e0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
231f0 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  s SQLITE_CORRUPT
23200 20 69 66 20 74 68 65 20 70 61 67 65 2d 68 65 61   if the page-hea
23210 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20  der flags field 
23220 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68  of.** the new ch
23230 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f  ild page does no
23240 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67  t match the flag
23250 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70  s field of the p
23260 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69  arent (i.e..** i
23270 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65  f an intkey page
23280 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 74   appears to be t
23290 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e  he parent of a n
232a0 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20  on-intkey page, 
232b0 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61  or.** vice-versa
232c0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
232d0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43   moveToChild(BtC
232e0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
232f0 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74   newPgno){.  int
23300 20 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70   rc;.  int i = p
23310 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65  Cur->iPage;.  Me
23320 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b  mPage *pNewPage;
23330 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
23340 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20   = pCur->pBt;.. 
23350 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
23360 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
23370 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
23380 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
23390 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
233a0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
233b0 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  <BTCURSOR_MAX_DE
233c0 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PTH );.  assert(
233d0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
233e0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  );.  if( pCur->i
233f0 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f  Page>=(BTCURSOR_
23400 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a  MAX_DEPTH-1) ){.
23410 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
23420 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
23430 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e    }.  rc = getAn
23440 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e  dInitPage(pBt, n
23450 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67  ewPgno, &pNewPag
23460 65 2c 20 28 70 43 75 72 2d 3e 77 72 46 6c 61 67  e, (pCur->wrFlag
23470 3d 3d 30 29 29 3b 0a 20 20 69 66 28 20 72 63 20  ==0));.  if( rc 
23480 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70  ) return rc;.  p
23490 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d  Cur->apPage[i+1]
234a0 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70   = pNewPage;.  p
234b0 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20  Cur->aiIdx[i+1] 
234c0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  = 0;.  pCur->iPa
234d0 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69  ge++;..  pCur->i
234e0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
234f0 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
23500 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77   = 0;.  if( pNew
23510 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c  Page->nCell<1 ||
23520 20 70 4e 65 77 50 61 67 65 2d 3e 69 6e 74 4b 65   pNewPage->intKe
23530 79 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  y!=pCur->apPage[
23540 69 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  i]->intKey ){.  
23550 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23560 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
23570 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
23580 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f  E_OK;.}..#if 0./
23590 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e  *.** Page pParen
235a0 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c  t is an internal
235b0 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65   (non-leaf) tree
235c0 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63   page. This func
235d0 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73  tion .** asserts
235e0 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65   that page numbe
235f0 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20  r iChild is the 
23600 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68  left-child if th
23610 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c  e iIdx'th.** cel
23620 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e  l in page pParen
23630 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69  t. Or, if iIdx i
23640 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74  s equal to the t
23650 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a  otal number of.*
23660 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  * cells in pPare
23670 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75  nt, that page nu
23680 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74  mber iChild is t
23690 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f  he right-child o
236a0 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a  f.** the page..*
236b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  /.static void as
236c0 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
236d0 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
236e0 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f  , int iIdx, Pgno
236f0 20 69 43 68 69 6c 64 29 7b 0a 20 20 61 73 73 65   iChild){.  asse
23700 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e  rt( iIdx<=pParen
23710 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66  t->nCell );.  if
23720 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d  ( iIdx==pParent-
23730 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73  >nCell ){.    as
23740 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28 26  sert( get4byte(&
23750 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
23760 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
23770 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b  t+8])==iChild );
23780 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
23790 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28 66  sert( get4byte(f
237a0 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  indCell(pParent,
237b0 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20   iIdx))==iChild 
237c0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
237d0 20 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 50    define assertP
237e0 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a  arentIndex(x,y,z
237f0 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ) .#endif../*.**
23800 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
23810 20 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e   up to the paren
23820 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43  t page..**.** pC
23830 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74  ur->idx is set t
23840 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78  o the cell index
23850 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
23860 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f  he pointer.** to
23870 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
23880 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49   coming from.  I
23890 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20  f we are coming 
238a0 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68  from the.** righ
238b0 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67  t-most child pag
238c0 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78  e then pCur->idx
238d0 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d   is set to one m
238e0 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ore than.** the 
238f0 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64  largest cell ind
23900 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
23910 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28  id moveToParent(
23920 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
23930 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
23940 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
23950 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
23960 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
23970 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
23980 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
23990 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>0 );.  assert
239a0 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
239b0 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 0a  Cur->iPage] );..
239c0 20 20 2f 2a 20 55 50 44 41 54 45 3a 20 49 74 20    /* UPDATE: It 
239d0 69 73 20 61 63 74 75 61 6c 6c 79 20 70 6f 73 73  is actually poss
239e0 69 62 6c 65 20 66 6f 72 20 74 68 65 20 63 6f 6e  ible for the con
239f0 64 69 74 69 6f 6e 20 74 65 73 74 65 64 20 62 79  dition tested by
23a00 20 74 68 65 20 61 73 73 65 72 74 0a 20 20 2a 2a   the assert.  **
23a10 20 62 65 6c 6f 77 20 74 6f 20 62 65 20 75 6e 74   below to be unt
23a20 72 75 65 20 69 66 20 74 68 65 20 64 61 74 61 62  rue if the datab
23a30 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72  ase file is corr
23a40 75 70 74 2e 20 54 68 69 73 20 63 61 6e 20 6f 63  upt. This can oc
23a50 63 75 72 20 69 66 0a 20 20 2a 2a 20 6f 6e 65 20  cur if.  ** one 
23a60 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 64 69 66  cursor has modif
23a70 69 65 64 20 70 61 67 65 20 70 50 61 72 65 6e 74  ied page pParent
23a80 20 77 68 69 6c 65 20 61 20 72 65 66 65 72 65 6e   while a referen
23a90 63 65 20 74 6f 20 69 74 20 69 73 20 68 65 6c 64  ce to it is held
23aa0 20 0a 20 20 2a 2a 20 62 79 20 61 20 73 65 63 6f   .  ** by a seco
23ab0 6e 64 20 63 75 72 73 6f 72 2e 20 57 68 69 63 68  nd cursor. Which
23ac0 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
23ad0 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   if a single pag
23ae0 65 20 69 73 20 6c 69 6e 6b 65 64 0a 20 20 2a 2a  e is linked.  **
23af0 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20   into more than 
23b00 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75 63  one b-tree struc
23b10 74 75 72 65 20 69 6e 20 61 20 63 6f 72 72 75 70  ture in a corrup
23b20 74 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a  t database.  */.
23b30 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 50 61  #if 0.  assertPa
23b40 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70  rentIndex(.    p
23b50 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
23b60 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
23b70 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
23b80 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
23b90 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
23ba0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e  Cur->iPage]->pgn
23bb0 6f 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  o.  );.#endif.  
23bc0 74 65 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e  testcase( pCur->
23bd0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
23be0 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50  e-1] > pCur->apP
23bf0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
23c00 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  1]->nCell );..  
23c10 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
23c20 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
23c30 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e  Page]);.  pCur->
23c40 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d  iPage--;.  pCur-
23c50 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
23c60 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
23c70 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ey = 0;.}../*.**
23c80 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
23c90 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
23ca0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74   root page of it
23cb0 73 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  s b-tree structu
23cc0 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  re..**.** If the
23cd0 20 74 61 62 6c 65 20 68 61 73 20 61 20 76 69 72   table has a vir
23ce0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20  tual root page, 
23cf0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
23d00 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e  is moved to poin
23d10 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74  t.** to the virt
23d20 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e  ual root page in
23d30 73 74 65 61 64 20 6f 66 20 74 68 65 20 61 63 74  stead of the act
23d40 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41  ual root page. A
23d50 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20   table has a.** 
23d60 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
23d70 65 20 77 68 65 6e 20 74 68 65 20 61 63 74 75 61  e when the actua
23d80 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74  l root page cont
23d90 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e  ains no cells an
23da0 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63  d a .** single c
23db0 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20  hild page. This 
23dc0 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
23dd0 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 72  with the table r
23de0 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 31 2e  ooted at page 1.
23df0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d  .**.** If the b-
23e00 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69  tree structure i
23e10 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72  s empty, the cur
23e20 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 74  sor state is set
23e30 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49   to .** CURSOR_I
23e40 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73  NVALID. Otherwis
23e50 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  e, the cursor is
23e60 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
23e70 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65   the first.** ce
23e80 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68  ll located on th
23e90 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75  e root (or virtu
23ea0 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e  al root) page an
23eb0 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  d the cursor sta
23ec0 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  te.** is set to 
23ed0 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a  CURSOR_VALID..**
23ee0 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63  .** If this func
23ef0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63  tion returns suc
23f00 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61  cessfully, it ma
23f10 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 68 61  y be assumed tha
23f20 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65  t the.** page-he
23f30 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63  ader flags indic
23f40 61 74 65 20 74 68 61 74 20 74 68 65 20 5b 76 69  ate that the [vi
23f50 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65  rtual] root-page
23f60 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65 64   is the expected
23f70 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74   .** kind of b-t
23f80 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69  ree page (i.e. i
23f90 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74  f when opening t
23fa0 68 65 20 63 75 72 73 6f 72 20 74 68 65 20 63 61  he cursor the ca
23fb0 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20  ller did not.** 
23fc0 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66  specify a KeyInf
23fd0 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20  o structure the 
23fe0 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65  flags byte is se
23ff0 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30  t to 0x05 or 0x0
24000 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67  D,.** indicating
24010 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c   a table b-tree,
24020 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65   or if the calle
24030 72 20 64 69 64 20 73 70 65 63 69 66 79 20 61 20  r did specify a 
24040 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75  KeyInfo .** stru
24050 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20  cture the flags 
24060 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30  byte is set to 0
24070 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64  x02 or 0x0A, ind
24080 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78  icating an index
24090 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a  .** b-tree)..*/.
240a0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
240b0 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a  oRoot(BtCursor *
240c0 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pCur){.  MemPage
240d0 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72   *pRoot;.  int r
240e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
240f0 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72   Btree *p = pCur
24100 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68  ->pBtree;.  BtSh
24110 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
24120 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
24130 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
24140 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
24150 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  t( CURSOR_INVALI
24160 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49  D < CURSOR_REQUI
24170 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
24180 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
24190 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55     < CURSOR_REQU
241a0 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
241b0 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c  ert( CURSOR_FAUL
241c0 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51  T   > CURSOR_REQ
241d0 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66  UIRESEEK );.  if
241e0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
241f0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
24200 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  EK ){.    if( pC
24210 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
24220 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
24230 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
24240 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45  skipNext!=SQLITE
24250 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 65 74  _OK );.      ret
24260 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  urn pCur->skipNe
24270 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  xt;.    }.    sq
24280 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
24290 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d  ursor(pCur);.  }
242a0 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ..  if( pCur->iP
242b0 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e  age>=0 ){.    in
242c0 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  t i;.    for(i=1
242d0 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
242e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
242f0 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
24300 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
24310 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67  }.    pCur->iPag
24320 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  e = 0;.  }else i
24330 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  f( pCur->pgnoRoo
24340 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72  t==0 ){.    pCur
24350 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
24360 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72  R_INVALID;.    r
24370 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24380 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
24390 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
243a0 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  e(pBt, pCur->pgn
243b0 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70  oRoot, &pCur->ap
243c0 50 61 67 65 5b 30 5d 2c 20 30 29 3b 0a 20 20 20  Page[0], 0);.   
243d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
243e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  OK ){.      pCur
243f0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
24400 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
24410 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
24420 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67  }.    pCur->iPag
24430 65 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49  e = 0;..    /* I
24440 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  f pCur->pKeyInfo
24450 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
24460 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68  en the caller th
24470 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63  at opened this c
24480 75 72 73 6f 72 0a 20 20 20 20 2a 2a 20 65 78 70  ursor.    ** exp
24490 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74  ected to open it
244a0 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74   on an index b-t
244b0 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ree. Otherwise, 
244c0 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20  if pKeyInfo is. 
244d0 20 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20     ** NULL, the 
244e0 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61  caller expects a
244f0 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49   table b-tree. I
24500 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68  f this is not th
24510 65 20 63 61 73 65 2c 0a 20 20 20 20 2a 2a 20 72  e case,.    ** r
24520 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f  eturn an SQLITE_
24530 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 20  CORRUPT error.  
24540 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
24550 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
24560 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 43 75  intKey==1 || pCu
24570 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
24580 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69  tKey==0 );.    i
24590 66 28 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  f( (pCur->pKeyIn
245a0 66 6f 3d 3d 30 29 21 3d 70 43 75 72 2d 3e 61 70  fo==0)!=pCur->ap
245b0 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
245c0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
245d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
245e0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  KPT;.    }.  }..
245f0 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
24600 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69   the root page i
24610 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65 63 74  s of the correct
24620 20 74 79 70 65 2e 20 54 68 69 73 20 6d 75 73 74   type. This must
24630 20 62 65 20 74 68 65 0a 20 20 2a 2a 20 63 61 73   be the.  ** cas
24640 65 20 61 73 20 74 68 65 20 63 61 6c 6c 20 74 6f  e as the call to
24650 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74   this function t
24660 68 61 74 20 6c 6f 61 64 65 64 20 74 68 65 20 72  hat loaded the r
24670 6f 6f 74 2d 70 61 67 65 20 28 65 69 74 68 65 72  oot-page (either
24680 0a 20 20 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  .  ** this call 
24690 6f 72 20 61 20 70 72 65 76 69 6f 75 73 20 69 6e  or a previous in
246a0 76 6f 63 61 74 69 6f 6e 29 20 77 6f 75 6c 64 20  vocation) would 
246b0 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63 6f  have detected co
246c0 72 72 75 70 74 69 6f 6e 20 0a 20 20 2a 2a 20 69  rruption .  ** i
246d0 66 20 74 68 65 20 61 73 73 75 6d 70 74 69 6f 6e  f the assumption
246e0 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20   were not true, 
246f0 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  and it is not po
24700 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 66  ssible for the f
24710 6c 61 67 73 20 0a 20 20 2a 2a 20 62 79 74 65 20  lags .  ** byte 
24720 74 6f 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64  to have been mod
24730 69 66 69 65 64 20 77 68 69 6c 65 20 74 68 69 73  ified while this
24740 20 63 75 72 73 6f 72 20 69 73 20 68 6f 6c 64 69   cursor is holdi
24750 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20  ng a reference. 
24760 20 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 2e   ** to the page.
24770 20 20 2a 2f 0a 20 20 70 52 6f 6f 74 20 3d 20 70    */.  pRoot = p
24780 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a  Cur->apPage[0];.
24790 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
247a0 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e  >pgno==pCur->pgn
247b0 6f 52 6f 6f 74 20 29 3b 0a 20 20 61 73 73 65 72  oRoot );.  asser
247c0 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74  t( pRoot->isInit
247d0 20 26 26 20 28 70 43 75 72 2d 3e 70 4b 65 79 49   && (pCur->pKeyI
247e0 6e 66 6f 3d 3d 30 29 3d 3d 70 52 6f 6f 74 2d 3e  nfo==0)==pRoot->
247f0 69 6e 74 4b 65 79 20 29 3b 0a 0a 20 20 70 43 75  intKey );..  pCu
24800 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b  r->aiIdx[0] = 0;
24810 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
24820 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
24830 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70  >atLast = 0;.  p
24840 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
24850 20 30 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74   0;..  if( pRoot
24860 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70  ->nCell==0 && !p
24870 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Root->leaf ){.  
24880 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a    Pgno subpage;.
24890 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70      if( pRoot->p
248a0 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20  gno!=1 ) return 
248b0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
248c0 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65  KPT;.    subpage
248d0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f   = get4byte(&pRo
248e0 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d  ot->aData[pRoot-
248f0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
24900 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
24910 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
24920 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
24930 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70  Child(pCur, subp
24940 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
24950 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
24960 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c  = ((pRoot->nCell
24970 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44  >0)?CURSOR_VALID
24980 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29  :CURSOR_INVALID)
24990 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
249a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
249b0 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
249c0 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   to the left-mos
249d0 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e  t leaf entry ben
249e0 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72  eath the.** entr
249f0 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  y to which it is
24a00 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
24a10 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ing..**.** The l
24a20 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73  eft-most leaf is
24a30 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
24a40 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d  e smallest key -
24a50 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
24a60 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
24a70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24a80 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42  moveToLeftmost(B
24a90 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
24aa0 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69    Pgno pgno;.  i
24ab0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
24ac0 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  K;.  MemPage *pP
24ad0 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
24ae0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
24af0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
24b00 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
24b10 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
24b20 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
24b30 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50  QLITE_OK && !(pP
24b40 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
24b50 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
24b60 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73  ->leaf ){.    as
24b70 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
24b80 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
24b90 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
24ba0 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
24bb0 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
24bc0 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e, pCur->aiIdx[p
24bd0 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20  Cur->iPage]));. 
24be0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
24bf0 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
24c00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
24c10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
24c20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
24c30 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
24c40 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e  t leaf entry ben
24c50 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65  eath the.** page
24c60 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20   to which it is 
24c70 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
24c80 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20  ng.  Notice the 
24c90 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65  difference.** be
24ca0 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  tween moveToLeft
24cb0 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54  most() and moveT
24cc0 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d  oRightmost().  m
24cd0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a  oveToLeftmost().
24ce0 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66  ** finds the lef
24cf0 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
24d00 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a  eath the *entry*
24d10 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52   whereas moveToR
24d20 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  ightmost().** fi
24d30 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  nds the right-mo
24d40 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
24d50 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a   the *page*..**.
24d60 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  ** The right-mos
24d70 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f  t entry is the o
24d80 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67  ne with the larg
24d90 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61  est key - the la
24da0 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63  st.** key in asc
24db0 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
24dc0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
24dd0 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75  ToRightmost(BtCu
24de0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
24df0 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
24e00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24e10 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
24e20 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
24e30 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
24e40 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
24e50 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
24e60 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
24e70 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  );.  while( rc==
24e80 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70  SQLITE_OK && !(p
24e90 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
24ea0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
24eb0 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70  )->leaf ){.    p
24ec0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
24ed0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
24ee0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
24ef0 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  );.    pCur->aiI
24f00 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
24f10 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
24f20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
24f30 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
24f40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
24f50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24f60 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
24f70 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67  r->iPage] = pPag
24f80 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20  e->nCell-1;.    
24f90 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
24fa0 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e   = 0;.    pCur->
24fb0 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
24fc0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
24fd0 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
24fe0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72  ursor to the fir
24ff0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
25000 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
25010 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
25020 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
25030 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
25040 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
25050 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
25060 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
25070 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
25080 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
25090 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
250a0 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72  eeFirst(BtCursor
250b0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
250c0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  s){.  int rc;.. 
250d0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
250e0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
250f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
25100 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
25110 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
25120 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
25130 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
25140 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
25150 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25160 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
25170 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
25180 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
25190 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
251a0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
251b0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
251c0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
251d0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
251e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
251f0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
25200 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
25210 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  ]->nCell>0 );.  
25220 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
25230 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
25240 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
25250 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
25260 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
25270 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
25280 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
25290 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
252a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
252b0 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
252c0 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
252d0 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
252e0 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
252f0 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
25300 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
25310 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
25320 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
25330 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43  te3BtreeLast(BtC
25340 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
25350 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
25360 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63  c;. .  assert( c
25370 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
25380 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
25390 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
253a0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
253b0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
253c0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
253d0 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f  ursor already po
253e0 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74  ints to the last
253f0 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20   entry, this is 
25400 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66  a no-op. */.  if
25410 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
25420 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20  pCur->eState && 
25430 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 29 7b 0a  pCur->atLast ){.
25440 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
25450 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  BUG.    /* This 
25460 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20  block serves to 
25470 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68  assert() that th
25480 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20  e cursor really 
25490 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20  does point .    
254a0 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ** to the last e
254b0 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72  ntry in the b-tr
254c0 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ee. */.    int i
254d0 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  i;.    for(ii=0;
254e0 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b   ii<pCur->iPage;
254f0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73   ii++){.      as
25500 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
25510 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50  x[ii]==pCur->apP
25520 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29  age[ii]->nCell )
25530 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
25540 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
25550 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43  pCur->iPage]==pC
25560 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
25570 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31  >iPage]->nCell-1
25580 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
25590 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
255a0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20  r->iPage]->leaf 
255b0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  );.#endif.    re
255c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
255d0 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65    }..  rc = move
255e0 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
255f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25600 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52  K ){.    if( CUR
25610 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
25620 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
25630 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
25640 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
25650 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
25660 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
25670 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
25680 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  es = 1;.    }els
25690 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
256a0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
256b0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
256c0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
256d0 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
256e0 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
256f0 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 74  ;.      pCur->at
25700 4c 61 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54  Last = rc==SQLIT
25710 45 5f 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20 20 7d  E_OK ?1:0;.    }
25720 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
25730 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
25740 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20   cursor so that 
25750 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  it points to an 
25760 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b  entry near the k
25770 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  ey .** specified
25780 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69   by pIdxKey or i
25790 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20  ntKey.   Return 
257a0 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a  a success code..
257b0 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59  **.** For INTKEY
257c0 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74   tables, the int
257d0 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73  Key parameter is
257e0 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20   used.  pIdxKey 
257f0 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c  .** must be NULL
25800 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62  .  For index tab
25810 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20  les, pIdxKey is 
25820 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a  used and intKey.
25830 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  ** is ignored..*
25840 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74  *.** If an exact
25850 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f   match is not fo
25860 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75  und, then the cu
25870 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a  rsor is always.*
25880 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  * left pointing 
25890 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77  at a leaf page w
258a0 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20  hich would hold 
258b0 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a  the entry if it.
258c0 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e  ** were present.
258d0 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67    The cursor mig
258e0 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65  ht point to an e
258f0 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a  ntry that comes.
25900 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74  ** before or aft
25910 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  er the key..**.*
25920 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20  * An integer is 
25930 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52  written into *pR
25940 65 73 20 77 68 69 63 68 20 69 73 20 74 68 65 20  es which is the 
25950 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d  result of.** com
25960 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77  paring the key w
25970 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f  ith the entry to
25980 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f   which the curso
25990 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e  r is .** pointin
259a0 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  g.  The meaning 
259b0 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 77  of the integer w
259c0 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a  ritten into.** *
259d0 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f  pRes is as follo
259e0 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ws:.**.**     *p
259f0 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63  Res<0      The c
25a00 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
25a10 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
25a20 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
25a30 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73              is s
25a40 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b  maller than intK
25a50 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66  ey/pIdxKey or if
25a60 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
25a70 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  pty.**          
25a80 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20          and the 
25a90 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66  cursor is theref
25aa0 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74  ore left point t
25ab0 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a  o nothing..**.**
25ac0 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20       *pRes==0   
25ad0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
25ae0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
25af0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
25b00 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
25b10 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68     exactly match
25b20 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  es intKey/pIdxKe
25b30 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  y..**.**     *pR
25b40 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75  es>0      The cu
25b50 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
25b60 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
25b70 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
25b80 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61             is la
25b90 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  rger than intKey
25ba0 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a  /pIdxKey..**.*/.
25bb0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
25bc0 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a  MovetoUnpacked(.
25bd0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
25be0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
25bf0 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d  e cursor to be m
25c00 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  oved */.  Unpack
25c10 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
25c20 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69  y, /* Unpacked i
25c30 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36  ndex key */.  i6
25c40 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20  4 intKey,       
25c50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
25c60 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ble key */.  int
25c70 20 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20   biasRight,     
25c80 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
25c90 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63  , bias the searc
25ca0 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
25cb0 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
25cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25cd0 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
25ce0 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
25cf0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
25d00 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
25d10 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
25d20 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
25d30 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
25d40 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
25d50 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
25d60 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61  ert( pRes );.  a
25d70 73 73 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d  ssert( (pIdxKey=
25d80 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79  =0)==(pCur->pKey
25d90 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f  Info==0) );..  /
25da0 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
25db0 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74  is already posit
25dc0 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69  ioned at the poi
25dd0 6e 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  nt we are trying
25de0 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f  .  ** to move to
25df0 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75  , then just retu
25e00 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
25e10 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69   any work */.  i
25e20 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
25e30 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26  =CURSOR_VALID &&
25e40 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
25e50 20 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 61 70   .   && pCur->ap
25e60 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
25e70 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  .  ){.    if( pC
25e80 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69  ur->info.nKey==i
25e90 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  ntKey ){.      *
25ea0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
25eb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25ec0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
25ed0 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 26 26 20  pCur->atLast && 
25ee0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c  pCur->info.nKey<
25ef0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
25f00 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  *pRes = -1;.    
25f10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25f20 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OK;.    }.  }.. 
25f30 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
25f40 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
25f50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
25f60 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
25f70 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
25f80 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
25f90 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
25fa0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
25fb0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
25fc0 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
25fd0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49  Cur->iPage]->isI
25fe0 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
25ff0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
26000 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c  URSOR_INVALID ||
26010 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
26020 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
26030 6c 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  l>0 );.  if( pCu
26040 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
26050 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
26060 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
26070 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
26080 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
26090 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
260a0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
260b0 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 );.    return 
260c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
260d0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
260e0 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
260f0 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20   || pIdxKey );. 
26100 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e   for(;;){.    in
26110 74 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 3b  t lwr, upr, idx;
26120 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67  .    Pgno chldPg
26130 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
26140 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
26150 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
26160 3b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20 20  ;.    int c;..  
26170 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c    /* pPage->nCel
26180 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61 74 65  l must be greate
26190 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20  r than zero. If 
261a0 74 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74  this is the root
261b0 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68 65  -page.    ** the
261c0 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61   cursor would ha
261d0 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20  ve been INVALID 
261e0 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66  above and this f
261f0 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20  or(;;) loop.    
26200 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74  ** not run. If t
26210 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72  his is not the r
26220 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 74  oot-page, then t
26230 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29  he moveToChild()
26240 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20   routine.    ** 
26250 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  would have alrea
26260 64 79 20 64 65 74 65 63 74 65 64 20 64 62 20 63  dy detected db c
26270 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c  orruption. Simil
26280 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73 74  arly, pPage must
26290 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20 72  .    ** be the r
262a0 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65 78  ight kind (index
262b0 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62 2d   or table) of b-
262c0 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65 72  tree page. Other
262d0 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f  wise.    ** a mo
262e0 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d  veToChild() or m
262f0 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c  oveToRoot() call
26300 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65   would have dete
26310 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e  cted corruption.
26320 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
26330 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20   pPage->nCell>0 
26340 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
26350 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70  Page->intKey==(p
26360 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20  IdxKey==0) );.  
26370 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75    lwr = 0;.    u
26380 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  pr = pPage->nCel
26390 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 62 69 61  l-1;.    if( bia
263a0 73 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  sRight ){.      
263b0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
263c0 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
263d0 28 69 64 78 20 3d 20 75 70 72 29 3b 0a 20 20 20  (idx = upr);.   
263e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43   }else{.      pC
263f0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
26400 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28 69  iPage] = (u16)(i
26410 64 78 20 3d 20 28 75 70 72 2b 6c 77 72 29 2f 32  dx = (upr+lwr)/2
26420 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
26430 28 3b 3b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  (;;){.      u8 *
26440 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pCell;          
26450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26460 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75  /* Pointer to cu
26470 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50  rrent cell in pP
26480 61 67 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73  age */..      as
26490 73 65 72 74 28 20 69 64 78 3d 3d 70 43 75 72 2d  sert( idx==pCur-
264a0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
264b0 67 65 5d 20 29 3b 0a 20 20 20 20 20 20 70 43 75  ge] );.      pCu
264c0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
264d0 30 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  0;.      pCell =
264e0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
264f0 20 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63   idx) + pPage->c
26500 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20  hildPtrSize;.   
26510 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
26520 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
26530 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  i64 nCellKey;.  
26540 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
26550 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
26560 20 20 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b        u32 dummy;
26570 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c  .          pCell
26580 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
26590 70 43 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20  pCell, dummy);. 
265a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
265b0 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c   getVarint(pCell
265c0 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65  , (u64*)&nCellKe
265d0 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  y);.        if( 
265e0 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79  nCellKey==intKey
265f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20   ){.          c 
26600 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
26610 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c  se if( nCellKey<
26620 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
26630 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20      c = -1;.    
26640 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26650 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
26660 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 3b 0a  llKey>intKey );.
26670 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2b 31            c = +1
26680 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26690 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
266a0 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Key = 1;.       
266b0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
266c0 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20   = nCellKey;.   
266d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
266e0 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
266f0 20 73 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d   supported page-
26700 73 69 7a 65 20 69 73 20 36 35 35 33 36 20 62 79  size is 65536 by
26710 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  tes. This means 
26720 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
26730 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
26740 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74  er of record byt
26750 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20  es stored on an 
26760 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20  index B-Tree.   
26770 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20       ** page is 
26780 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38 34 20  less than 16384 
26790 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65  bytes and may be
267a0 20 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62   stored as a 2-b
267b0 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76  yte.        ** v
267c0 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f  arint. This info
267d0 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
267e0 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76  to attempt to av
267f0 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20  oid parsing .   
26800 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69       ** the enti
26810 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b  re cell by check
26820 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73 65  ing for the case
26830 73 20 77 68 65 72 65 20 74 68 65 20 72 65 63 6f  s where the reco
26840 72 64 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a  rd is .        *
26850 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c  * stored entirel
26860 79 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74  y within the b-t
26870 72 65 65 20 70 61 67 65 20 62 79 20 69 6e 73 70  ree page by insp
26880 65 63 74 69 6e 67 20 74 68 65 20 66 69 72 73 74  ecting the first
26890 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62   .        ** 2 b
268a0 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  ytes of the cell
268b0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
268c0 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d       int nCell =
268d0 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20   pCell[0];.     
268e0 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50     if( nCell<=pP
268f0 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  age->max1bytePay
26900 6c 6f 61 64 0a 20 20 20 20 20 20 20 20 20 2f 2a  load.         /*
26910 20 26 26 20 28 70 43 65 6c 6c 2b 6e 43 65 6c 6c   && (pCell+nCell
26920 29 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e  )<pPage->aDataEn
26930 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a  d */.        ){.
26940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
26950 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66  s branch runs if
26960 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65   the record-size
26970 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65   field of the ce
26980 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20  ll is a.        
26990 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65    ** single byte
269a0 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20   varint and the 
269b0 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69  record fits enti
269c0 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e  rely on the main
269d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d  .          ** b-
269e0 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  tree page.  */. 
269f0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
26a00 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31  e( pCell+nCell+1
26a10 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e  ==pPage->aDataEn
26a20 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  d );.          c
26a30 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
26a40 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
26a50 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c  l, (void*)&pCell
26a60 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  [1], pIdxKey);. 
26a70 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
26a80 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78   !(pCell[1] & 0x
26a90 38 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26  80) .          &
26aa0 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65  & (nCell = ((nCe
26ab0 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70  ll&0x7f)<<7) + p
26ac0 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d  Cell[1])<=pPage-
26ad0 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20  >maxLocal.      
26ae0 20 20 20 20 2f 2a 20 26 26 20 28 70 43 65 6c 6c      /* && (pCell
26af0 2b 6e 43 65 6c 6c 2b 32 29 3c 3d 70 50 61 67 65  +nCell+2)<=pPage
26b00 2d 3e 61 44 61 74 61 45 6e 64 20 2a 2f 0a 20 20  ->aDataEnd */.  
26b10 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
26b20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
26b30 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61  -size field is a
26b40 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20 61   2 byte varint a
26b50 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20  nd the record . 
26b60 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73           ** fits
26b70 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
26b80 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67   main b-tree pag
26b90 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
26ba0 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c   testcase( pCell
26bb0 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d  +nCell+2==pPage-
26bc0 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20  >aDataEnd );.   
26bd0 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
26be0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
26bf0 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64  are(nCell, (void
26c00 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64  *)&pCell[2], pId
26c10 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  xKey);.        }
26c20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26c30 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c  /* The record fl
26c40 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e  ows over onto on
26c50 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
26c60 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20  ow pages. In.   
26c70 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
26c80 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65  ase the whole ce
26c90 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  ll needs to be p
26ca0 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 20  arsed, a buffer 
26cb0 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20  allocated.      
26cc0 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73      ** and acces
26cd0 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20  sPayload() used 
26ce0 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20  to retrieve the 
26cf0 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a  record into the.
26d00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66            ** buf
26d10 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65 52  fer before VdbeR
26d20 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63  ecordCompare() c
26d30 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f  an be called. */
26d40 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20  .          void 
26d50 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20  *pCellKey;.     
26d60 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20       u8 * const 
26d70 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c  pCellBody = pCel
26d80 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l - pPage->child
26d90 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  PtrSize;.       
26da0 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
26db0 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
26dc0 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e  lBody, &pCur->in
26dd0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  fo);.          n
26de0 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72  Cell = (int)pCur
26df0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20  ->info.nKey;.   
26e00 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20         pCellKey 
26e10 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
26e20 20 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20   nCell );.      
26e30 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79      if( pCellKey
26e40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
26e50 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
26e60 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
26e70 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
26e80 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
26e90 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
26ea0 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
26eb0 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28  Cur, 0, nCell, (
26ec0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
26ed0 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20  CellKey, 0);.   
26ee0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
26ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
26f00 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
26f10 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ey);.           
26f20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
26f30 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
26f40 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73  .          c = s
26f50 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
26f60 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70  Compare(nCell, p
26f70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79  CellKey, pIdxKey
26f80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
26f90 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
26fa0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ey);.        }. 
26fb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
26fc0 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
26fd0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
26fe0 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ey && !pPage->le
26ff0 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
27000 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20  lwr = idx;.     
27010 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
27020 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27030 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
27040 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
27050 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
27060 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
27070 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
27080 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
27090 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20  if( c<0 ){.     
270a0 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a     lwr = idx+1;.
270b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
270c0 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31       upr = idx-1
270d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
270e0 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20  if( lwr>upr ){. 
270f0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
27100 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72      }.      pCur
27110 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
27120 61 67 65 5d 20 3d 20 28 75 31 36 29 28 69 64 78  age] = (u16)(idx
27130 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 29 3b   = (lwr+upr)/2);
27140 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
27150 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c  t( lwr==upr+1 ||
27160 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   (pPage->intKey 
27170 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29  && !pPage->leaf)
27180 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
27190 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
271a0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
271b0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 63 68  leaf ){.      ch
271c0 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65  ldPg = 0;.    }e
271d0 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 70 50 61  lse if( lwr>=pPa
271e0 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
271f0 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34     chldPg = get4
27200 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
27210 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
27220 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c  set+8]);.    }el
27230 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67  se{.      chldPg
27240 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64   = get4byte(find
27250 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29  Cell(pPage, lwr)
27260 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
27270 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20   chldPg==0 ){.  
27280 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
27290 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
272a0 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
272b0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
272c0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 2a  nCell );.      *
272d0 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20  pRes = c;.      
272e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
272f0 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
27300 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a  o_finish;.    }.
27310 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
27320 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
27330 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 70 43 75  u16)lwr;.    pCu
27340 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
27350 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  0;.    pCur->val
27360 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  idNKey = 0;.    
27370 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
27380 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a  (pCur, chldPg);.
27390 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
273a0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
273b0 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69  .  }.moveto_fini
273c0 73 68 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  sh:.  return rc;
273d0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
273e0 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75  n TRUE if the cu
273f0 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
27400 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
27410 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   of the table..*
27420 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62  *.** TRUE will b
27430 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72  e returned after
27440 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
27450 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f  e3BtreeNext() mo
27460 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20  ves.** past the 
27470 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
27480 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74  e table or sqlit
27490 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f  e3BtreePrev() mo
274a0 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20  ves past.** the 
274b0 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52  first entry.  TR
274c0 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72  UE is also retur
274d0 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65  ned if the table
274e0 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
274f0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f  t sqlite3BtreeEo
27500 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  f(BtCursor *pCur
27510 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68  ){.  /* TODO: Wh
27520 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  at if the cursor
27530 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45   is in CURSOR_RE
27540 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c  QUIRESEEK but al
27550 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a  l table entries.
27560 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64    ** have been d
27570 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49  eleted? This API
27580 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68   will need to ch
27590 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61  ange to return a
275a0 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  n error code.  *
275b0 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65  * as well as the
275c0 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20   boolean result 
275d0 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65  value..  */.  re
275e0 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c  turn (CURSOR_VAL
275f0 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID!=pCur->eState
27600 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  );.}../*.** Adva
27610 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  nce the cursor t
27620 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
27630 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
27640 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
27650 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
27660 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
27670 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
27680 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
27690 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
276a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
276b0 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  efore.** this ro
276c0 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
276d0 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  , then set *pRes
276e0 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  =1..*/.int sqlit
276f0 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75  e3BtreeNext(BtCu
27700 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
27710 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
27720 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d  ;.  int idx;.  M
27730 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
27740 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
27750 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
27760 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
27770 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
27780 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
27790 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
277a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
277b0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  }.  assert( pRes
277c0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 43 55 52  !=0 );.  if( CUR
277d0 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
277e0 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
277f0 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
27800 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27810 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
27820 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a  ->skipNext>0 ){.
27830 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
27840 78 74 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65  xt = 0;.    *pRe
27850 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
27860 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
27870 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  .  pCur->skipNex
27880 74 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20  t = 0;..  pPage 
27890 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
278a0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69  Cur->iPage];.  i
278b0 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49  dx = ++pCur->aiI
278c0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
278d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
278e0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f  ->isInit );..  /
278f0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
27900 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70  e file is corrup
27910 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  t, it is possibl
27920 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
27930 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20  of idx .  ** to 
27940 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65 2e  be invalid here.
27950 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f   This can only o
27960 63 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e 64  ccur if a second
27970 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65 73   cursor modifies
27980 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77  .  ** the page w
27990 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75 72  hile cursor pCur
279a0 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65   is holding a re
279b0 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20 57  ference to it. W
279c0 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e  hich can.  ** on
279d0 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65  ly happen if the
279e0 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72   database is cor
279f0 72 75 70 74 20 69 6e 20 73 75 63 68 20 61 20 77  rupt in such a w
27a00 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68  ay as to link th
27a10 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f  e.  ** page into
27a20 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62   more than one b
27a30 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e  -tree structure.
27a40 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
27a50 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx>pPage->nCell
27a60 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66   );..  pCur->inf
27a70 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
27a80 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
27a90 20 30 3b 0a 20 20 69 66 28 20 69 64 78 3e 3d 70   0;.  if( idx>=p
27aa0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
27ab0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
27ac0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
27ad0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
27ae0 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50  ur, get4byte(&pP
27af0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
27b00 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29  ->hdrOffset+8]))
27b10 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
27b20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
27b30 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
27b40 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
27b50 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
27b60 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
27b70 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20     }.    do{.   
27b80 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61     if( pCur->iPa
27b90 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
27ba0 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
27bb0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
27bc0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
27bd0 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  D;.        retur
27be0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
27bf0 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54     }.      moveT
27c00 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
27c10 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75       pPage = pCu
27c20 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
27c30 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69  iPage];.    }whi
27c40 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  le( pCur->aiIdx[
27c50 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50  pCur->iPage]>=pP
27c60 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
27c70 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
27c80 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
27c90 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
27ca0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
27cb0 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  t(pCur, pRes);. 
27cc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27cd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
27ce0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
27cf0 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73   rc;.  }.  *pRes
27d00 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
27d10 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
27d20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27d30 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65  .  }.  rc = move
27d40 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
27d50 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
27d60 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68  .../*.** Step th
27d70 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
27d80 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76  back to the prev
27d90 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68  ious entry in th
27da0 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
27db0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
27dc0 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
27dd0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
27de0 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
27df0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69  inting to the fi
27e00 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
27e10 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
27e20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
27e30 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
27e40 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
27e50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
27e60 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
27e70 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
27e80 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
27e90 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
27ea0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
27eb0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
27ec0 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
27ed0 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
27ee0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
27ef0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
27f00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
27f10 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 74  ;.  }.  pCur->at
27f20 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  Last = 0;.  if( 
27f30 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
27f40 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
27f50 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
27f60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
27f70 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
27f80 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20  Cur->skipNext<0 
27f90 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  ){.    pCur->ski
27fa0 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 2a  pNext = 0;.    *
27fb0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65  pRes = 0;.    re
27fc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27fd0 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70    }.  pCur->skip
27fe0 4e 65 78 74 20 3d 20 30 3b 0a 0a 20 20 70 50 61  Next = 0;..  pPa
27ff0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
28000 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
28010 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
28020 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28  >isInit );.  if(
28030 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
28040 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70  .    int idx = p
28050 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
28060 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20  >iPage];.    rc 
28070 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
28080 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e  ur, get4byte(fin
28090 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
280a0 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  )));.    if( rc 
280b0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
280c0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
280d0 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
280e0 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73  st(pCur);.  }els
280f0 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43  e{.    while( pC
28100 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
28110 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20  iPage]==0 ){.   
28120 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61     if( pCur->iPa
28130 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
28140 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
28150 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
28160 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
28170 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
28180 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
28190 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54     }.      moveT
281a0 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
281b0 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
281c0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
281d0 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
281e0 65 79 20 3d 20 30 3b 0a 0a 20 20 20 20 70 43 75  ey = 0;..    pCu
281f0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
28200 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61  Page]--;.    pPa
28210 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
28220 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
28230 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
28240 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
28250 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
28260 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
28270 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70  Previous(pCur, p
28280 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Res);.    }else{
28290 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
282a0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
282b0 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20  .  *pRes = 0;.  
282c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
282d0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
282e0 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ew page from the
282f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
28300 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61  **.** The new pa
28310 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
28320 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65  dirty.  (In othe
28330 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33  r words, sqlite3
28340 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20  PagerWrite().** 
28350 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
28360 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e   called on the n
28370 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e  ew page.)  The n
28380 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f  ew page has also
28390 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e  .** been referen
283a0 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ced and the call
283b0 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72  ing routine is r
283c0 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
283d0 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65  alling.** sqlite
283e0 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e  3PagerUnref() on
283f0 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68   the new page wh
28400 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a  en it is done..*
28410 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
28420 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
28430 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65  ccess.  Any othe
28440 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  r return value i
28450 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65  ndicates.** an e
28460 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61  rror.  *ppPage a
28470 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e  nd *pPgno are un
28480 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65  defined in the e
28490 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72  vent of an error
284a0 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f  ..** Do not invo
284b0 6b 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ke sqlite3PagerU
284c0 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67  nref() on *ppPag
284d0 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73  e if an error is
284e0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
284f0 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22   If the "nearby"
28500 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
28510 74 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66  t 0, then an eff
28520 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a  ort is made to .
28530 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65  ** locate a page
28540 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61   close to the pa
28550 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62  ge number "nearb
28560 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  y".  This can be
28570 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61   used in an.** a
28580 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72  ttempt to keep r
28590 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f  elated pages clo
285a0 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72  se to each other
285b0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
285c0 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20   file,.** which 
285d0 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65  in turn can make
285e0 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
285f0 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   faster..**.** I
28600 66 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61  f the eMode para
28610 6d 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43  meter is BTALLOC
28620 5f 45 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e  _EXACT and the n
28630 65 61 72 62 79 20 70 61 67 65 20 65 78 69 73 74  earby page exist
28640 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e  s.** anywhere on
28650 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
28660 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61  then it is guara
28670 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75  nteed to be retu
28680 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f  rned.  If.** eMo
28690 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54  de is BTALLOC_LT
286a0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 72   then the page r
286b0 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20  eturned will be 
286c0 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
286d0 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20  al.** to nearby 
286e0 69 66 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  if any such page
286f0 20 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f   exists.  If eMo
28700 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e  de is BTALLOC_AN
28710 59 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20  Y then there.** 
28720 61 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69  are no restricti
28730 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67  ons on which pag
28740 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
28750 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
28760 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a  ocateBtreePage(.
28770 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
28780 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
28790 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  btree */.  MemPa
287a0 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
287b0 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74    /* Store point
287c0 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61  er to the alloca
287d0 74 65 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f  ted page here */
287e0 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20  .  Pgno *pPgno, 
287f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f            /* Sto
28800 72 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  re the page numb
28810 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e  er here */.  Pgn
28820 6f 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20  o nearby,       
28830 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
28840 72 20 61 20 70 61 67 65 20 6e 65 61 72 20 74 68  r a page near th
28850 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65  is one */.  u8 e
28860 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20  Mode            
28870 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58     /* BTALLOC_EX
28880 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c  ACT, BTALLOC_LT,
28890 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20   or BTALLOC_ANY 
288a0 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
288b0 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72  *pPage1;.  int r
288c0 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20  c;.  u32 n;     
288d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
288e0 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
288f0 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20  st */.  u32 k;  
28900 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
28910 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72  leaves on the tr
28920 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c  unk of the freel
28930 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ist */.  MemPage
28940 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20   *pTrunk = 0;.  
28950 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72  MemPage *pPrevTr
28960 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20  unk = 0;.  Pgno 
28970 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54  mxPage;     /* T
28980 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  otal size of the
28990 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
289a0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
289b0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
289c0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
289d0 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d   assert( eMode==
289e0 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28  BTALLOC_ANY || (
289f0 6e 65 61 72 62 79 3e 30 20 26 26 20 49 66 4e 6f  nearby>0 && IfNo
28a00 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 61 75 74  tOmitAV(pBt->aut
28a10 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a 20 20 70  oVacuum)) );.  p
28a20 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
28a30 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20  ge1;.  mxPage = 
28a40 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
28a50 42 74 29 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62  Bt);.  n = get4b
28a60 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
28a70 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63  ta[36]);.  testc
28a80 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31  ase( n==mxPage-1
28a90 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50   );.  if( n>=mxP
28aa0 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
28ab0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
28ac0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
28ad0 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54   n>0 ){.    /* T
28ae0 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f  here are pages o
28af0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
28b00 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68   Reuse one of th
28b10 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20  ose pages. */.  
28b20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20    Pgno iTrunk;. 
28b30 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74     u8 searchList
28b40 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20   = 0; /* If the 
28b50 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62  free-list must b
28b60 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27  e searched for '
28b70 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a  nearby' */.    .
28b80 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d      /* If eMode=
28b90 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61  =BTALLOC_EXACT a
28ba0 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  nd a query of th
28bb0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
28bc0 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20    ** shows that 
28bd0 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
28be0 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f  ' is somewhere o
28bf0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
28c00 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65   then.    ** the
28c10 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c   entire-list wil
28c20 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  l be searched fo
28c30 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20  r that page..   
28c40 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
28c50 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
28c60 55 4d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65  UM.    if( eMode
28c70 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  ==BTALLOC_EXACT 
28c80 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 61  ){.      if( nea
28c90 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20  rby<=mxPage ){. 
28ca0 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b         u8 eType;
28cb0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
28cc0 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20   nearby>0 );.   
28cd0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
28ce0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
28cf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
28d00 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72  mapGet(pBt, near
28d10 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a  by, &eType, 0);.
28d20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
28d30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
28d40 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
28d50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
28d60 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72  {.          sear
28d70 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20  chList = 1;.    
28d80 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
28d90 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64    }else if( eMod
28da0 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b  e==BTALLOC_LE ){
28db0 0a 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73  .      searchLis
28dc0 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  t = 1;.    }.#en
28dd0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72  dif..    /* Decr
28de0 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c  ement the free-l
28df0 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20  ist count by 1. 
28e00 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68  Set iTrunk to th
28e10 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20  e index of the. 
28e20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65     ** first free
28e30 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
28e40 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20  . iPrevTrunk is 
28e50 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20  initially 1..   
28e60 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
28e70 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
28e80 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
28e90 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
28ea0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74  turn rc;.    put
28eb0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
28ec0 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a  Data[36], n-1);.
28ed0 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65  .    /* The code
28ee0 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f   within this loo
28ef0 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e  p is run only on
28f00 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63  ce if the 'searc
28f10 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a  hList' variable.
28f20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72      ** is not tr
28f30 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ue. Otherwise, i
28f40 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  t runs once for 
28f50 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20  each trunk-page 
28f60 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72  on the.    ** fr
28f70 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68  ee-list until th
28f80 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
28f90 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64  is located (eMod
28fa0 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  e==BTALLOC_EXACT
28fb0 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69  ).    ** or unti
28fc0 6c 20 61 20 70 61 67 65 20 6c 65 73 73 20 74 68  l a page less th
28fd0 61 6e 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c  an 'nearby' is l
28fe0 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42  ocated (eMode==B
28ff0 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a  TALLOC_LT).    *
29000 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  /.    do {.     
29010 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54   pPrevTrunk = pT
29020 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  runk;.      if( 
29030 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
29040 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
29050 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  et4byte(&pPrevTr
29060 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  unk->aData[0]);.
29070 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29080 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
29090 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
290a0 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
290b0 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
290c0 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61  se( iTrunk==mxPa
290d0 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ge );.      if( 
290e0 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b  iTrunk>mxPage ){
290f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
29100 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
29110 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  T;.      }else{.
29120 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
29130 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
29140 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
29150 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
29160 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
29170 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
29180 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  0;.        goto 
29190 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
291a0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
291b0 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 21   assert( pTrunk!
291c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
291d0 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74  rt( pTrunk->aDat
291e0 61 21 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 6b  a!=0 );..      k
291f0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
29200 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 20  unk->aData[4]); 
29210 2f 2a 20 23 20 6f 66 20 6c 65 61 76 65 73 20 6f  /* # of leaves o
29220 6e 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67  n this trunk pag
29230 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6b  e */.      if( k
29240 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69  ==0 && !searchLi
29250 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
29260 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e   The trunk has n
29270 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65  o leaves and the
29280 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69   list is not bei
29290 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20  ng searched. .  
292a0 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72        ** So extr
292b0 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  act the trunk pa
292c0 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73  ge itself and us
292d0 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c  e it as the newl
292e0 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  y .        ** al
292f0 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a  located page */.
29300 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
29310 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b  pPrevTrunk==0 );
29320 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
29330 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
29340 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
29350 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
29360 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
29370 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
29380 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
29390 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
293a0 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   iTrunk;.       
293b0 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
293c0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
293d0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
293e0 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  );.        *ppPa
293f0 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
29400 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
29410 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
29420 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
29430 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
29440 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
29450 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
29460 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28 75    }else if( k>(u
29470 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  32)(pBt->usableS
29480 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20  ize/4 - 2) ){.  
29490 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
294a0 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f k is out of ra
294b0 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63  nge.  Database c
294c0 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
294d0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
294e0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
294f0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
29500 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23  allocate_page;.#
29510 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
29520 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
29530 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
29540 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20  archList .      
29550 20 20 20 20 20 20 26 26 20 28 6e 65 61 72 62 79        && (nearby
29560 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72  ==iTrunk || (iTr
29570 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65 4d  unk<nearby && eM
29580 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29  ode==BTALLOC_LE)
29590 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
295a0 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20      /* The list 
295b0 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  is being searche
295c0 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b  d and this trunk
295d0 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67   page is the pag
295e0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  e.        ** to 
295f0 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64  allocate, regard
29600 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
29610 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20  it has leaves.. 
29620 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
29630 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
29640 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  k;.        *ppPa
29650 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
29660 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
29670 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
29680 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
29690 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
296a0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
296b0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
296c0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
296d0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
296e0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
296f0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
29700 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
29710 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
29720 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
29730 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
29740 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
29750 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
29760 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
29770 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
29780 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
29790 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
297a0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
297b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
297c0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
297d0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
297e0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
297f0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  }.            me
29800 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b  mcpy(&pPrevTrunk
29810 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
29820 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
29830 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
29840 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
29850 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
29860 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71  runk page is req
29870 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c  uired by the cal
29880 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61  ler but it conta
29890 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ins .          *
298a0 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72  * pointers to fr
298b0 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20  ee-list leaves. 
298c0 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62  The first leaf b
298d0 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20  ecomes a trunk. 
298e0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65           ** page
298f0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
29900 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
29910 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
29920 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  NewTrunk;.      
29930 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75      Pgno iNewTru
29940 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
29950 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29  Trunk->aData[8])
29960 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
29970 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65  iNewTrunk>mxPage
29980 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
29990 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
299a0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
299b0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
299c0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
299d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
299e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
299f0 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  NewTrunk==mxPage
29a00 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
29a10 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
29a20 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20  pBt, iNewTrunk, 
29a30 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 2c 20 30  &pNewTrunk, 0, 0
29a40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
29a50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
29a60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  {.            go
29a70 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
29a80 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
29a90 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
29aa0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
29ab0 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44  te(pNewTrunk->pD
29ac0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
29ad0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29ae0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
29af0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
29b00 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
29b10 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
29b20 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
29b30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
29b40 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
29b50 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  wTrunk->aData[0]
29b60 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
29b70 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
29b80 20 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65     put4byte(&pNe
29b90 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  wTrunk->aData[4]
29ba0 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  , k-1);.        
29bb0 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
29bc0 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26  unk->aData[8], &
29bd0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32  pTrunk->aData[12
29be0 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20  ], (k-1)*4);.   
29bf0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
29c00 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ge(pNewTrunk);. 
29c10 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
29c20 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
29c30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
29c40 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
29c50 69 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e  iteable(pPage1->
29c60 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
29c70 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
29c80 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
29c90 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b  32], iNewTrunk);
29ca0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
29cb0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
29cc0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
29cd0 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d  rite(pPrevTrunk-
29ce0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
29cf0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
29d00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67  .              g
29d10 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
29d20 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
29d30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
29d40 20 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76   put4byte(&pPrev
29d50 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
29d60 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
29d70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29d80 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e   }.        pTrun
29d90 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
29da0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
29db0 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
29dc0 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
29dd0 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
29de0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
29df0 65 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a  else if( k>0 ){.
29e00 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
29e10 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74  ct a leaf from t
29e20 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20  he trunk */.    
29e30 20 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b      u32 closest;
29e40 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50  .        Pgno iP
29e50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73  age;.        uns
29e60 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74  igned char *aDat
29e70 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74  a = pTrunk->aDat
29e80 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  a;.        if( n
29e90 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20  earby>0 ){.     
29ea0 20 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20       u32 i;.    
29eb0 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
29ec0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  0;.          if(
29ed0 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
29ee0 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LE ){.          
29ef0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20    for(i=0; i<k; 
29f00 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
29f10 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
29f20 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a  byte(&aData[8+i*
29f30 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  4]);.           
29f40 20 20 20 69 66 28 20 69 50 61 67 65 3c 3d 6e 65     if( iPage<=ne
29f50 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20  arby ){.        
29f60 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
29f70 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = i;.           
29f80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
29f90 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
29fa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29fb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29fc0 20 20 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b         int dist;
29fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73  .            dis
29fe0 74 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e  t = sqlite3AbsIn
29ff0 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44  t32(get4byte(&aD
2a000 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79  ata[8]) - nearby
2a010 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
2a020 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b  or(i=1; i<k; i++
2a030 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2a040 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
2a050 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79  3AbsInt32(get4by
2a060 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d  te(&aData[8+i*4]
2a070 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20  ) - nearby);.   
2a080 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64             if( d
2a090 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20  2<dist ){.      
2a0a0 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
2a0b0 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  t = i;.         
2a0c0 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32         dist = d2
2a0d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2a0e0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
2a0f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a100 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a110 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
2a120 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
2a130 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74       iPage = get
2a140 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63  4byte(&aData[8+c
2a150 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20  losest*4]);.    
2a160 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50      testcase( iP
2a170 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  age==mxPage );. 
2a180 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65         if( iPage
2a190 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20  >mxPage ){.     
2a1a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2a1b0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2a1c0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2a1d0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2a1e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2a1f0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61     testcase( iPa
2a200 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  ge==mxPage );.  
2a210 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63        if( !searc
2a220 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20  hList .         
2a230 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62  || (iPage==nearb
2a240 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72  y || (iPage<near
2a250 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41  by && eMode==BTA
2a260 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20  LLOC_LE)) .     
2a270 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2a280 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20  int noContent;. 
2a290 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20           *pPgno 
2a2a0 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20  = iPage;.       
2a2b0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
2a2c0 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66  ATE: %d was leaf
2a2d0 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75   %d of %d on tru
2a2e0 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20  nk %d".         
2a2f0 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f          ": %d mo
2a300 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22  re free pages\n"
2a310 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2a320 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65     *pPgno, close
2a330 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d  st+1, k, pTrunk-
2a340 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  >pgno, n-1));.  
2a350 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2a360 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2a370 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
2a380 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2a390 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c  c ) goto end_all
2a3a0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
2a3b0 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73        if( closes
2a3c0 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  t<k-1 ){.       
2a3d0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61       memcpy(&aDa
2a3e0 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c  ta[8+closest*4],
2a3f0 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20   &aData[4+k*4], 
2a400 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
2a410 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
2a420 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  te(&aData[4], k-
2a430 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f  1);.          no
2a440 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65  Content = !btree
2a450 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  GetHasContent(pB
2a460 74 2c 20 2a 70 50 67 6e 6f 29 3b 0a 20 20 20 20  t, *pPgno);.    
2a470 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
2a480 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50  GetPage(pBt, *pP
2a490 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43  gno, ppPage, noC
2a4a0 6f 6e 74 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20  ontent, 0);.    
2a4b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2a4c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2a4d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2a4e0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
2a4f0 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
2a500 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2a510 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2a520 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2a530 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
2a540 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
2a550 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2a560 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72  }.          sear
2a570 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
2a580 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2a590 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2a5a0 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20  pPrevTrunk);.   
2a5b0 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20     pPrevTrunk = 
2a5c0 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73  0;.    }while( s
2a5d0 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d  earchList );.  }
2a5e0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
2a5f0 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20  re are no pages 
2a600 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  on the freelist,
2a610 20 73 6f 20 61 70 70 65 6e 64 20 61 20 6e 65 77   so append a new
2a620 20 70 61 67 65 20 74 6f 20 74 68 65 0a 20 20 20   page to the.   
2a630 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61   ** database ima
2a640 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ge..    **.    *
2a650 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20  * Normally, new 
2a660 70 61 67 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  pages allocated 
2a670 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 20 63 61  by this block ca
2a680 6e 20 62 65 20 72 65 71 75 65 73 74 65 64 20 66  n be requested f
2a690 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 70  rom the.    ** p
2a6a0 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20  ager layer with 
2a6b0 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27  the 'no-content'
2a6c0 20 66 6c 61 67 20 73 65 74 2e 20 54 68 69 73 20   flag set. This 
2a6d0 70 72 65 76 65 6e 74 73 20 74 68 65 20 70 61 67  prevents the pag
2a6e0 65 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74  er.    ** from t
2a6f0 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 74 68  rying to read th
2a700 65 20 70 61 67 65 73 20 63 6f 6e 74 65 6e 74 20  e pages content 
2a710 66 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76  from disk. Howev
2a720 65 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20 2a  er, if the.    *
2a730 2a 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  * current transa
2a740 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
2a750 79 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72  y run one or mor
2a760 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61  e incremental-va
2a770 63 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70  cuum.    ** step
2a780 73 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  s, then the page
2a790 20 77 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f   we are about to
2a7a0 20 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f   allocate may co
2a7b0 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20  ntain content.  
2a7c0 20 20 2a 2a 20 74 68 61 74 20 69 73 20 72 65 71    ** that is req
2a7d0 75 69 72 65 64 20 69 6e 20 74 68 65 20 65 76 65  uired in the eve
2a7e0 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b  nt of a rollback
2a7f0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
2a800 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65  do.    ** not se
2a810 74 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74  t the no-content
2a820 20 66 6c 61 67 2e 20 54 68 69 73 20 63 61 75 73   flag. This caus
2a830 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  es the pager to 
2a840 6c 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  load and journal
2a850 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72  .    ** the curr
2a860 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ent page content
2a870 20 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74   before overwrit
2a880 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20  ing it..    **. 
2a890 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
2a8a0 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6e  the pager will n
2a8b0 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 74 74 65  ot actually atte
2a8c0 6d 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a  mpt to load or j
2a8d0 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63  ournal .    ** c
2a8e0 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 70  ontent for any p
2a8f0 61 67 65 20 74 68 61 74 20 72 65 61 6c 6c 79 20  age that really 
2a900 64 6f 65 73 20 6c 69 65 20 70 61 73 74 20 74 68  does lie past th
2a910 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
2a920 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
2a930 65 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68  e on disk. So th
2a940 65 20 65 66 66 65 63 74 73 20 6f 66 20 64 69 73  e effects of dis
2a950 61 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f  abling the no-co
2a960 6e 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69  ntent optimizati
2a970 6f 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65 20 61  on.    ** here a
2a980 72 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74  re confined to t
2a990 68 6f 73 65 20 70 61 67 65 73 20 74 68 61 74 20  hose pages that 
2a9a0 6c 69 65 20 62 65 74 77 65 65 6e 20 74 68 65 20  lie between the 
2a9b0 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  end of the.    *
2a9c0 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  * database image
2a9d0 20 61 6e 64 20 74 68 65 20 65 6e 64 20 6f 66 20   and the end of 
2a9e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a9f0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  e..    */.    in
2aa00 74 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28  t bNoContent = (
2aa10 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70  0==IfNotOmitAV(p
2aa20 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29  Bt->bDoTruncate)
2aa30 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  );..    rc = sql
2aa40 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2aa50 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
2aa60 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
2aa70 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2aa80 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a    pBt->nPage++;.
2aa90 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61      if( pBt->nPa
2aaa0 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge==PENDING_BYTE
2aab0 5f 50 41 47 45 28 70 42 74 29 20 29 20 70 42 74  _PAGE(pBt) ) pBt
2aac0 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e  ->nPage++;..#ifn
2aad0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2aae0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
2aaf0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2ab00 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50  um && PTRMAP_ISP
2ab10 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50  AGE(pBt, pBt->nP
2ab20 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  age) ){.      /*
2ab30 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72   If *pPgno refer
2ab40 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d  s to a pointer-m
2ab50 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74  ap page, allocat
2ab60 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a  e two new pages.
2ab70 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20        ** at the 
2ab80 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
2ab90 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20  instead of one. 
2aba0 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61  The first alloca
2abb0 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ted page.      *
2abc0 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20  * becomes a new 
2abd0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
2abe0 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20  , the second is 
2abf0 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  used by the call
2ac00 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  er..      */.   
2ac10 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20     MemPage *pPg 
2ac20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45  = 0;.      TRACE
2ac30 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
2ac40 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
2ac50 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61   (pointer-map pa
2ac60 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61  ge)\n", pBt->nPa
2ac70 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ge));.      asse
2ac80 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  rt( pBt->nPage!=
2ac90 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2aca0 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20  E(pBt) );.      
2acb0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
2acc0 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67  e(pBt, pBt->nPag
2acd0 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74  e, &pPg, bNoCont
2ace0 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ent, 0);.      i
2acf0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ad00 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2ad10 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2ad20 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29  te(pPg->pDbPage)
2ad30 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
2ad40 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  ePage(pPg);.    
2ad50 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
2ad60 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2ad70 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b      pBt->nPage++
2ad80 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  ;.      if( pBt-
2ad90 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f  >nPage==PENDING_
2ada0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
2adb0 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20  { pBt->nPage++; 
2adc0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
2add0 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20 2b     put4byte(28 +
2ade0 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65   (u8*)pBt->pPage
2adf0 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e  1->aData, pBt->n
2ae00 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e  Page);.    *pPgn
2ae10 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  o = pBt->nPage;.
2ae20 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50  .    assert( *pP
2ae30 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
2ae40 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
2ae50 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
2ae60 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
2ae70 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f 43 6f 6e  , ppPage, bNoCon
2ae80 74 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  tent, 0);.    if
2ae90 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2aea0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2aeb0 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
2aec0 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
2aed0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2aee0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2aef0 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
2af00 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
2af10 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
2af20 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f  E: %d from end o
2af30 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e  f file\n", *pPgn
2af40 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  o));.  }..  asse
2af50 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
2af60 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2af70 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63  t) );..end_alloc
2af80 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65  ate_page:.  rele
2af90 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
2afa0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
2afb0 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66  PrevTrunk);.  if
2afc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2afd0 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
2afe0 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
2aff0 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  unt((*ppPage)->p
2b000 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20  DbPage)>1 ){.   
2b010 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
2b020 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  ppPage);.      r
2b030 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2b040 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
2b050 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e  .    (*ppPage)->
2b060 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65  isInit = 0;.  }e
2b070 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  lse{.    *ppPage
2b080 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
2b090 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
2b0a0 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  K || sqlite3Page
2b0b0 72 49 73 77 72 69 74 65 61 62 6c 65 28 28 2a 70  rIswriteable((*p
2b0c0 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
2b0d0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
2b0e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2b0f0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
2b100 74 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67  to add page iPag
2b110 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
2b120 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74  e file free-list
2b130 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75  . .** It is assu
2b140 6d 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  med that the pag
2b150 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
2b160 20 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66   a part of the f
2b170 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ree-list..**.** 
2b180 54 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  The value passed
2b190 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
2b1a0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
2b1b0 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69  function is opti
2b1c0 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20  onal..** If the 
2b1d0 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74  caller happens t
2b1e0 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72  o have a pointer
2b1f0 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20   to the MemPage 
2b200 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65  object .** corre
2b210 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65  sponding to page
2b220 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74   iPage handy, it
2b230 20 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20   may pass it as 
2b240 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65  the second value
2b250 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  . .** Otherwise,
2b260 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c   it may pass NUL
2b270 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f  L..**.** If a po
2b280 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61  inter to a MemPa
2b290 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73  ge object is pas
2b2a0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
2b2b0 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69  d argument,.** i
2b2c0 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  ts reference cou
2b2d0 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65  nt is not altere
2b2e0 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
2b2f0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
2b300 74 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68  t freePage2(BtSh
2b310 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61  ared *pBt, MemPa
2b320 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67  ge *pMemPage, Pg
2b330 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d  no iPage){.  Mem
2b340 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30  Page *pTrunk = 0
2b350 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b360 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72   /* Free-list tr
2b370 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  unk page */.  Pg
2b380 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20  no iTrunk = 0;  
2b390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3a0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
2b3b0 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72   of free-list tr
2b3c0 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d  unk page */ .  M
2b3d0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
2b3e0 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20   pBt->pPage1;   
2b3f0 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65     /* Local refe
2b400 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20  rence to page 1 
2b410 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
2b420 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2b430 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
2b440 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61   being freed. Ma
2b450 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  y be NULL. */.  
2b460 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
2b470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b480 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
2b490 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65  de */.  int nFre
2b4a0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2b4b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2b4c0 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66  nitial number of
2b4d0 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c   pages on free-l
2b4e0 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ist */..  assert
2b4f0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2b500 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
2b510 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 50   );.  assert( iP
2b520 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72  age>1 );.  asser
2b530 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20  t( !pMemPage || 
2b540 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  pMemPage->pgno==
2b550 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20  iPage );..  if( 
2b560 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20  pMemPage ){.    
2b570 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65  pPage = pMemPage
2b580 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
2b590 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62  erRef(pPage->pDb
2b5a0 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Page);.  }else{.
2b5b0 20 20 20 20 70 50 61 67 65 20 3d 20 62 74 72 65      pPage = btre
2b5c0 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c  ePageLookup(pBt,
2b5d0 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20   iPage);.  }..  
2b5e0 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
2b5f0 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74   free page count
2b600 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20   on pPage1 */.  
2b610 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2b620 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
2b630 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
2b640 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67  c ) goto freepag
2b650 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d  e_out;.  nFree =
2b660 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2b670 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
2b680 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
2b690 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46  1->aData[36], nF
2b6a0 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70  ree+1);..  if( p
2b6b0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
2b6c0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
2b6d0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
2b6e0 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20  e secure_delete 
2b6f0 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
2b700 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61  d, then.    ** a
2b710 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72  lways fully over
2b720 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
2b730 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
2b740 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eros..    */.   
2b750 20 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20   if( (!pPage && 
2b760 28 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50  ((rc = btreeGetP
2b770 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
2b780 26 70 50 61 67 65 2c 20 30 2c 20 30 29 29 21 3d  &pPage, 0, 0))!=
2b790 30 29 20 29 0a 20 20 20 20 20 7c 7c 20 20 20 20  0) ).     ||    
2b7a0 20 20 20 20 20 20 20 20 28 28 72 63 20 3d 20 73          ((rc = s
2b7b0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2b7c0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2b7d0 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0).    ){.   
2b7e0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
2b7f0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
2b800 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44  memset(pPage->aD
2b810 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70  ata, 0, pPage->p
2b820 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
2b830 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
2b840 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
2b850 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77  s auto-vacuum, w
2b860 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  rite an entry in
2b870 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2b880 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74  .  ** to indicat
2b890 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
2b8a0 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20  is free..  */.  
2b8b0 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2b8c0 20 29 7b 0a 20 20 20 20 70 74 72 6d 61 70 50 75   ){.    ptrmapPu
2b8d0 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54  t(pBt, iPage, PT
2b8e0 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30  RMAP_FREEPAGE, 0
2b8f0 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20  , &rc);.    if( 
2b900 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61  rc ) goto freepa
2b910 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  ge_out;.  }..  /
2b920 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65  * Now manipulate
2b930 20 74 68 65 20 61 63 74 75 61 6c 20 64 61 74 61   the actual data
2b940 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73  base free-list s
2b950 74 72 75 63 74 75 72 65 2e 20 54 68 65 72 65 20  tructure. There 
2b960 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73  are two.  ** pos
2b970 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74  sibilities. If t
2b980 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
2b990 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c  currently empty,
2b9a0 20 6f 72 20 69 66 20 74 68 65 20 66 69 72 73 74   or if the first
2b9b0 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65  .  ** trunk page
2b9c0 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
2b9d0 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20  t is full, then 
2b9e0 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62  this page will b
2b9f0 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77  ecome a.  ** new
2ba00 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
2ba10 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65   page. Otherwise
2ba20 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  , it will become
2ba30 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20   a leaf of the. 
2ba40 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20   ** first trunk 
2ba50 70 61 67 65 20 69 6e 20 74 68 65 20 63 75 72 72  page in the curr
2ba60 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54  ent free-list. T
2ba70 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20  his block tests 
2ba80 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f  if it.  ** is po
2ba90 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68  ssible to add th
2baa0 65 20 70 61 67 65 20 61 73 20 61 20 6e 65 77 20  e page as a new 
2bab0 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a  free-list leaf..
2bac0 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65    */.  if( nFree
2bad0 21 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e  !=0 ){.    u32 n
2bae0 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20  Leaf;           
2baf0 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
2bb00 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63  number of leaf c
2bb10 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61  ells on trunk pa
2bb20 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e  ge */..    iTrun
2bb30 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
2bb40 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
2bb50 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ;.    rc = btree
2bb60 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72  GetPage(pBt, iTr
2bb70 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 2c  unk, &pTrunk, 0,
2bb80 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
2bb90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2bba0 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
2bbb0 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_out;.    }..  
2bbc0 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79    nLeaf = get4by
2bbd0 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
2bbe0 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  a[4]);.    asser
2bbf0 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
2bc00 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28  ze>32 );.    if(
2bc10 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42   nLeaf > (u32)pB
2bc20 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
2bc30 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20  - 2 ){.      rc 
2bc40 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2bc50 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
2bc60 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2bc70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c      }.    if( nL
2bc80 65 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e  eaf < (u32)pBt->
2bc90 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
2bca0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20   ){.      /* In 
2bcb0 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20  this case there 
2bcc0 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74  is room on the t
2bcd0 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73  runk page to ins
2bce0 65 72 74 20 74 68 65 20 70 61 67 65 0a 20 20 20  ert the page.   
2bcf0 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65     ** being free
2bd00 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e  d as a new leaf.
2bd10 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2bd20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
2bd30 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e   trunk page is n
2bd40 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75  ot really full u
2bd50 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ntil it contains
2bd60 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  .      ** usable
2bd70 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69  Size/4 - 2 entri
2bd80 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69  es, not usableSi
2bd90 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
2bda0 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20   as we have.    
2bdb0 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74    ** coded.  But
2bdc0 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67   due to a coding
2bdd0 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f   error in versio
2bde0 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69  ns of SQLite pri
2bdf0 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33  or to.      ** 3
2be00 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20  .6.0, databases 
2be10 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72  with freelist tr
2be20 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e  unk pages holdin
2be30 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20  g more than.    
2be40 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
2be50 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69  4 - 8 entries wi
2be60 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61  ll be reported a
2be70 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f  s corrupt.  In o
2be80 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f  rder.      ** to
2be90 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61   maintain backwa
2bea0 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
2beb0 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72  y with older ver
2bec0 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c  sions of SQLite,
2bed0 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c  .      ** we wil
2bee0 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65  l continue to re
2bef0 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65  strict the numbe
2bf00 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20  r of entries to 
2bf10 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
2bf20 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f  .      ** for no
2bf30 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e  w.  At some poin
2bf40 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  t in the future 
2bf50 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68  (once everyone h
2bf60 61 73 20 75 70 67 72 61 64 65 64 0a 20 20 20 20  as upgraded.    
2bf70 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72    ** to 3.6.0 or
2bf80 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c   later) we shoul
2bf90 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e  d consider fixin
2bfa0 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61  g the conditiona
2bfb0 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a  l above.      **
2bfc0 20 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65   to read "usable
2bfd0 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61  Size/4-2" instea
2bfe0 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65  d of "usableSize
2bff0 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2f 0a  /4-8"..      */.
2c000 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2c010 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
2c020 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2c030 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2c040 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2c050 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
2c060 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c  nk->aData[4], nL
2c070 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  eaf+1);.        
2c080 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  put4byte(&pTrunk
2c090 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a  ->aData[8+nLeaf*
2c0a0 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  4], iPage);.    
2c0b0 20 20 20 20 69 66 28 20 70 50 61 67 65 20 26 26      if( pPage &&
2c0c0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
2c0d0 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
2c0e0 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ETE)==0 ){.     
2c0f0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
2c100 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65  rDontWrite(pPage
2c110 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2c120 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
2c130 20 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f   = btreeSetHasCo
2c140 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65  ntent(pBt, iPage
2c150 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2c160 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
2c170 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74  GE: %d leaf on t
2c180 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c  runk page %d\n",
2c190 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75  pPage->pgno,pTru
2c1a0 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  nk->pgno));.    
2c1b0 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
2c1c0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
2c1d0 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20    /* If control 
2c1e0 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f  flows to this po
2c1f0 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73  int, then it was
2c200 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
2c210 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68   add the.  ** th
2c220 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65  e page being fre
2c230 65 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67  ed as a leaf pag
2c240 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74  e of the first t
2c250 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65  runk in the free
2c260 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73  -list..  ** Poss
2c270 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65  ibly because the
2c280 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d   free-list is em
2c290 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79  pty, or possibly
2c2a0 20 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20   because the .  
2c2b0 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69  ** first trunk i
2c2c0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
2c2d0 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20  is full. Either 
2c2e0 77 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65  way, the page be
2c2f0 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77  ing freed.  ** w
2c300 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e  ill become the n
2c310 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70  ew first trunk p
2c320 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d  age in the free-
2c330 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
2c340 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c   pPage==0 && SQL
2c350 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74  ITE_OK!=(rc = bt
2c360 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2c370 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
2c380 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74  , 0)) ){.    got
2c390 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2c3a0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
2c3b0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2c3c0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
2c3d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2c3e0 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  K ){.    goto fr
2c3f0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
2c400 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
2c410 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29  ->aData, iTrunk)
2c420 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
2c430 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30  age->aData[4], 0
2c440 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
2c450 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
2c460 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43  , iPage);.  TRAC
2c470 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
2c480 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65  d new trunk page
2c490 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22   replacing %d\n"
2c4a0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69  , pPage->pgno, i
2c4b0 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61  Trunk));..freepa
2c4c0 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50  ge_out:.  if( pP
2c4d0 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
2c4e0 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
2c4f0 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
2c500 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73  pPage);.  releas
2c510 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
2c520 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74   return rc;.}.st
2c530 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 61  atic void freePa
2c540 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
2c550 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  e, int *pRC){.  
2c560 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49  if( (*pRC)==SQLI
2c570 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
2c580 43 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 50  C = freePage2(pP
2c590 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c  age->pBt, pPage,
2c5a0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
2c5b0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
2c5c0 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
2c5d0 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
2c5e0 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65  ith the given Ce
2c5f0 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
2c600 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50  t clearCell(MemP
2c610 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69  age *pPage, unsi
2c620 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
2c630 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
2c640 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
2c650 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
2c660 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e  ;.  Pgno ovflPgn
2c670 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  o;.  int rc;.  i
2c680 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20  nt nOvfl;.  u32 
2c690 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20  ovflPageSize;.. 
2c6a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2c6b0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
2c6c0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
2c6d0 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
2c6e0 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
2c6f0 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66  ll, &info);.  if
2c700 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
2c710 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
2c720 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a  n SQLITE_OK;  /*
2c730 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   No overflow pag
2c740 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  es. Return witho
2c750 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
2c760 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  g */.  }.  if( p
2c770 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell+info.iOverf
2c780 6c 6f 77 2b 33 20 3e 20 70 50 61 67 65 2d 3e 61  low+3 > pPage->a
2c790 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b  Data+pPage->mask
2c7a0 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
2c7b0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2c7c0 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c  T_BKPT;  /* Cell
2c7d0 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e   extends past en
2c7e0 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d  d of page */.  }
2c7f0 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65  .  ovflPgno = ge
2c800 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
2c810 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
2c820 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
2c830 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b  sableSize > 4 );
2c840 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20  .  ovflPageSize 
2c850 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
2c860 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d  e - 4;.  nOvfl =
2c870 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20   (info.nPayload 
2c880 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20  - info.nLocal + 
2c890 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31  ovflPageSize - 1
2c8a0 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  )/ovflPageSize;.
2c8b0 20 20 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67    assert( ovflPg
2c8c0 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30  no==0 || nOvfl>0
2c8d0 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76   );.  while( nOv
2c8e0 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  fl-- ){.    Pgno
2c8f0 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20   iNext = 0;.    
2c900 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
2c910 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c   0;.    if( ovfl
2c920 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67  Pgno<2 || ovflPg
2c930 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e  no>btreePagecoun
2c940 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  t(pBt) ){.      
2c950 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65  /* 0 is not a le
2c960 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  gal page number 
2c970 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f  and page 1 canno
2c980 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a  t be an .      *
2c990 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  * overflow page.
2c9a0 20 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76   Therefore if ov
2c9b0 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74  flPgno<2 or past
2c9c0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2c9d0 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74  .      ** file t
2c9e0 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
2c9f0 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a   be corrupt. */.
2ca00 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2ca10 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2ca20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2ca30 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72  nOvfl ){.      r
2ca40 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
2ca50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e  age(pBt, ovflPgn
2ca60 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78  o, &pOvfl, &iNex
2ca70 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
2ca80 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2ca90 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70    }..    if( ( p
2caa0 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20  Ovfl || ((pOvfl 
2cab0 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75  = btreePageLooku
2cac0 70 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29  p(pBt, ovflPgno)
2cad0 29 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20  )!=0) ).     && 
2cae0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
2caf0 52 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e  Refcount(pOvfl->
2cb00 70 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20  pDbPage)!=1.    
2cb10 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  ){.      /* Ther
2cb20 65 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61  e is no reason a
2cb30 6e 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64  ny cursor should
2cb40 20 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e   have an outstan
2cb50 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a  ding reference .
2cb60 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f        ** to an o
2cb70 76 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c  verflow page bel
2cb80 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c  onging to a cell
2cb90 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 64   that is being d
2cba0 65 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a  eleted/updated..
2cbb0 20 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74        ** So if t
2cbc0 68 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65  here exists more
2cbd0 20 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65   than one refere
2cbe0 6e 63 65 20 74 6f 20 74 68 69 73 20 70 61 67 65  nce to this page
2cbf0 2c 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20  , then it .     
2cc00 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61   ** must not rea
2cc10 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  lly be an overfl
2cc20 6f 77 20 70 61 67 65 20 61 6e 64 20 74 68 65 20  ow page and the 
2cc30 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
2cc40 20 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20   corrupt. .     
2cc50 20 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75   ** It is helpfu
2cc60 6c 20 74 6f 20 64 65 74 65 63 74 20 74 68 69 73  l to detect this
2cc70 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
2cc80 66 72 65 65 50 61 67 65 32 28 29 2c 20 61 73 20  freePage2(), as 
2cc90 0a 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61  .      ** freePa
2cca0 67 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74  ge2() may zero t
2ccb0 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  he page contents
2ccc0 20 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74   if secure-delet
2ccd0 65 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20  e mode is.      
2cce0 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74  ** enabled. If t
2ccf0 68 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70  his 'overflow' p
2cd00 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  age happens to b
2cd10 65 20 61 20 70 61 67 65 20 74 68 61 74 20 74 68  e a page that th
2cd20 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65  e.      ** calle
2cd30 72 20 69 73 20 69 74 65 72 61 74 69 6e 67 20 74  r is iterating t
2cd40 68 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20  hrough or using 
2cd50 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61  in some other wa
2cd60 79 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a  y, this.      **
2cd70 20 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61   can be problema
2cd80 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tic..      */.  
2cd90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2cda0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2cdb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2cdc0 63 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42  c = freePage2(pB
2cdd0 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67  t, pOvfl, ovflPg
2cde0 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  no);.    }..    
2cdf0 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20  if( pOvfl ){.   
2ce00 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
2ce10 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50  nref(pOvfl->pDbP
2ce20 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
2ce30 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2ce40 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f  rc;.    ovflPgno
2ce50 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20   = iNext;.  }.  
2ce60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2ce70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
2ce80 65 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65  e the byte seque
2ce90 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72  nce used to repr
2cea0 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20  esent a cell on 
2ceb0 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e  page pPage.** an
2cec0 64 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74  d write that byt
2ced0 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20  e sequence into 
2cee0 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c  pCell[].  Overfl
2cef0 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20  ow pages are.** 
2cf00 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69  allocated and fi
2cf10 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73  lled in as neces
2cf20 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69  sary.  The calli
2cf30 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20  ng procedure.** 
2cf40 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
2cf50 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73  or making sure s
2cf60 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
2cf70 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
2cf80 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b  ed.** for pCell[
2cf90 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  ]..**.** Note th
2cfa0 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f  at pCell does no
2cfb0 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64  t necessary need
2cfc0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
2cfd0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a   pPage->aData.**
2cfe0 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69   area.  pCell mi
2cff0 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d  ght point to som
2d000 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  e temporary stor
2d010 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77  age.  The cell w
2d020 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72  ill.** be constr
2d030 75 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65  ucted in this te
2d040 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65  mporary area the
2d050 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50  n copied into pP
2d060 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61  age->aData.** la
2d070 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ter..*/.static i
2d080 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20  nt fillInCell(. 
2d090 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
2d0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d0b0 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
2d0c0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65   contains the ce
2d0d0 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ll */.  unsigned
2d0e0 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20   char *pCell,   
2d0f0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65         /* Comple
2d100 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63  te text of the c
2d110 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ell */.  const v
2d120 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e  oid *pKey, i64 n
2d130 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b  Key,    /* The k
2d140 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ey */.  const vo
2d150 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44  id *pData,int nD
2d160 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61  ata,   /* The da
2d170 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72  ta */.  int nZer
2d180 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
2d190 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
2d1a0 7a 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70  zero bytes to ap
2d1b0 70 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f  pend to pData */
2d1c0 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20  .  int *pnSize  
2d1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d1e0 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20    /* Write cell 
2d1f0 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  size here */.){.
2d200 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a    int nPayload;.
2d210 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63    const u8 *pSrc
2d220 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c  ;.  int nSrc, n,
2d230 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65   rc;.  int space
2d240 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  Left;.  MemPage 
2d250 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65  *pOvfl = 0;.  Me
2d260 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73  mPage *pToReleas
2d270 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65  e = 0;.  unsigne
2d280 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a  d char *pPrior;.
2d290 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2d2a0 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53  *pPayload;.  BtS
2d2b0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
2d2c0 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20  ge->pBt;.  Pgno 
2d2d0 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  pgnoOvfl = 0;.  
2d2e0 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20 20 43  int nHeader;.  C
2d2f0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20  ellInfo info;.. 
2d300 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2d310 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
2d320 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
2d330 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73  ;..  /* pPage is
2d340 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
2d350 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65   writeable since
2d360 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20   pCell might be 
2d370 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62  auxiliary.  ** b
2d380 75 66 66 65 72 20 73 70 61 63 65 20 74 68 61 74  uffer space that
2d390 20 69 73 20 73 65 70 61 72 61 74 65 20 66 72 6f   is separate fro
2d3a0 6d 20 74 68 65 20 70 50 61 67 65 20 62 75 66 66  m the pPage buff
2d3b0 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73  er area */.  ass
2d3c0 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65  ert( pCell<pPage
2d3d0 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c  ->aData || pCell
2d3e0 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
2d3f0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
2d400 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
2d410 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2d420 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
2d430 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46  Page) );..  /* F
2d440 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65  ill in the heade
2d450 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20  r. */.  nHeader 
2d460 3d 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67  = 0;.  if( !pPag
2d470 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e  e->leaf ){.    n
2d480 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d  Header += 4;.  }
2d490 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61  .  if( pPage->ha
2d4a0 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 48 65  sData ){.    nHe
2d4b0 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
2d4c0 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  t(&pCell[nHeader
2d4d0 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b  ], nData+nZero);
2d4e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44  .  }else{.    nD
2d4f0 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b  ata = nZero = 0;
2d500 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b  .  }.  nHeader +
2d510 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  = putVarint(&pCe
2d520 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75  ll[nHeader], *(u
2d530 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 62 74  64*)&nKey);.  bt
2d540 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
2d550 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
2d560 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
2d570 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48  info.nHeader==nH
2d580 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73 65 72  eader );.  asser
2d590 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b  t( info.nKey==nK
2d5a0 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ey );.  assert( 
2d5b0 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 28 75 33 32  info.nData==(u32
2d5c0 29 28 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 20 29  )(nData+nZero) )
2d5d0 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  ;.  .  /* Fill i
2d5e0 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f  n the payload */
2d5f0 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44  .  nPayload = nD
2d600 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69  ata + nZero;.  i
2d610 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
2d620 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70   ){.    pSrc = p
2d630 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d  Data;.    nSrc =
2d640 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74   nData;.    nDat
2d650 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20  a = 0;.  }else{ 
2d660 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 6e  .    if( NEVER(n
2d670 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 7c  Key>0x7fffffff |
2d680 7c 20 70 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20  | pKey==0) ){.  
2d690 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d6a0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2d6b0 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f      }.    nPaylo
2d6c0 61 64 20 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b  ad += (int)nKey;
2d6d0 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79  .    pSrc = pKey
2d6e0 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e  ;.    nSrc = (in
2d6f0 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70  t)nKey;.  }.  *p
2d700 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69  nSize = info.nSi
2d710 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20  ze;.  spaceLeft 
2d720 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  = info.nLocal;. 
2d730 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65   pPayload = &pCe
2d740 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70  ll[nHeader];.  p
2d750 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69  Prior = &pCell[i
2d760 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a  nfo.iOverflow];.
2d770 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f  .  while( nPaylo
2d780 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  ad>0 ){.    if( 
2d790 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a  spaceLeft==0 ){.
2d7a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2d7b0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2d7c0 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74       Pgno pgnoPt
2d7d0 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b  rmap = pgnoOvfl;
2d7e0 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67   /* Overflow pag
2d7f0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
2d800 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  try page */.    
2d810 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
2d820 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
2d830 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70   do{.          p
2d840 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20  gnoOvfl++;.     
2d850 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20     } while( .   
2d860 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53         PTRMAP_IS
2d870 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76  PAGE(pBt, pgnoOv
2d880 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d  fl) || pgnoOvfl=
2d890 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
2d8a0 47 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20  GE(pBt) .       
2d8b0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
2d8c0 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  if.      rc = al
2d8d0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
2d8e0 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67  pBt, &pOvfl, &pg
2d8f0 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c  noOvfl, pgnoOvfl
2d900 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 0);.#ifndef SQ
2d910 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2d920 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
2d930 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
2d940 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
2d950 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f  um, and the seco
2d960 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74  nd or subsequent
2d970 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
2d980 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  ow page is being
2d990 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20   allocated, add 
2d9a0 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  an entry to the 
2d9b0 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
2d9c0 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61    ** for that pa
2d9d0 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a  ge now. .      *
2d9e0 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
2d9f0 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
2da00 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
2da10 68 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74  hen write a part
2da20 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20  ial entry .     
2da30 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74   ** to the point
2da40 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72  er-map. If we wr
2da50 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74  ite nothing to t
2da60 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  his pointer-map 
2da70 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74  slot,.      ** t
2da80 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74  hen the optimist
2da90 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  ic overflow chai
2daa0 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20  n processing in 
2dab0 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20  clearCell().    
2dac0 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65    ** may misinte
2dad0 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74  rpret the uninit
2dae0 69 61 6c 69 73 65 64 20 76 61 6c 75 65 73 20 61  ialised values a
2daf0 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20  nd delete the.  
2db00 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67      ** wrong pag
2db10 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  es from the data
2db20 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  base..      */. 
2db30 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
2db40 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d  toVacuum && rc==
2db50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2db60 20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20       u8 eType = 
2db70 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d  (pgnoPtrmap?PTRM
2db80 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52  AP_OVERFLOW2:PTR
2db90 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a  MAP_OVERFLOW1);.
2dba0 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
2dbb0 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c  t(pBt, pgnoOvfl,
2dbc0 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d   eType, pgnoPtrm
2dbd0 61 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  ap, &rc);.      
2dbe0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2dbf0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2dc00 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  e(pOvfl);.      
2dc10 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
2dc20 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  if.      if( rc 
2dc30 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
2dc40 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
2dc50 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
2dc60 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
2dc70 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52        /* If pToR
2dc80 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65  elease is not ze
2dc90 72 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70  ro than pPrior p
2dca0 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64  oints into the d
2dcb0 61 74 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a  ata area.      *
2dcc0 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e  * of pToRelease.
2dcd0 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52    Make sure pToR
2dce0 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20  elease is still 
2dcf0 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20  writeable. */.  
2dd00 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52      assert( pToR
2dd10 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c  elease==0 || sql
2dd20 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2dd30 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d  able(pToRelease-
2dd40 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
2dd50 20 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72      /* If pPrior
2dd60 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
2dd70 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61  data area of pPa
2dd80 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  ge, then make su
2dd90 72 65 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a  re pPage.      *
2dda0 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  * is still write
2ddb0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  able */.      as
2ddc0 73 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61  sert( pPrior<pPa
2ddd0 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72  ge->aData || pPr
2dde0 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  ior>=&pPage->aDa
2ddf0 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
2de00 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
2de10 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2de20 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
2de30 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
2de40 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
2de50 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20  or, pgnoOvfl);. 
2de60 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2de70 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
2de80 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d      pToRelease =
2de90 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50   pOvfl;.      pP
2dea0 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44  rior = pOvfl->aD
2deb0 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ata;.      put4b
2dec0 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a  yte(pPrior, 0);.
2ded0 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d        pPayload =
2dee0 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34   &pOvfl->aData[4
2def0 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65  ];.      spaceLe
2df00 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ft = pBt->usable
2df10 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a  Size - 4;.    }.
2df20 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64      n = nPayload
2df30 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63  ;.    if( n>spac
2df40 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63  eLeft ) n = spac
2df50 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49  eLeft;..    /* I
2df60 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  f pToRelease is 
2df70 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50  not zero than pP
2df80 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e  ayload points in
2df90 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61  to the data area
2dfa0 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65  .    ** of pToRe
2dfb0 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72  lease.  Make sur
2dfc0 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  e pToRelease is 
2dfd0 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e  still writeable.
2dfe0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2dff0 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c  pToRelease==0 ||
2e000 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2e010 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65  riteable(pToRele
2e020 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ase->pDbPage) );
2e030 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79  ..    /* If pPay
2e040 6c 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66 20  load is part of 
2e050 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66  the data area of
2e060 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b   pPage, then mak
2e070 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20  e sure pPage.   
2e080 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69   ** is still wri
2e090 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73  teable */.    as
2e0a0 73 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70  sert( pPayload<p
2e0b0 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70  Page->aData || p
2e0c0 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d  Payload>=&pPage-
2e0d0 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
2e0e0 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
2e0f0 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
2e100 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2e110 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
2e120 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20  .    if( nSrc>0 
2e130 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e  ){.      if( n>n
2e140 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a  Src ) n = nSrc;.
2e150 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
2e160 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  rc );.      memc
2e170 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72  py(pPayload, pSr
2e180 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  c, n);.    }else
2e190 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
2e1a0 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a  Payload, 0, n);.
2e1b0 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f      }.    nPaylo
2e1c0 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61  ad -= n;.    pPa
2e1d0 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20  yload += n;.    
2e1e0 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e  pSrc += n;.    n
2e1f0 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70  Src -= n;.    sp
2e200 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20  aceLeft -= n;.  
2e210 20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b    if( nSrc==0 ){
2e220 0a 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44  .      nSrc = nD
2e230 61 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20  ata;.      pSrc 
2e240 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20  = pData;.    }. 
2e250 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
2e260 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
2e270 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2e280 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
2e290 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  e the i-th cell 
2e2a0 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69  from pPage.  Thi
2e2b0 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74  s routine effect
2e2c0 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a  s pPage only..**
2e2d0 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   The cell conten
2e2e0 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f  t is not freed o
2e2f0 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20  r deallocated.  
2e300 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
2e310 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63  at.** the cell c
2e320 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20  ontent has been 
2e330 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65  copied someplace
2e340 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75   else.  This rou
2e350 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d  tine just.** rem
2e360 6f 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e  oves the referen
2e370 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66  ce to the cell f
2e380 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a  rom pPage..**.**
2e390 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68   "sz" must be th
2e3a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
2e3b0 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a  s in the cell..*
2e3c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 72  /.static void dr
2e3d0 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  opCell(MemPage *
2e3e0 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20  pPage, int idx, 
2e3f0 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43  int sz, int *pRC
2e400 29 7b 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20  ){.  u32 pc;    
2e410 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
2e420 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f  o cell content o
2e430 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c  f cell being del
2e440 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61  eted */.  u8 *da
2e450 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61  ta;       /* pPa
2e460 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75  ge->aData */.  u
2e470 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f  8 *ptr;        /
2e480 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62  * Used to move b
2e490 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68  ytes around with
2e4a0 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75  in data[] */.  u
2e4b0 38 20 2a 65 6e 64 50 74 72 3b 20 20 20 20 20 2f  8 *endPtr;     /
2e4c0 2a 20 45 6e 64 20 6f 66 20 6c 6f 6f 70 20 2a 2f  * End of loop */
2e4d0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
2e4e0 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
2e4f0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68   code */.  int h
2e500 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65  dr;        /* Be
2e510 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 68  ginning of the h
2e520 65 61 64 65 72 2e 20 20 30 20 6d 6f 73 74 20 70  eader.  0 most p
2e530 61 67 65 73 2e 20 20 31 30 30 20 70 61 67 65 20  ages.  100 page 
2e540 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43  1 */..  if( *pRC
2e550 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
2e560 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20  sert( idx>=0 && 
2e570 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
2e580 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
2e590 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  ==cellSize(pPage
2e5a0 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65  , idx) );.  asse
2e5b0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2e5c0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
2e5d0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
2e5e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2e5f0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
2e600 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
2e610 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
2e620 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d  ->aData;.  ptr =
2e630 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64   &pPage->aCellId
2e640 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d  x[2*idx];.  pc =
2e650 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a   get2byte(ptr);.
2e660 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
2e670 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74  drOffset;.  test
2e680 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79  case( pc==get2by
2e690 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
2e6a0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
2e6b0 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42  pc+sz==pPage->pB
2e6c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
2e6d0 0a 20 20 69 66 28 20 70 63 20 3c 20 28 75 33 32  .  if( pc < (u32
2e6e0 29 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  )get2byte(&data[
2e6f0 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a  hdr+5]) || pc+sz
2e700 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   > pPage->pBt->u
2e710 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
2e720 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
2e730 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2e740 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72   return;.  }.  r
2e750 63 20 3d 20 66 72 65 65 53 70 61 63 65 28 70 50  c = freeSpace(pP
2e760 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20  age, pc, sz);.  
2e770 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70  if( rc ){.    *p
2e780 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74  RC = rc;.    ret
2e790 75 72 6e 3b 0a 20 20 7d 0a 20 20 65 6e 64 50 74  urn;.  }.  endPt
2e7a0 72 20 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c  r = &pPage->aCel
2e7b0 6c 49 64 78 5b 32 2a 70 50 61 67 65 2d 3e 6e 43  lIdx[2*pPage->nC
2e7c0 65 6c 6c 20 2d 20 32 5d 3b 0a 20 20 61 73 73 65  ell - 2];.  asse
2e7d0 72 74 28 20 28 53 51 4c 49 54 45 5f 50 54 52 5f  rt( (SQLITE_PTR_
2e7e0 54 4f 5f 49 4e 54 28 70 74 72 29 26 31 29 3d 3d  TO_INT(ptr)&1)==
2e7f0 30 20 29 3b 20 20 2f 2a 20 70 74 72 20 69 73 20  0 );  /* ptr is 
2e800 61 6c 77 61 79 73 20 32 2d 62 79 74 65 20 61 6c  always 2-byte al
2e810 69 67 6e 65 64 20 2a 2f 0a 20 20 77 68 69 6c 65  igned */.  while
2e820 28 20 70 74 72 3c 65 6e 64 50 74 72 20 29 7b 0a  ( ptr<endPtr ){.
2e830 20 20 20 20 2a 28 75 31 36 2a 29 70 74 72 20 3d      *(u16*)ptr =
2e840 20 2a 28 75 31 36 2a 29 26 70 74 72 5b 32 5d 3b   *(u16*)&ptr[2];
2e850 0a 20 20 20 20 70 74 72 20 2b 3d 20 32 3b 0a 20  .    ptr += 2;. 
2e860 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c   }.  pPage->nCel
2e870 6c 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28  l--;.  put2byte(
2e880 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50  &data[hdr+3], pP
2e890 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70  age->nCell);.  p
2e8a0 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32  Page->nFree += 2
2e8b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
2e8c0 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20  t a new cell on 
2e8d0 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e  pPage at cell in
2e8e0 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20  dex "i".  pCell 
2e8f0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
2e900 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
2e910 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cell..**.** If t
2e920 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
2e930 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
2e940 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69  page, then put i
2e950 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a  t there.  If it.
2e960 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c  ** will not fit,
2e970 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70   then make a cop
2e980 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  y of the cell co
2e990 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70  ntent into pTemp
2e9a0 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20   if.** pTemp is 
2e9b0 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72  not null.  Regar
2e9c0 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20  dless of pTemp, 
2e9d0 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65  allocate a new e
2e9e0 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65  ntry.** in pPage
2e9f0 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d  ->apOvfl[] and m
2ea00 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20  ake it point to 
2ea10 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
2ea20 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70   (either.** in p
2ea30 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67  Temp or the orig
2ea40 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20  inal pCell) and 
2ea50 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20  also record its 
2ea60 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63  index. .** Alloc
2ea70 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72  ating a new entr
2ea80 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c  y in pPage->aCel
2ea90 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74  l[] implies that
2eaa0 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65   .** pPage->nOve
2eab0 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65  rflow is increme
2eac0 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  nted..**.** If n
2ead0 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Skip is non-zero
2eae0 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f  , then do not co
2eaf0 70 79 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b  py the first nSk
2eb00 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a  ip bytes of the.
2eb10 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c  ** cell. The cal
2eb20 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69  ler will overwri
2eb30 74 65 20 74 68 65 6d 20 61 66 74 65 72 20 74 68  te them after th
2eb40 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
2eb50 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70  rns. If.** nSkip
2eb60 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
2eb70 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74  en pCell may not
2eb80 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76   point to an inv
2eb90 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  alid memory loca
2eba0 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43  tion .** (but pC
2ebb0 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77  ell+nSkip is alw
2ebc0 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73  ays valid)..*/.s
2ebd0 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72  tatic void inser
2ebe0 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  tCell(.  MemPage
2ebf0 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61   *pPage,   /* Pa
2ec00 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  ge into which we
2ec10 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a   are copying */.
2ec20 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20    int i,        
2ec30 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20      /* New cell 
2ec40 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68  becomes the i-th
2ec50 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67   cell of the pag
2ec60 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  e */.  u8 *pCell
2ec70 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  ,        /* Cont
2ec80 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ent of the new c
2ec90 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c  ell */.  int sz,
2eca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
2ecb0 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69  tes of content i
2ecc0 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  n pCell */.  u8 
2ecd0 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  *pTemp,        /
2ece0 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73  * Temp storage s
2ecf0 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20  pace for pCell, 
2ed00 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50  if needed */.  P
2ed10 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20  gno iChild,     
2ed20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c   /* If non-zero,
2ed30 20 72 65 70 6c 61 63 65 20 66 69 72 73 74 20 34   replace first 4
2ed40 20 62 79 74 65 73 20 77 69 74 68 20 74 68 69 73   bytes with this
2ed50 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
2ed60 2a 70 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a  *pRC          /*
2ed70 20 52 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   Read and write 
2ed80 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  return code from
2ed90 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
2eda0 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20  t idx = 0;      
2edb0 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
2edc0 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65  e new cell conte
2edd0 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  nt in data[] */.
2ede0 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
2edf0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2ee00 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64  ter */.  int end
2ee10 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
2ee20 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
2ee30 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e  e last cell poin
2ee40 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ter in data[] */
2ee50 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20  .  int ins;     
2ee60 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
2ee70 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65   data[] where ne
2ee80 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  w cell pointer i
2ee90 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20  s inserted */.  
2eea0 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
2eeb0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
2eec0 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
2eed0 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  er in data[] */.
2eee0 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
2eef0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65      /* The conte
2ef00 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20  nt of the whole 
2ef10 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74  page */.  u8 *pt
2ef20 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  r;          /* U
2ef30 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69  sed for moving i
2ef40 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e  nformation aroun
2ef50 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  d in data[] */. 
2ef60 20 75 38 20 2a 65 6e 64 50 74 72 3b 20 20 20 20   u8 *endPtr;    
2ef70 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65     /* End of the
2ef80 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 69 6e 74 20   loop */..  int 
2ef90 6e 53 6b 69 70 20 3d 20 28 69 43 68 69 6c 64 20  nSkip = (iChild 
2efa0 3f 20 34 20 3a 20 30 29 3b 0a 0a 20 20 69 66 28  ? 4 : 0);..  if(
2efb0 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a   *pRC ) return;.
2efc0 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20  .  assert( i>=0 
2efd0 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65  && i<=pPage->nCe
2efe0 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ll+pPage->nOverf
2eff0 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28  low );.  assert(
2f000 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d   pPage->nCell<=M
2f010 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
2f020 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50  t) && MX_CELL(pP
2f030 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31  age->pBt)<=10921
2f040 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2f050 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d  age->nOverflow<=
2f060 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d  ArraySize(pPage-
2f070 3e 61 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73  >apOvfl) );.  as
2f080 73 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28  sert( ArraySize(
2f090 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d  pPage->apOvfl)==
2f0a0 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d  ArraySize(pPage-
2f0b0 3e 61 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73  >aiOvfl) );.  as
2f0c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2f0d0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2f0e0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2f0f0 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73 68 6f   /* The cell sho
2f100 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20  uld normally be 
2f110 73 69 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  sized correctly.
2f120 20 20 48 6f 77 65 76 65 72 2c 20 77 68 65 6e 20    However, when 
2f130 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61  moving a.  ** ma
2f140 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f  lformed cell fro
2f150 6d 20 61 20 6c 65 61 66 20 70 61 67 65 20 74 6f  m a leaf page to
2f160 20 61 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67   an interior pag
2f170 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 20 73  e, if the cell s
2f180 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20  ize.  ** wanted 
2f190 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  to be less than 
2f1a0 34 20 62 75 74 20 67 6f 74 20 72 6f 75 6e 64 65  4 but got rounde
2f1b0 64 20 75 70 20 74 6f 20 34 20 6f 6e 20 74 68 65  d up to 4 on the
2f1c0 20 6c 65 61 66 2c 20 74 68 65 6e 20 73 69 7a 65   leaf, then size
2f1d0 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c  .  ** might be l
2f1e0 65 73 73 20 74 68 61 6e 20 38 20 28 6c 65 61 66  ess than 8 (leaf
2f1f0 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29  -size + pointer)
2f200 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 69 6f 72   on the interior
2f210 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20 20   node.  Hence.  
2f220 2a 2a 20 74 68 65 20 74 65 72 6d 20 61 66 74 65  ** the term afte
2f230 72 20 74 68 65 20 7c 7c 20 69 6e 20 74 68 65 20  r the || in the 
2f240 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
2f250 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  (). */.  assert(
2f260 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72   sz==cellSizePtr
2f270 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c  (pPage, pCell) |
2f280 7c 20 28 73 7a 3d 3d 38 20 26 26 20 69 43 68 69  | (sz==8 && iChi
2f290 6c 64 3e 30 29 20 29 3b 0a 20 20 69 66 28 20 70  ld>0) );.  if( p
2f2a0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
2f2b0 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e  || sz+2>pPage->n
2f2c0 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Free ){.    if( 
2f2d0 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d  pTemp ){.      m
2f2e0 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69  emcpy(pTemp+nSki
2f2f0 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20  p, pCell+nSkip, 
2f300 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20  sz-nSkip);.     
2f310 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a   pCell = pTemp;.
2f320 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
2f330 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75  hild ){.      pu
2f340 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 43  t4byte(pCell, iC
2f350 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hild);.    }.   
2f360 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65   j = pPage->nOve
2f370 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73  rflow++;.    ass
2f380 65 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a  ert( j<(int)(siz
2f390 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66  eof(pPage->apOvf
2f3a0 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d  l)/sizeof(pPage-
2f3b0 3e 61 70 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a  >apOvfl[0])) );.
2f3c0 20 20 20 20 70 50 61 67 65 2d 3e 61 70 4f 76 66      pPage->apOvf
2f3d0 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  l[j] = pCell;.  
2f3e0 20 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b    pPage->aiOvfl[
2f3f0 6a 5d 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d  j] = (u16)i;.  }
2f400 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63  else{.    int rc
2f410 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2f420 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
2f430 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
2f440 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2f450 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a       *pRC = rc;.
2f460 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
2f470 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
2f480 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2f490 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2f4a0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64  DbPage) );.    d
2f4b0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
2f4c0 74 61 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73  ta;.    cellOffs
2f4d0 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  et = pPage->cell
2f4e0 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20  Offset;.    end 
2f4f0 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
2f500 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20  *pPage->nCell;. 
2f510 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66     ins = cellOff
2f520 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 72  set + 2*i;.    r
2f530 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  c = allocateSpac
2f540 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64  e(pPage, sz, &id
2f550 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  x);.    if( rc )
2f560 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74  { *pRC = rc; ret
2f570 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68  urn; }.    /* Th
2f580 65 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  e allocateSpace(
2f590 29 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e  ) routine guaran
2f5a0 74 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  tees the followi
2f5b0 6e 67 20 74 77 6f 20 70 72 6f 70 65 72 74 69 65  ng two propertie
2f5c0 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 74 20 72  s.    ** if it r
2f5d0 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 20 2a  eturns success *
2f5e0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  /.    assert( id
2f5f0 78 20 3e 3d 20 65 6e 64 2b 32 20 29 3b 0a 20 20  x >= end+2 );.  
2f600 20 20 61 73 73 65 72 74 28 20 69 64 78 2b 73 7a    assert( idx+sz
2f610 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e   <= (int)pPage->
2f620 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2f630 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43  );.    pPage->nC
2f640 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65  ell++;.    pPage
2f650 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29  ->nFree -= (u16)
2f660 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65  (2 + sz);.    me
2f670 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e  mcpy(&data[idx+n
2f680 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b  Skip], pCell+nSk
2f690 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20  ip, sz-nSkip);. 
2f6a0 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
2f6b0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
2f6c0 26 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69  &data[idx], iChi
2f6d0 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ld);.    }.    p
2f6e0 74 72 20 3d 20 26 64 61 74 61 5b 65 6e 64 5d 3b  tr = &data[end];
2f6f0 0a 20 20 20 20 65 6e 64 50 74 72 20 3d 20 26 64  .    endPtr = &d
2f700 61 74 61 5b 69 6e 73 5d 3b 0a 20 20 20 20 61 73  ata[ins];.    as
2f710 73 65 72 74 28 20 28 53 51 4c 49 54 45 5f 50 54  sert( (SQLITE_PT
2f720 52 5f 54 4f 5f 49 4e 54 28 70 74 72 29 26 31 29  R_TO_INT(ptr)&1)
2f730 3d 3d 30 20 29 3b 20 20 2f 2a 20 70 74 72 20 69  ==0 );  /* ptr i
2f740 73 20 61 6c 77 61 79 73 20 32 2d 62 79 74 65 20  s always 2-byte 
2f750 61 6c 69 67 6e 65 64 20 2a 2f 0a 20 20 20 20 77  aligned */.    w
2f760 68 69 6c 65 28 20 70 74 72 3e 65 6e 64 50 74 72  hile( ptr>endPtr
2f770 20 29 7b 0a 20 20 20 20 20 20 2a 28 75 31 36 2a   ){.      *(u16*
2f780 29 70 74 72 20 3d 20 2a 28 75 31 36 2a 29 26 70  )ptr = *(u16*)&p
2f790 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74  tr[-2];.      pt
2f7a0 72 20 2d 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20  r -= 2;.    }.  
2f7b0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
2f7c0 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20  [ins], idx);.   
2f7d0 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
2f7e0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2f7f0 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  +3], pPage->nCel
2f800 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  l);.#ifndef SQLI
2f810 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2f820 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  UM.    if( pPage
2f830 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
2f840 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  m ){.      /* Th
2f850 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61  e cell may conta
2f860 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
2f870 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
2f880 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20  . If so, write. 
2f890 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72       ** the entr
2f8a0 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  y for the overfl
2f8b0 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ow page into the
2f8c0 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20   pointer map..  
2f8d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74 72      */.      ptr
2f8e0 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
2f8f0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29  age, pCell, pRC)
2f900 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
2f910 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
2f920 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20  a list of cells 
2f930 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65 20  to a page.  The 
2f940 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20 69  page should be i
2f950 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a  nitially empty..
2f960 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72 65  ** The cells are
2f970 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66   guaranteed to f
2f980 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  it on the page..
2f990 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
2f9a0 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d  ssemblePage(.  M
2f9b0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
2f9c0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20   /* The page to 
2f9d0 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f  be assemblied */
2f9e0 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20  .  int nCell,   
2f9f0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
2fa00 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  er of cells to a
2fa10 64 64 20 74 6f 20 74 68 69 73 20 70 61 67 65 20  dd to this page 
2fa20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
2fa30 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ,      /* Pointe
2fa40 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65  rs to cell bodie
2fa50 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a  s */.  u16 *aSiz
2fa60 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  e        /* Size
2fa70 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a  s of the cells *
2fa80 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
2fa90 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2faa0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38   counter */.  u8
2fab0 20 2a 70 43 65 6c 6c 70 74 72 3b 20 20 20 20 20   *pCellptr;     
2fac0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65  /* Address of ne
2fad0 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  xt cell pointer 
2fae0 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64  */.  int cellbod
2faf0 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  y;     /* Addres
2fb00 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62  s of next cell b
2fb10 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  ody */.  u8 * co
2fb20 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65  nst data = pPage
2fb30 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20 20  ->aData;        
2fb40 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
2fb50 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  to data for pPag
2fb60 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  e */.  const int
2fb70 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
2fb80 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
2fb90 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
2fba0 68 65 61 64 65 72 20 6f 6e 20 70 50 61 67 65 20  header on pPage 
2fbb0 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  */.  const int n
2fbc0 55 73 61 62 6c 65 20 3d 20 70 50 61 67 65 2d 3e  Usable = pPage->
2fbd0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
2fbe0 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20   /* Usable size 
2fbf0 6f 66 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73  of page */..  as
2fc00 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
2fc10 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
2fc20 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2fc30 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
2fc40 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
2fc50 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3e    assert( nCell>
2fc60 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d 28 69 6e  =0 && nCell<=(in
2fc70 74 29 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  t)MX_CELL(pPage-
2fc80 3e 70 42 74 29 0a 20 20 20 20 20 20 20 20 20 20  >pBt).          
2fc90 20 20 26 26 20 28 69 6e 74 29 4d 58 5f 43 45 4c    && (int)MX_CEL
2fca0 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31  L(pPage->pBt)<=1
2fcb0 30 39 32 31 29 3b 0a 20 20 61 73 73 65 72 74 28  0921);.  assert(
2fcc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2fcd0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
2fce0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f  pDbPage) );..  /
2fcf0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
2fd00 20 70 61 67 65 20 68 61 73 20 6a 75 73 74 20 62   page has just b
2fd10 65 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a 65  een zeroed by ze
2fd20 72 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20 61 73  roPage() */.  as
2fd30 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
2fd40 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ll==0 );.  asser
2fd50 74 28 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  t( get2byteNotZe
2fd60 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  ro(&data[hdr+5])
2fd70 3d 3d 6e 55 73 61 62 6c 65 20 29 3b 0a 0a 20 20  ==nUsable );..  
2fd80 70 43 65 6c 6c 70 74 72 20 3d 20 26 70 50 61 67  pCellptr = &pPag
2fd90 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 43 65 6c  e->aCellIdx[nCel
2fda0 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64 79  l*2];.  cellbody
2fdb0 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20 66 6f   = nUsable;.  fo
2fdc0 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d  r(i=nCell-1; i>=
2fdd0 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 75 31 36  0; i--){.    u16
2fde0 20 73 7a 20 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a   sz = aSize[i];.
2fdf0 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2d 3d 20      pCellptr -= 
2fe00 32 3b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79 20  2;.    cellbody 
2fe10 2d 3d 20 73 7a 3b 0a 20 20 20 20 70 75 74 32 62  -= sz;.    put2b
2fe20 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 63 65  yte(pCellptr, ce
2fe30 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d  llbody);.    mem
2fe40 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f  cpy(&data[cellbo
2fe50 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20  dy], apCell[i], 
2fe60 73 7a 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62  sz);.  }.  put2b
2fe70 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
2fe80 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32  , nCell);.  put2
2fe90 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
2fea0 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20  ], cellbody);.  
2feb0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20  pPage->nFree -= 
2fec0 28 6e 43 65 6c 6c 2a 32 20 2b 20 6e 55 73 61 62  (nCell*2 + nUsab
2fed0 6c 65 20 2d 20 63 65 6c 6c 62 6f 64 79 29 3b 0a  le - cellbody);.
2fee0 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
2fef0 20 28 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a   (u16)nCell;.}..
2ff00 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
2ff10 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 64  ing parameters d
2ff20 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e  etermine how man
2ff30 79 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73  y adjacent pages
2ff40 20 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a   get involved.**
2ff50 20 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20   in a balancing 
2ff60 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69  operation.  NN i
2ff70 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2ff80 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74  neighbors on eit
2ff90 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74  her side.** of t
2ffa0 68 65 20 70 61 67 65 20 74 68 61 74 20 70 61 72  he page that par
2ffb0 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20  ticipate in the 
2ffc0 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74  balancing operat
2ffd0 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65 0a  ion.  NB is the.
2ffe0 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  ** total number 
2fff0 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 70 61  of pages that pa
30000 72 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c 75  rticipate, inclu
30010 64 69 6e 67 20 74 68 65 20 74 61 72 67 65 74 20  ding the target 
30020 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e  page and.** NN n
30030 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
30040 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  er side..**.** T
30050 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65  he minimum value
30060 20 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66 20   of NN is 1 (of 
30070 63 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65 61  course).  Increa
30080 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a  sing NN above 1.
30090 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20 67  ** (to 2 or 3) g
300a0 69 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69 6d  ives a modest im
300b0 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c  provement in SEL
300c0 45 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20 70  ECT and DELETE p
300d0 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e  erformance.** in
300e0 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61 20   exchange for a 
300f0 6c 61 72 67 65 72 20 64 65 67 72 61 64 61 74 69  larger degradati
30100 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e 64  on in INSERT and
30110 20 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d 61   UPDATE performa
30120 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75  nce..** The valu
30130 65 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73 20  e of NN appears 
30140 74 6f 20 67 69 76 65 20 74 68 65 20 62 65 73 74  to give the best
30150 20 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c   results overall
30160 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20  ..*/.#define NN 
30170 31 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1             /*
30180 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68   Number of neigh
30190 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
301a0 69 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a  ide of pPage */.
301b0 23 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32  #define NB (NN*2
301c0 2b 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74 61  +1)      /* Tota
301d0 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65 64  l pages involved
301e0 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65 20   in the balance 
301f0 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  */...#ifndef SQL
30200 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
30210 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  LANCE./*.** This
30220 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61   version of bala
30230 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68  nce() handles th
30240 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c  e common special
30250 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61   case where.** a
30260 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62 65   new entry is be
30270 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20  ing inserted on 
30280 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67 68  the extreme righ
30290 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  t-end of the.** 
302a0 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77  tree, in other w
302b0 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e  ords, when the n
302c0 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65  ew entry will be
302d0 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74  come the largest
302e0 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65  .** entry in the
302f0 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73   tree..**.** Ins
30300 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20 74  tead of trying t
30310 6f 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20  o balance the 3 
30320 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20  right-most leaf 
30330 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a  pages, just add.
30340 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f  ** a new page to
30350 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
30360 73 69 64 65 20 61 6e 64 20 70 75 74 20 74 68 65  side and put the
30370 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69   one new entry i
30380 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20  n.** that page. 
30390 20 54 68 69 73 20 6c 65 61 76 65 73 20 74 68 65   This leaves the
303a0 20 72 69 67 68 74 20 73 69 64 65 20 6f 66 20 74   right side of t
303b0 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74  he tree somewhat
303c0 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20  .** unbalanced. 
303d0 20 42 75 74 20 6f 64 64 73 20 61 72 65 20 74 68   But odds are th
303e0 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e  at we will be in
303f0 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72  serting new entr
30400 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  ies.** at the en
30410 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64  d soon afterward
30420 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20  s so the nearly 
30430 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20  empty page will 
30440 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20  quickly.** fill 
30450 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e  up.  On average.
30460 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20  .**.** pPage is 
30470 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 77 68  the leaf page wh
30480 69 63 68 20 69 73 20 74 68 65 20 72 69 67 68 74  ich is the right
30490 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68  -most page in th
304a0 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65  e tree..** pPare
304b0 6e 74 20 69 73 20 69 74 73 20 70 61 72 65 6e 74  nt is its parent
304c0 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20 68 61  .  pPage must ha
304d0 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72  ve a single over
304e0 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68  flow entry.** wh
304f0 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20  ich is also the 
30500 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
30510 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a   on the page..**
30520 0a 2a 2a 20 54 68 65 20 70 53 70 61 63 65 20 62  .** The pSpace b
30530 75 66 66 65 72 20 69 73 20 75 73 65 64 20 74 6f  uffer is used to
30540 20 73 74 6f 72 65 20 61 20 74 65 6d 70 6f 72 61   store a tempora
30550 72 79 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64  ry copy of the d
30560 69 76 69 64 65 72 0a 2a 2a 20 63 65 6c 6c 20 74  ivider.** cell t
30570 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6e 73 65  hat will be inse
30580 72 74 65 64 20 69 6e 74 6f 20 70 50 61 72 65 6e  rted into pParen
30590 74 2e 20 53 75 63 68 20 61 20 63 65 6c 6c 20 63  t. Such a cell c
305a0 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34 0a 2a  onsists of a 4.*
305b0 2a 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  * byte page numb
305c0 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  er followed by a
305d0 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
305e0 20 69 6e 74 65 67 65 72 2e 20 49 6e 20 6f 74 68   integer. In oth
305f0 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 74 20  er.** words, at 
30600 6d 6f 73 74 20 31 33 20 62 79 74 65 73 2e 20 48  most 13 bytes. H
30610 65 6e 63 65 20 74 68 65 20 70 53 70 61 63 65 20  ence the pSpace 
30620 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 61  buffer must be a
30630 74 0a 2a 2a 20 6c 65 61 73 74 20 31 33 20 62 79  t.** least 13 by
30640 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a  tes in size..*/.
30650 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
30660 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65  ce_quick(MemPage
30670 20 2a 70 50 61 72 65 6e 74 2c 20 4d 65 6d 50 61   *pParent, MemPa
30680 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
30690 53 70 61 63 65 29 7b 0a 20 20 42 74 53 68 61 72  Space){.  BtShar
306a0 65 64 20 2a 63 6f 6e 73 74 20 70 42 74 20 3d 20  ed *const pBt = 
306b0 70 50 61 67 65 2d 3e 70 42 74 3b 20 20 20 20 2f  pPage->pBt;    /
306c0 2a 20 42 2d 54 72 65 65 20 44 61 74 61 62 61 73  * B-Tree Databas
306d0 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
306e0 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
306f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
30700 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70  ewly allocated p
30710 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
30720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30740 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
30750 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20    Pgno pgnoNew; 
30760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30770 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
30780 75 6d 62 65 72 20 6f 66 20 70 4e 65 77 20 2a 2f  umber of pNew */
30790 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
307a0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
307b0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
307c0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
307d0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
307e0 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e  teable(pParent->
307f0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
30800 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
30810 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20  erflow==1 );..  
30820 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20 63 6f  /* This error co
30830 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 77 20 63  ndition is now c
30840 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72  aught prior to r
30850 65 61 63 68 69 6e 67 20 74 68 69 73 20 66 75 6e  eaching this fun
30860 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70  ction */.  if( p
30870 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
30880 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
30890 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20  ORRUPT_BKPT;..  
308a0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
308b0 77 20 70 61 67 65 2e 20 54 68 69 73 20 70 61 67  w page. This pag
308c0 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  e will become th
308d0 65 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20  e right-sibling 
308e0 6f 66 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e 20  of .  ** pPage. 
308f0 4d 61 6b 65 20 74 68 65 20 70 61 72 65 6e 74 20  Make the parent 
30900 70 61 67 65 20 77 72 69 74 61 62 6c 65 2c 20 73  page writable, s
30910 6f 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 64  o that the new d
30920 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a 2a  ivider cell.  **
30930 20 6d 61 79 20 62 65 20 69 6e 73 65 72 74 65 64   may be inserted
30940 2e 20 49 66 20 62 6f 74 68 20 74 68 65 73 65 20  . If both these 
30950 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 73  operations are s
30960 75 63 63 65 73 73 66 75 6c 2c 20 70 72 6f 63 65  uccessful, proce
30970 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ed..  */.  rc = 
30980 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
30990 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70  e(pBt, &pNew, &p
309a0 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 0a  gnoNew, 0, 0);..
309b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
309c0 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20 2a  _OK ){..    u8 *
309d0 70 4f 75 74 20 3d 20 26 70 53 70 61 63 65 5b 34  pOut = &pSpace[4
309e0 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ];.    u8 *pCell
309f0 20 3d 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c   = pPage->apOvfl
30a00 5b 30 5d 3b 0a 20 20 20 20 75 31 36 20 73 7a 43  [0];.    u16 szC
30a10 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ell = cellSizePt
30a20 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  r(pPage, pCell);
30a30 0a 20 20 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a  .    u8 *pStop;.
30a40 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
30a50 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
30a60 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61  able(pNew->pDbPa
30a70 67 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ge) );.    asser
30a80 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  t( pPage->aData[
30a90 30 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c  0]==(PTF_INTKEY|
30aa0 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
30ab0 5f 4c 45 41 46 29 20 29 3b 0a 20 20 20 20 7a 65  _LEAF) );.    ze
30ac0 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 50 54 46  roPage(pNew, PTF
30ad0 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
30ae0 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a  DATA|PTF_LEAF);.
30af0 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65      assemblePage
30b00 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c  (pNew, 1, &pCell
30b10 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20  , &szCell);..   
30b20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
30b30 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
30b40 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
30b50 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20  he pointer map. 
30b60 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69     ** with entri
30b70 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70  es for the new p
30b80 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69  age, and any poi
30b90 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20  nter from the . 
30ba0 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68     ** cell on th
30bb0 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65  e page to an ove
30bc0 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 65  rflow page. If e
30bd0 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 0a 20  ither of these. 
30be0 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73     ** operations
30bf0 20 66 61 69 6c 73 2c 20 74 68 65 20 72 65 74 75   fails, the retu
30c00 72 6e 20 63 6f 64 65 20 69 73 20 73 65 74 2c 20  rn code is set, 
30c10 62 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  but the contents
30c20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  .    ** of the p
30c30 61 72 65 6e 74 20 70 61 67 65 20 61 72 65 20 73  arent page are s
30c40 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64  till manipulated
30c50 20 62 79 20 74 68 68 20 63 6f 64 65 20 62 65 6c   by thh code bel
30c60 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74 20  ow..    ** That 
30c70 69 73 20 4f 6b 2c 20 61 74 20 74 68 69 73 20 70  is Ok, at this p
30c80 6f 69 6e 74 20 74 68 65 20 70 61 72 65 6e 74 20  oint the parent 
30c90 70 61 67 65 20 69 73 20 67 75 61 72 61 6e 74 65  page is guarante
30ca0 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ed to.    ** be 
30cb0 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
30cc0 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
30cd0 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20 63 61  ror code will ca
30ce0 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c  use a.    ** rol
30cf0 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61  lback, undoing a
30d00 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  ny changes made 
30d10 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
30d20 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ge..    */.    i
30d30 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
30d40 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
30d50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c  ut(pBt, pgnoNew,
30d60 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
30d70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72  Parent->pgno, &r
30d80 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  c);.      if( sz
30d90 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f  Cell>pNew->minLo
30da0 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  cal ){.        p
30db0 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
30dc0 70 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26 72 63  pNew, pCell, &rc
30dd0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
30de0 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  .  .    /* Creat
30df0 65 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  e a divider cell
30e00 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
30e10 70 50 61 72 65 6e 74 2e 20 54 68 65 20 64 69 76  pParent. The div
30e20 69 64 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a  ider cell.    **
30e30 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34   consists of a 4
30e40 2d 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65  -byte page numbe
30e50 72 20 28 74 68 65 20 70 61 67 65 20 6e 75 6d 62  r (the page numb
30e60 65 72 20 6f 66 20 70 50 61 67 65 29 20 61 6e 64  er of pPage) and
30e70 0a 20 20 20 20 2a 2a 20 61 20 76 61 72 69 61 62  .    ** a variab
30e80 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 20 76 61  le length key va
30e90 6c 75 65 20 28 77 68 69 63 68 20 6d 75 73 74 20  lue (which must 
30ea0 62 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  be the same valu
30eb0 65 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  e as the.    ** 
30ec0 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 70  largest key on p
30ed0 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  Page)..    **.  
30ee0 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68 65    ** To find the
30ef0 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61 6c   largest key val
30f00 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69 72  ue on pPage, fir
30f10 73 74 20 66 69 6e 64 20 74 68 65 20 72 69 67 68  st find the righ
30f20 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63  t-most .    ** c
30f30 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54 68  ell on pPage. Th
30f40 65 20 66 69 72 73 74 20 74 77 6f 20 66 69 65 6c  e first two fiel
30f50 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c 20  ds of this cell 
30f60 61 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  are the .    ** 
30f70 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61  record-length (a
30f80 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
30f90 20 69 6e 74 65 67 65 72 20 61 74 20 6d 6f 73 74   integer at most
30fa0 20 33 32 2d 62 69 74 73 20 69 6e 20 73 69 7a 65   32-bits in size
30fb0 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65  ).    ** and the
30fc0 20 6b 65 79 20 76 61 6c 75 65 20 28 61 20 76 61   key value (a va
30fd0 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e  riable length in
30fe0 74 65 67 65 72 2c 20 6d 61 79 20 68 61 76 65 20  teger, may have 
30ff0 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20 20 20  any value)..    
31000 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66 20  ** The first of 
31010 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c  the while(...) l
31020 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69 70 73  oops below skips
31030 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72 64   over the record
31040 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66  -length.    ** f
31050 69 65 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e 64  ield. The second
31060 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70   while(...) loop
31070 20 63 6f 70 69 65 73 20 74 68 65 20 6b 65 79 20   copies the key 
31080 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a 20  value from the. 
31090 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50     ** cell on pP
310a0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 53 70  age into the pSp
310b0 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 20 20  ace buffer..    
310c0 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66  */.    pCell = f
310d0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
310e0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a  Page->nCell-1);.
310f0 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65      pStop = &pCe
31100 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65  ll[9];.    while
31110 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78  ( (*(pCell++)&0x
31120 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74  80) && pCell<pSt
31130 6f 70 20 29 3b 0a 20 20 20 20 70 53 74 6f 70 20  op );.    pStop 
31140 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20  = &pCell[9];.   
31150 20 77 68 69 6c 65 28 20 28 28 2a 28 70 4f 75 74   while( ((*(pOut
31160 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29  ++) = *(pCell++)
31170 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c  )&0x80) && pCell
31180 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f  <pStop );..    /
31190 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
311a0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
311b0 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20  to pParent. */. 
311c0 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50     insertCell(pP
311d0 61 72 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d 3e  arent, pParent->
311e0 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20 28  nCell, pSpace, (
311f0 69 6e 74 29 28 70 4f 75 74 2d 70 53 70 61 63 65  int)(pOut-pSpace
31200 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
31210 20 20 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f    0, pPage->pgno
31220 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a 20  , &rc);..    /* 
31230 53 65 74 20 74 68 65 20 72 69 67 68 74 2d 63 68  Set the right-ch
31240 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 70  ild pointer of p
31250 50 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74 20  Parent to point 
31260 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  to the new page.
31270 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65   */.    put4byte
31280 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
31290 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
312a0 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29  set+8], pgnoNew)
312b0 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65  ;.  .    /* Rele
312c0 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ase the referenc
312d0 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  e to the new pag
312e0 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73  e. */.    releas
312f0 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d  ePage(pNew);.  }
31300 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
31310 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
31320 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
31330 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a  NCE */..#if 0./*
31340 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
31350 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72  n does not contr
31360 69 62 75 74 65 20 61 6e 79 74 68 69 6e 67 20 74  ibute anything t
31370 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  o the operation 
31380 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69 74  of SQLite..** it
31390 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 61 63   is sometimes ac
313a0 74 69 76 61 74 65 64 20 74 65 6d 70 6f 72 61 72  tivated temporar
313b0 69 6c 79 20 77 68 69 6c 65 20 64 65 62 75 67 67  ily while debugg
313c0 69 6e 67 20 63 6f 64 65 20 72 65 73 70 6f 6e 73  ing code respons
313d0 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65 74  ible .** for set
313e0 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61 70  ting pointer-map
313f0 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61   entries..*/.sta
31400 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 43 68  tic int ptrmapCh
31410 65 63 6b 50 61 67 65 73 28 4d 65 6d 50 61 67 65  eckPages(MemPage
31420 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74 20 6e   **apPage, int n
31430 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20  Page){.  int i, 
31440 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  j;.  for(i=0; i<
31450 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nPage; i++){.   
31460 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38 20   Pgno n;.    u8 
31470 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  e;.    MemPage *
31480 70 50 61 67 65 20 3d 20 61 70 50 61 67 65 5b 69  pPage = apPage[i
31490 5d 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ];.    BtShared 
314a0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
314b0 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
314c0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
314d0 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
314e0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b  pPage->nCell; j+
314f0 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e  +){.      CellIn
31500 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 75  fo info;.      u
31510 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20 20  8 *z;.     .    
31520 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70    z = findCell(p
31530 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20  Page, j);.      
31540 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
31550 72 28 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e 66  r(pPage, z, &inf
31560 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e  o);.      if( in
31570 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  fo.iOverflow ){.
31580 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6f 76 66          Pgno ovf
31590 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 7a 5b  l = get4byte(&z[
315a0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
315b0 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70  ;.        ptrmap
315c0 47 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26  Get(pBt, ovfl, &
315d0 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  e, &n);.        
315e0 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65  assert( n==pPage
315f0 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52  ->pgno && e==PTR
31600 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 3b  MAP_OVERFLOW1 );
31610 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
31620 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
31630 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
31640 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  child = get4byte
31650 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  (z);.        ptr
31660 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c  mapGet(pBt, chil
31670 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20  d, &e, &n);.    
31680 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70      assert( n==p
31690 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d  Page->pgno && e=
316a0 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b  =PTRMAP_BTREE );
316b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
316c0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
316d0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
316e0 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79  o child = get4by
316f0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
31700 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
31710 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70 74 72  t+8]);.      ptr
31720 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c  mapGet(pBt, chil
31730 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20  d, &e, &n);.    
31740 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61    assert( n==pPa
31750 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50  ge->pgno && e==P
31760 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20  TRMAP_BTREE );. 
31770 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
31780 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 1;.}.#endif../
31790 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
317a0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  on is used to co
317b0 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  py the contents 
317c0 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f  of the b-tree no
317d0 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e  de stored .** on
317e0 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70   page pFrom to p
317f0 61 67 65 20 70 54 6f 2e 20 49 66 20 70 61 67 65  age pTo. If page
31800 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20 61   pFrom was not a
31810 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 6e   leaf page, then
31820 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  .** the pointer-
31830 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
31840 65 61 63 68 20 63 68 69 6c 64 20 70 61 67 65 20  each child page 
31850 61 72 65 20 75 70 64 61 74 65 64 20 73 6f 20 74  are updated so t
31860 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 72 65 6e  hat the.** paren
31870 74 20 70 61 67 65 20 73 74 6f 72 65 64 20 69 6e  t page stored in
31880 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
31890 20 69 73 20 70 61 67 65 20 70 54 6f 2e 20 49 66   is page pTo. If
318a0 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65 64   pFrom contained
318b0 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77 69  .** any cells wi
318c0 74 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  th overflow page
318d0 20 70 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e 20   pointers, then 
318e0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
318f0 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70  g pointer.** map
31900 20 65 6e 74 72 69 65 73 20 61 72 65 20 61 6c 73   entries are als
31910 6f 20 75 70 64 61 74 65 64 20 73 6f 20 74 68 61  o updated so tha
31920 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  t the parent pag
31930 65 20 69 73 20 70 61 67 65 20 70 54 6f 2e 0a 2a  e is page pTo..*
31940 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69 73  *.** If pFrom is
31950 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 72 79   currently carry
31960 69 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  ing any overflow
31970 20 63 65 6c 6c 73 20 28 65 6e 74 72 69 65 73 20   cells (entries 
31980 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61 67  in the.** MemPag
31990 65 2e 61 70 4f 76 66 6c 5b 5d 20 61 72 72 61 79  e.apOvfl[] array
319a0 29 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  ), they are not 
319b0 63 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e 20 0a  copied to pTo. .
319c0 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
319d0 75 72 6e 69 6e 67 2c 20 70 61 67 65 20 70 54 6f  urning, page pTo
319e0 20 69 73 20 72 65 69 6e 69 74 69 61 6c 69 7a 65   is reinitialize
319f0 64 20 75 73 69 6e 67 20 62 74 72 65 65 49 6e 69  d using btreeIni
31a00 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  tPage()..**.** T
31a10 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  he performance o
31a20 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
31a30 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e  is not critical.
31a40 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64   It is only used
31a50 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61   by .** the bala
31a60 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20  nce_shallower() 
31a70 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  and balance_deep
31a80 65 72 28 29 20 70 72 6f 63 65 64 75 72 65 73 2c  er() procedures,
31a90 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77   neither of.** w
31aa0 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65 64 20  hich are called 
31ab0 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d  often under norm
31ac0 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  al circumstances
31ad0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
31ae0 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74   copyNodeContent
31af0 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c  (MemPage *pFrom,
31b00 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20 69   MemPage *pTo, i
31b10 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
31b20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
31b30 4b 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  K ){.    BtShare
31b40 64 20 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d 20  d * const pBt = 
31b50 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20 20  pFrom->pBt;.    
31b60 75 38 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d  u8 * const aFrom
31b70 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b   = pFrom->aData;
31b80 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  .    u8 * const 
31b90 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61  aTo = pTo->aData
31ba0 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20  ;.    int const 
31bb0 69 46 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d  iFromHdr = pFrom
31bc0 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  ->hdrOffset;.   
31bd0 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48 64   int const iToHd
31be0 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d  r = ((pTo->pgno=
31bf0 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a  =1) ? 100 : 0);.
31c00 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
31c10 69 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a 20 20  int iData;.  .  
31c20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
31c30 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  om->isInit );.  
31c40 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
31c50 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20 29  >nFree>=iToHdr )
31c60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  ;.    assert( ge
31c70 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46  t2byte(&aFrom[iF
31c80 72 6f 6d 48 64 72 2b 35 5d 29 20 3c 3d 20 28 69  romHdr+5]) <= (i
31c90 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
31ca0 7a 65 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  ze );.  .    /* 
31cb0 43 6f 70 79 20 74 68 65 20 62 2d 74 72 65 65 20  Copy the b-tree 
31cc0 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f  node content fro
31cd0 6d 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20  m page pFrom to 
31ce0 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20 20  page pTo. */.   
31cf0 20 69 44 61 74 61 20 3d 20 67 65 74 32 62 79 74   iData = get2byt
31d00 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64  e(&aFrom[iFromHd
31d10 72 2b 35 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70  r+5]);.    memcp
31d20 79 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26  y(&aTo[iData], &
31d30 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42  aFrom[iData], pB
31d40 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69 44  t->usableSize-iD
31d50 61 74 61 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ata);.    memcpy
31d60 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26  (&aTo[iToHdr], &
31d70 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c  aFrom[iFromHdr],
31d80 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73   pFrom->cellOffs
31d90 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43  et + 2*pFrom->nC
31da0 65 6c 6c 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  ell);.  .    /* 
31db0 52 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67  Reinitialize pag
31dc0 65 20 70 54 6f 20 73 6f 20 74 68 61 74 20 74 68  e pTo so that th
31dd0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
31de0 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74  e MemPage struct
31df0 75 72 65 0a 20 20 20 20 2a 2a 20 6d 61 74 63 68  ure.    ** match
31e00 20 74 68 65 20 6e 65 77 20 64 61 74 61 2e 20 54   the new data. T
31e10 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
31e20 6e 20 6f 66 20 70 54 6f 20 63 61 6e 20 61 63 74  n of pTo can act
31e30 75 61 6c 6c 79 20 66 61 69 6c 20 75 6e 64 65 72  ually fail under
31e40 0a 20 20 20 20 2a 2a 20 66 61 69 72 6c 79 20 6f  .    ** fairly o
31e50 62 73 63 75 72 65 20 63 69 72 63 75 6d 73 74 61  bscure circumsta
31e60 6e 63 65 73 2c 20 65 76 65 6e 20 74 68 6f 75 67  nces, even thoug
31e70 68 20 69 74 20 69 73 20 61 20 63 6f 70 79 20 6f  h it is a copy o
31e80 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20  f initialized . 
31e90 20 20 20 2a 2a 20 70 61 67 65 20 70 46 72 6f 6d     ** page pFrom
31ea0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 6f  ..    */.    pTo
31eb0 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
31ec0 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
31ed0 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 20 20 69  Page(pTo);.    i
31ee0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31ef0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
31f00 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
31f10 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  n;.    }.  .    
31f20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
31f30 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
31f40 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
31f50 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
31f60 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 66 6f 72  tries.    ** for
31f70 20 61 6e 79 20 62 2d 74 72 65 65 20 6f 72 20 6f   any b-tree or o
31f80 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68  verflow pages th
31f90 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74 61  at pTo now conta
31fa0 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73  ins the pointers
31fb0 20 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   to..    */.    
31fc0 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
31fd0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
31fe0 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
31ff0 28 70 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pTo);.    }.  }
32000 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
32010 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62  outine redistrib
32020 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74 68  utes cells on th
32030 65 20 69 50 61 72 65 6e 74 49 64 78 27 74 68 20  e iParentIdx'th 
32040 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74  child of pParent
32050 0a 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20 22  .** (hereafter "
32060 74 68 65 20 70 61 67 65 22 29 20 61 6e 64 20 75  the page") and u
32070 70 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73 20  p to 2 siblings 
32080 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  so that all page
32090 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65  s have about the
320a0 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20  .** same amount 
320b0 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 20 55  of free space. U
320c0 73 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65 20  sually a single 
320d0 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68 65  sibling on eithe
320e0 72 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a 2a  r side of the.**
320f0 20 70 61 67 65 20 61 72 65 20 75 73 65 64 20 69   page are used i
32100 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c  n the balancing,
32110 20 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69 62   though both sib
32120 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65  lings might come
32130 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64   from one.** sid
32140 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
32150 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 6c 61   the first or la
32160 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20  st child of its 
32170 70 61 72 65 6e 74 2e 20 49 66 20 74 68 65 20 70  parent. If the p
32180 61 67 65 20 0a 2a 2a 20 68 61 73 20 66 65 77 65  age .** has fewe
32190 72 20 74 68 61 6e 20 32 20 73 69 62 6c 69 6e 67  r than 2 sibling
321a0 73 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69  s (something whi
321b0 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  ch can only happ
321c0 65 6e 20 69 66 20 74 68 65 20 70 61 67 65 0a 2a  en if the page.*
321d0 2a 20 69 73 20 61 20 72 6f 6f 74 20 70 61 67 65  * is a root page
321e0 20 6f 72 20 61 20 63 68 69 6c 64 20 6f 66 20 61   or a child of a
321f0 20 72 6f 6f 74 20 70 61 67 65 29 20 74 68 65 6e   root page) then
32200 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73   all available s
32210 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74 69  iblings.** parti
32220 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61  cipate in the ba
32230 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  lancing..**.** T
32240 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62  he number of sib
32250 6c 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67  lings of the pag
32260 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65  e might be incre
32270 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73 65  ased or decrease
32280 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20  d by .** one or 
32290 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74  two in an effort
322a0 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e   to keep pages n
322b0 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e  early full but n
322c0 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a 2a  ot over full. .*
322d0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
322e0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
322f0 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65   is called, some
32300 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e   of the cells on
32310 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69 67   the page.** mig
32320 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ht not actually 
32330 62 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65 6d  be stored in Mem
32340 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54 68  Page.aData[]. Th
32350 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a  is can happen.**
32360 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
32370 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20 72  overfull. This r
32380 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74  outine ensures t
32390 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61 6c  hat all cells al
323a0 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68  located.** to th
323b0 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20 73  e page and its s
323c0 69 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74 6f  iblings fit into
323d0 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d   MemPage.aData[]
323e0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
323f0 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  g..**.** In the 
32400 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63  course of balanc
32410 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 6e 64  ing the page and
32420 20 69 74 73 20 73 69 62 6c 69 6e 67 73 2c 20 63   its siblings, c
32430 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20 69  ells may be.** i
32440 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 6f 72 20  nserted into or 
32450 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
32460 20 70 61 72 65 6e 74 20 70 61 67 65 20 28 70 50   parent page (pP
32470 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73 6f  arent). Doing so
32480 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65 20 74 68  .** may cause th
32490 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 74 6f  e parent page to
324a0 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c   become overfull
324b0 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 49   or underfull. I
324c0 66 20 74 68 69 73 0a 2a 2a 20 68 61 70 70 65 6e  f this.** happen
324d0 73 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73  s, it is the res
324e0 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
324f0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e 76  he caller to inv
32500 6f 6b 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a  oke the correct.
32510 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75  ** balancing rou
32520 74 69 6e 65 20 74 6f 20 66 69 78 20 74 68 69 73  tine to fix this
32530 20 70 72 6f 62 6c 65 6d 20 28 73 65 65 20 74 68   problem (see th
32540 65 20 62 61 6c 61 6e 63 65 28 29 20 72 6f 75 74  e balance() rout
32550 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  ine). .**.** If 
32560 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69  this routine fai
32570 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
32580 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76  n, it might leav
32590 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  e the database.*
325a0 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64  * in a corrupted
325b0 20 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74 68   state. So if th
325c0 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73  is routine fails
325d0 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  , the database s
325e0 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c  hould.** be roll
325f0 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ed back..**.** T
32600 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
32610 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
32620 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c 20  on, aOvflSpace, 
32630 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
32640 61 0a 2a 2a 20 62 75 66 66 65 72 20 62 69 67 20  a.** buffer big 
32650 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 6f  enough to hold o
32660 6e 65 20 70 61 67 65 2e 20 49 66 20 77 68 69 6c  ne page. If whil
32670 65 20 69 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c  e inserting cell
32680 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  s into the paren
32690 74 0a 2a 2a 20 70 61 67 65 20 28 70 50 61 72 65  t.** page (pPare
326a0 6e 74 29 20 74 68 65 20 70 61 72 65 6e 74 20 70  nt) the parent p
326b0 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72  age becomes over
326c0 66 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66 65  full, this buffe
326d0 72 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  r is.** used to 
326e0 73 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e 74  store the parent
326f0 27 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  's overflow cell
32700 73 2e 20 42 65 63 61 75 73 65 20 74 68 69 73 20  s. Because this 
32710 66 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74 73  function inserts
32720 0a 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66  .** a maximum of
32730 20 66 6f 75 72 20 64 69 76 69 64 65 72 20 63 65   four divider ce
32740 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72  lls into the par
32750 65 6e 74 20 70 61 67 65 2c 20 61 6e 64 20 74 68  ent page, and th
32760 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a  e maximum.** siz
32770 65 20 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f 72  e of a cell stor
32780 65 64 20 77 69 74 68 69 6e 20 61 6e 20 69 6e 74  ed within an int
32790 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c  ernal node is al
327a0 77 61 79 73 20 6c 65 73 73 20 74 68 61 6e 20 31  ways less than 1
327b0 2f 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  /4.** of the pag
327c0 65 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f 76 66  e-size, the aOvf
327d0 6c 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 20  lSpace[] buffer 
327e0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
327f0 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f   be large.** eno
32800 75 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72  ugh for all over
32810 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a  flow cells..**.*
32820 2a 20 49 66 20 61 4f 76 66 6c 53 70 61 63 65 20  * If aOvflSpace 
32830 69 73 20 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c  is set to a null
32840 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66   pointer, this f
32850 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
32860 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
32870 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
32880 28 5f 4d 53 43 5f 56 45 52 29 20 26 26 20 5f 4d  (_MSC_VER) && _M
32890 53 43 5f 56 45 52 20 3e 3d 20 31 37 30 30 20 26  SC_VER >= 1700 &
328a0 26 20 64 65 66 69 6e 65 64 28 5f 4d 5f 41 52 4d  & defined(_M_ARM
328b0 29 0a 23 70 72 61 67 6d 61 20 6f 70 74 69 6d 69  ).#pragma optimi
328c0 7a 65 28 22 22 2c 20 6f 66 66 29 0a 23 65 6e 64  ze("", off).#end
328d0 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  if.static int ba
328e0 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20  lance_nonroot(. 
328f0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
32900 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
32910 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65 20   /* Parent page 
32920 6f 66 20 73 69 62 6c 69 6e 67 73 20 62 65 69 6e  of siblings bein
32930 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  g balanced */.  
32940 69 6e 74 20 69 50 61 72 65 6e 74 49 64 78 2c 20  int iParentIdx, 
32950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32960 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22 74 68 65  /* Index of "the
32970 20 70 61 67 65 22 20 69 6e 20 70 50 61 72 65 6e   page" in pParen
32980 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76 66 6c  t */.  u8 *aOvfl
32990 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20  Space,          
329a0 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65 2d 73         /* page-s
329b0 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  ize bytes of spa
329c0 63 65 20 66 6f 72 20 70 61 72 65 6e 74 20 6f 76  ce for parent ov
329d0 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f  fl */.  int isRo
329e0 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ot,             
329f0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
32a00 69 66 20 70 50 61 72 65 6e 74 20 69 73 20 61 20  if pParent is a 
32a10 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20 69  root-page */.  i
32a20 6e 74 20 62 42 75 6c 6b 20 20 20 20 20 20 20 20  nt bBulk        
32a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32a40 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 63  * True if this c
32a50 61 6c 6c 20 69 73 20 70 61 72 74 20 6f 66 20 61  all is part of a
32a60 20 62 75 6c 6b 20 6c 6f 61 64 20 2a 2f 0a 29 7b   bulk load */.){
32a70 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
32a80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32a90 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74  /* The whole dat
32aa0 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  abase */.  int n
32ab0 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Cell = 0;       
32ac0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
32ad0 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70  r of cells in ap
32ae0 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Cell[] */.  int 
32af0 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20  nMaxCells = 0;  
32b00 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
32b10 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70  cated size of ap
32b20 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46  Cell, szCell, aF
32b30 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  rom. */.  int nN
32b40 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ew = 0;         
32b50 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
32b60 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e   of pages in apN
32b70 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  ew[] */.  int nO
32b80 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
32b90 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
32ba0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f   of pages in apO
32bb0 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ld[] */.  int i,
32bc0 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20   j, k;          
32bd0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
32be0 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
32bf0 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20 20   nxDiv;         
32c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
32c10 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69  t divider slot i
32c20 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c  n pParent->aCell
32c30 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  [] */.  int rc =
32c40 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
32c50 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
32c60 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36  rn code */.  u16
32c70 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
32c80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69            /* 4 i
32c90 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
32ca0 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a  f.  0 if not */.
32cb0 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20    int leafData; 
32cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32cd0 2a 20 54 72 75 65 20 69 66 20 70 50 61 67 65 20  * True if pPage 
32ce0 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c  is a leaf of a L
32cf0 45 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a  EAFDATA tree */.
32d00 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63    int usableSpac
32d10 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
32d20 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61 67 65  * Bytes in pPage
32d30 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64   beyond the head
32d40 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65  er */.  int page
32d50 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
32d60 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
32d70 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
32d80 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74   */.  int subtot
32d90 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
32da0 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f     /* Subtotal o
32db0 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73  f bytes in cells
32dc0 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a   on one page */.
32dd0 20 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20    int iSpace1 = 
32de0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
32df0 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62  * First unused b
32e00 79 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d  yte of aSpace1[]
32e10 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c 53   */.  int iOvflS
32e20 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20  pace = 0;       
32e30 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73     /* First unus
32e40 65 64 20 62 79 74 65 20 6f 66 20 61 4f 76 66 6c  ed byte of aOvfl
32e50 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74  Space[] */.  int
32e60 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20   szScratch;     
32e70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
32e80 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d  e of scratch mem
32e90 6f 72 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f  ory requested */
32ea0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c  .  MemPage *apOl
32eb0 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20  d[NB];          
32ec0 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20  /* pPage and up 
32ed0 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20  to two siblings 
32ee0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
32ef0 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20  Copy[NB];       
32f00 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70    /* Private cop
32f10 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70  ies of apOld[] p
32f20 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ages */.  MemPag
32f30 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20  e *apNew[NB+2]; 
32f40 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20         /* pPage 
32f50 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62  and up to NB sib
32f60 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61  lings after bala
32f70 6e 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 70  ncing */.  u8 *p
32f80 52 69 67 68 74 3b 20 20 20 20 20 20 20 20 20 20  Right;          
32f90 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74          /* Locat
32fa0 69 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f 66  ion in parent of
32fb0 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 70   right-sibling p
32fc0 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a  ointer */.  u8 *
32fd0 61 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20 20  apDiv[NB-1];    
32fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69           /* Divi
32ff0 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  der cells in pPa
33000 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  rent */.  int cn
33010 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  tNew[NB+2];     
33020 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
33030 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65  in aCell[] of ce
33040 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70 61  ll after i-th pa
33050 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65  ge */.  int szNe
33060 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
33070 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64       /* Combined
33080 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70   size of cells p
33090 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67  lace on i-th pag
330a0 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
330b0 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
330c0 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73      /* All cells
330d0 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20   begin balanced 
330e0 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c  */.  u16 *szCell
330f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33100 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20    /* Local size 
33110 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  of all cells in 
33120 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38  apCell[] */.  u8
33130 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20 20   *aSpace1;      
33140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
33150 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f  ace for copies o
33160 66 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73  f dividers cells
33170 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
33180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33190 20 20 20 2f 2a 20 54 65 6d 70 20 76 61 72 20 74     /* Temp var t
331a0 6f 20 73 74 6f 72 65 20 61 20 70 61 67 65 20 6e  o store a page n
331b0 75 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20 70  umber in */..  p
331c0 42 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 42  Bt = pParent->pB
331d0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
331e0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
331f0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
33200 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
33210 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
33220 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
33230 65 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20 54  e) );..#if 0.  T
33240 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
33250 62 65 67 69 6e 20 70 61 67 65 20 25 64 20 63 68  begin page %d ch
33260 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50  ild of %d\n", pP
33270 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65  age->pgno, pPare
33280 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e 64  nt->pgno));.#end
33290 69 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  if..  /* At this
332a0 20 70 6f 69 6e 74 20 70 50 61 72 65 6e 74 20 6d   point pParent m
332b0 61 79 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20  ay have at most 
332c0 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  one overflow cel
332d0 6c 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20 74  l. And if.  ** t
332e0 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  his overflow cel
332f0 6c 20 69 73 20 70 72 65 73 65 6e 74 2c 20 69 74  l is present, it
33300 20 6d 75 73 74 20 62 65 20 74 68 65 20 63 65 6c   must be the cel
33310 6c 20 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e 64  l with .  ** ind
33320 65 78 20 69 50 61 72 65 6e 74 49 64 78 2e 20 54  ex iParentIdx. T
33330 68 69 73 20 73 63 65 6e 61 72 69 6f 20 63 6f 6d  his scenario com
33340 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20 74 68  es about when th
33350 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  is function.  **
33360 20 69 73 20 63 61 6c 6c 65 64 20 28 69 6e 64 69   is called (indi
33370 72 65 63 74 6c 79 29 20 66 72 6f 6d 20 73 71 6c  rectly) from sql
33380 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
33390 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
333a0 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  ( pParent->nOver
333b0 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65  flow==0 || pPare
333c0 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31  nt->nOverflow==1
333d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
333e0 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
333f0 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e  ==0 || pParent->
33400 61 69 4f 76 66 6c 5b 30 5d 3d 3d 69 50 61 72 65  aiOvfl[0]==iPare
33410 6e 74 49 64 78 20 29 3b 0a 0a 20 20 69 66 28 20  ntIdx );..  if( 
33420 21 61 4f 76 66 6c 53 70 61 63 65 20 29 7b 0a 20  !aOvflSpace ){. 
33430 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
33440 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f  _NOMEM;.  }..  /
33450 2a 20 46 69 6e 64 20 74 68 65 20 73 69 62 6c 69  * Find the sibli
33460 6e 67 20 70 61 67 65 73 20 74 6f 20 62 61 6c 61  ng pages to bala
33470 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61 74 65  nce. Also locate
33480 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50   the cells in pP
33490 61 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68 61 74  arent .  ** that
334a0 20 64 69 76 69 64 65 20 74 68 65 20 73 69 62 6c   divide the sibl
334b0 69 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d 70 74  ings. An attempt
334c0 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64   is made to find
334d0 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20   NN siblings on 
334e0 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 73 69 64  .  ** either sid
334f0 65 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f 72 65  e of pPage. More
33500 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61   siblings are ta
33510 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64  ken from one sid
33520 65 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20 20 2a  e, however, .  *
33530 2a 20 69 66 20 74 68 65 72 65 20 61 72 65 20 66  * if there are f
33540 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69 62  ewer than NN sib
33550 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74 68  lings on the oth
33560 65 72 20 73 69 64 65 2e 20 49 66 20 70 50 61 72  er side. If pPar
33570 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20  ent.  ** has NB 
33580 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64 72 65  or fewer childre
33590 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64  n then all child
335a0 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20 61  ren of pParent a
335b0 72 65 20 74 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a  re taken.  .  **
335c0 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
335d0 61 6c 73 6f 20 64 72 6f 70 73 20 74 68 65 20 64  also drops the d
335e0 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f  ivider cells fro
335f0 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  m the parent pag
33600 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 77 61 79  e. This.  ** way
33610 2c 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  , the remainder 
33620 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
33630 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
33640 20 64 65 61 6c 20 77 69 74 68 20 61 6e 79 0a 20   deal with any. 
33650 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c   ** overflow cel
33660 6c 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74  ls in the parent
33670 20 70 61 67 65 2c 20 73 69 6e 63 65 20 69 66 20   page, since if 
33680 61 6e 79 20 65 78 69 73 74 65 64 20 74 68 65 79  any existed they
33690 20 77 69 6c 6c 0a 20 20 2a 2a 20 68 61 76 65 20   will.  ** have 
336a0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 6d  already been rem
336b0 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 20 3d  oved..  */.  i =
336c0 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
336d0 6c 6f 77 20 2b 20 70 50 61 72 65 6e 74 2d 3e 6e  low + pParent->n
336e0 43 65 6c 6c 3b 0a 20 20 69 66 28 20 69 3c 32 20  Cell;.  if( i<2 
336f0 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 30  ){.    nxDiv = 0
33700 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
33710 73 73 65 72 74 28 20 62 42 75 6c 6b 3d 3d 30 20  ssert( bBulk==0 
33720 7c 7c 20 62 42 75 6c 6b 3d 3d 31 20 29 3b 0a 20  || bBulk==1 );. 
33730 20 20 20 69 66 28 20 69 50 61 72 65 6e 74 49 64     if( iParentId
33740 78 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  x==0 ){         
33750 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e          .      n
33760 78 44 69 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65  xDiv = 0;.    }e
33770 6c 73 65 20 69 66 28 20 69 50 61 72 65 6e 74 49  lse if( iParentI
33780 64 78 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e  dx==i ){.      n
33790 78 44 69 76 20 3d 20 69 2d 32 2b 62 42 75 6c 6b  xDiv = i-2+bBulk
337a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
337b0 20 20 20 61 73 73 65 72 74 28 20 62 42 75 6c 6b     assert( bBulk
337c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 78 44  ==0 );.      nxD
337d0 69 76 20 3d 20 69 50 61 72 65 6e 74 49 64 78 2d  iv = iParentIdx-
337e0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d  1;.    }.    i =
337f0 20 32 2d 62 42 75 6c 6b 3b 0a 20 20 7d 0a 20 20   2-bBulk;.  }.  
33800 6e 4f 6c 64 20 3d 20 69 2b 31 3b 0a 20 20 69 66  nOld = i+1;.  if
33810 28 20 28 69 2b 6e 78 44 69 76 2d 70 50 61 72 65  ( (i+nxDiv-pPare
33820 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3d 3d  nt->nOverflow)==
33830 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
33840 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 26  {.    pRight = &
33850 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
33860 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
33870 74 2b 38 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  t+8];.  }else{. 
33880 20 20 20 70 52 69 67 68 74 20 3d 20 66 69 6e 64     pRight = find
33890 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b  Cell(pParent, i+
338a0 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e  nxDiv-pParent->n
338b0 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 7d 0a 20  Overflow);.  }. 
338c0 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
338d0 28 70 52 69 67 68 74 29 3b 0a 20 20 77 68 69 6c  (pRight);.  whil
338e0 65 28 20 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  e( 1 ){.    rc =
338f0 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
33900 70 42 74 2c 20 70 67 6e 6f 2c 20 26 61 70 4f 6c  pBt, pgno, &apOl
33910 64 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66  d[i], 0);.    if
33920 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 6d 65  ( rc ){.      me
33930 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28  mset(apOld, 0, (
33940 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50  i+1)*sizeof(MemP
33950 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20 67 6f  age*));.      go
33960 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
33970 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d  up;.    }.    nM
33980 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f  axCells += 1+apO
33990 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f  ld[i]->nCell+apO
339a0 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77  ld[i]->nOverflow
339b0 3b 0a 20 20 20 20 69 66 28 20 28 69 2d 2d 29 3d  ;.    if( (i--)=
339c0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  =0 ) break;..   
339d0 20 69 66 28 20 69 2b 6e 78 44 69 76 3d 3d 70 50   if( i+nxDiv==pP
339e0 61 72 65 6e 74 2d 3e 61 69 4f 76 66 6c 5b 30 5d  arent->aiOvfl[0]
339f0 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76   && pParent->nOv
33a00 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
33a10 61 70 44 69 76 5b 69 5d 20 3d 20 70 50 61 72 65  apDiv[i] = pPare
33a20 6e 74 2d 3e 61 70 4f 76 66 6c 5b 30 5d 3b 0a 20  nt->apOvfl[0];. 
33a30 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34       pgno = get4
33a40 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a  byte(apDiv[i]);.
33a50 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d        szNew[i] =
33a60 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
33a70 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b  rent, apDiv[i]);
33a80 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
33a90 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
33aa0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33ab0 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43  apDiv[i] = findC
33ac0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e  ell(pParent, i+n
33ad0 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f  xDiv-pParent->nO
33ae0 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20  verflow);.      
33af0 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
33b00 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20  apDiv[i]);.     
33b10 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c   szNew[i] = cell
33b20 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c  SizePtr(pParent,
33b30 20 61 70 44 69 76 5b 69 5d 29 3b 0a 0a 20 20 20   apDiv[i]);..   
33b40 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 63     /* Drop the c
33b50 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20 70 61 72  ell from the par
33b60 65 6e 74 20 70 61 67 65 2e 20 61 70 44 69 76 5b  ent page. apDiv[
33b70 69 5d 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20  i] still points 
33b80 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  to.      ** the 
33b90 63 65 6c 6c 20 77 69 74 68 69 6e 20 74 68 65 20  cell within the 
33ba0 70 61 72 65 6e 74 2c 20 65 76 65 6e 20 74 68 6f  parent, even tho
33bb0 75 67 68 20 69 74 20 68 61 73 20 62 65 65 6e 20  ugh it has been 
33bc0 64 72 6f 70 70 65 64 2e 0a 20 20 20 20 20 20 2a  dropped..      *
33bd0 2a 20 54 68 69 73 20 69 73 20 73 61 66 65 20 62  * This is safe b
33be0 65 63 61 75 73 65 20 64 72 6f 70 70 69 6e 67 20  ecause dropping 
33bf0 61 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72  a cell only over
33c00 77 72 69 74 65 73 20 74 68 65 20 66 69 72 73 74  writes the first
33c10 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62  .      ** four b
33c20 79 74 65 73 20 6f 66 20 69 74 2c 20 61 6e 64 20  ytes of it, and 
33c30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  this function do
33c40 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20  es not need the 
33c50 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66  first.      ** f
33c60 6f 75 72 20 62 79 74 65 73 20 6f 66 20 74 68 65  our bytes of the
33c70 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 53   divider cell. S
33c80 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73  o the pointer is
33c90 20 73 61 66 65 20 74 6f 20 75 73 65 0a 20 20 20   safe to use.   
33ca0 20 20 20 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e 20     ** later on. 
33cb0 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
33cc0 20 2a 2a 20 42 75 74 20 6e 6f 74 20 69 66 20 77   ** But not if w
33cd0 65 20 61 72 65 20 69 6e 20 73 65 63 75 72 65 2d  e are in secure-
33ce0 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49 6e 20  delete mode. In 
33cf0 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f  secure-delete mo
33d00 64 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  de,.      ** the
33d10 20 64 72 6f 70 43 65 6c 6c 28 29 20 72 6f 75 74   dropCell() rout
33d20 69 6e 65 20 77 69 6c 6c 20 6f 76 65 72 77 72 69  ine will overwri
33d30 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 63 65  te the entire ce
33d40 6c 6c 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 0a  ll with zeroes..
33d50 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73        ** In this
33d60 20 63 61 73 65 2c 20 74 65 6d 70 6f 72 61 72 69   case, temporari
33d70 6c 79 20 63 6f 70 79 20 74 68 65 20 63 65 6c 6c  ly copy the cell
33d80 20 69 6e 74 6f 20 74 68 65 20 61 4f 76 66 6c 53   into the aOvflS
33d90 70 61 63 65 5b 5d 0a 20 20 20 20 20 20 2a 2a 20  pace[].      ** 
33da0 62 75 66 66 65 72 2e 20 49 74 20 77 69 6c 6c 20  buffer. It will 
33db0 62 65 20 63 6f 70 69 65 64 20 6f 75 74 20 61 67  be copied out ag
33dc0 61 69 6e 20 61 73 20 73 6f 6f 6e 20 61 73 20 74  ain as soon as t
33dd0 68 65 20 61 53 70 61 63 65 5b 5d 20 62 75 66 66  he aSpace[] buff
33de0 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61  er.      ** is a
33df0 6c 6c 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 20 20  llocated.  */.  
33e00 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73      if( pBt->bts
33e10 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
33e20 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  RE_DELETE ){.   
33e30 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a       int iOff;..
33e40 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d 20 53          iOff = S
33e50 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
33e60 28 61 70 44 69 76 5b 69 5d 29 20 2d 20 53 51 4c  (apDiv[i]) - SQL
33e70 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
33e80 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a  Parent->aData);.
33e90 20 20 20 20 20 20 20 20 69 66 28 20 28 69 4f 66          if( (iOf
33ea0 66 2b 73 7a 4e 65 77 5b 69 5d 29 3e 28 69 6e 74  f+szNew[i])>(int
33eb0 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
33ec0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
33ed0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
33ee0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
33ef0 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20    memset(apOld, 
33f00 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28  0, (i+1)*sizeof(
33f10 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20  MemPage*));.    
33f20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
33f30 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
33f40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33f50 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 4f 76       memcpy(&aOv
33f60 66 6c 53 70 61 63 65 5b 69 4f 66 66 5d 2c 20 61  flSpace[iOff], a
33f70 70 44 69 76 5b 69 5d 2c 20 73 7a 4e 65 77 5b 69  pDiv[i], szNew[i
33f80 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70  ]);.          ap
33f90 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76 66 6c 53  Div[i] = &aOvflS
33fa0 70 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d 70 50  pace[apDiv[i]-pP
33fb0 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d 3b 0a 20  arent->aData];. 
33fc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
33fd0 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28  .      dropCell(
33fe0 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76  pParent, i+nxDiv
33ff0 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
34000 6c 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d 2c 20 26  low, szNew[i], &
34010 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  rc);.    }.  }..
34020 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65    /* Make nMaxCe
34030 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f  lls a multiple o
34040 66 20 34 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  f 4 in order to 
34050 70 72 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a  preserve 8-byte.
34060 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a    ** alignment *
34070 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20  /.  nMaxCells = 
34080 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29 26  (nMaxCells + 3)&
34090 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41  ~3;..  /*.  ** A
340a0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
340b0 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  r memory structu
340c0 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20 70  res.  */.  k = p
340d0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 52  Bt->pageSize + R
340e0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d  OUND8(sizeof(Mem
340f0 50 61 67 65 29 29 3b 0a 20 20 73 7a 53 63 72 61  Page));.  szScra
34100 74 63 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61  tch =.       nMa
34110 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38  xCells*sizeof(u8
34120 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
34130 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65           /* apCe
34140 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61  ll */.     + nMa
34150 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31  xCells*sizeof(u1
34160 36 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6)              
34170 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65           /* szCe
34180 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74  ll */.     + pBt
34190 2d 3e 70 61 67 65 53 69 7a 65 20 20 20 20 20 20  ->pageSize      
341a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
341b0 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61           /* aSpa
341c0 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20 6b 2a  ce1 */.     + k*
341d0 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  nOld;           
341e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
341f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
34200 65 20 63 6f 70 69 65 73 20 28 61 70 43 6f 70 79  e copies (apCopy
34210 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20  ) */.  apCell = 
34220 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61  sqlite3ScratchMa
34230 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74 63 68 20  lloc( szScratch 
34240 29 3b 20 0a 20 20 69 66 28 20 61 70 43 65 6c 6c  ); .  if( apCell
34250 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
34260 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
34270 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
34280 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a  leanup;.  }.  sz
34290 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70  Cell = (u16*)&ap
342a0 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
342b0 0a 20 20 61 53 70 61 63 65 31 20 3d 20 28 75 38  .  aSpace1 = (u8
342c0 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65  *)&szCell[nMaxCe
342d0 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  lls];.  assert( 
342e0 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
342f0 4d 45 4e 54 28 61 53 70 61 63 65 31 29 20 29 3b  MENT(aSpace1) );
34300 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64  ..  /*.  ** Load
34310 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c   pointers to all
34320 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e   cells on siblin
34330 67 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 20  g pages and the 
34340 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20  divider cells.  
34350 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61  ** into the loca
34360 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79  l apCell[] array
34370 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  .  Make copies o
34380 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
34390 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70  lls.  ** into sp
343a0 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
343b0 6d 20 61 53 70 61 63 65 31 5b 5d 20 61 6e 64 20  m aSpace1[] and 
343c0 72 65 6d 6f 76 65 20 74 68 65 20 64 69 76 69 64  remove the divid
343d0 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 66 72  er cells.  ** fr
343e0 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a  om pParent..  **
343f0 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62  .  ** If the sib
34400 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61  lings are on lea
34410 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68  f pages, then th
34420 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  e child pointers
34430 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76   of the.  ** div
34440 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73  ider cells are s
34450 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65  tripped from the
34460 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68   cells before th
34470 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20  ey are copied.  
34480 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31 5b  ** into aSpace1[
34490 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  ].  In this way,
344a0 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
344b0 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f  Cell[] are witho
344c0 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f  ut.  ** child po
344d0 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c  inters.  If sibl
344e0 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ings are not lea
344f0 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65  ves, then all ce
34500 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c  ll in.  ** apCel
34510 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c  l[] include chil
34520 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74  d pointers.  Eit
34530 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c  her way, all cel
34540 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20  ls in apCell[]. 
34550 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20   ** are alike.. 
34560 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72   **.  ** leafCor
34570 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70  rection:  4 if p
34580 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20  Page is a leaf. 
34590 20 30 20 69 66 20 70 50 61 67 65 20 69 73 20 6e   0 if pPage is n
345a0 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20  ot a leaf..  ** 
345b0 20 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20        leafData: 
345c0 20 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64   1 if pPage hold
345d0 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70  s key+data and p
345e0 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c  Parent holds onl
345f0 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6c  y keys..  */.  l
34600 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20  eafCorrection = 
34610 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65 61 66 2a 34  apOld[0]->leaf*4
34620 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d 20 61  ;.  leafData = a
34630 70 4f 6c 64 5b 30 5d 2d 3e 68 61 73 44 61 74 61  pOld[0]->hasData
34640 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
34650 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Old; i++){.    i
34660 6e 74 20 6c 69 6d 69 74 3b 0a 20 20 20 20 0a 20  nt limit;.    . 
34670 20 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69     /* Before doi
34680 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  ng anything else
34690 2c 20 74 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  , take a copy of
346a0 20 74 68 65 20 69 27 74 68 20 6f 72 69 67 69 6e   the i'th origin
346b0 61 6c 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 2a  al sibling.    *
346c0 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20 74 68  * The rest of th
346d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
346e0 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d 20 74   use data from t
346f0 68 65 20 63 6f 70 69 65 73 20 72 61 74 68 65 72  he copies rather
34700 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65  .    ** that the
34710 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
34720 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69 6e  since the origin
34730 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65  al pages will be
34740 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70   in the.    ** p
34750 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20  rocess of being 
34760 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f  overwritten.  */
34770 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
34780 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d  ld = apCopy[i] =
34790 20 28 4d 65 6d 50 61 67 65 2a 29 26 61 53 70 61   (MemPage*)&aSpa
347a0 63 65 31 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ce1[pBt->pageSiz
347b0 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20 20 20 6d 65  e + k*i];.    me
347c0 6d 63 70 79 28 70 4f 6c 64 2c 20 61 70 4f 6c 64  mcpy(pOld, apOld
347d0 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50  [i], sizeof(MemP
347e0 61 67 65 29 29 3b 0a 20 20 20 20 70 4f 6c 64 2d  age));.    pOld-
347f0 3e 61 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29  >aData = (void*)
34800 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20 20 20 6d 65  &pOld[1];.    me
34810 6d 63 70 79 28 70 4f 6c 64 2d 3e 61 44 61 74 61  mcpy(pOld->aData
34820 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74  , apOld[i]->aDat
34830 61 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  a, pBt->pageSize
34840 29 3b 0a 0a 20 20 20 20 6c 69 6d 69 74 20 3d 20  );..    limit = 
34850 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64  pOld->nCell+pOld
34860 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  ->nOverflow;.   
34870 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72   if( pOld->nOver
34880 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20 20  flow>0 ){.      
34890 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74  for(j=0; j<limit
348a0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
348b0 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d  assert( nCell<nM
348c0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
348d0 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     apCell[nCell]
348e0 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43   = findOverflowC
348f0 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20  ell(pOld, j);.  
34900 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
34910 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ll] = cellSizePt
34920 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e  r(pOld, apCell[n
34930 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 20 20  Cell]);.        
34940 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d  nCell++;.      }
34950 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
34960 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20 70 4f    u8 *aData = pO
34970 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  ld->aData;.     
34980 20 75 31 36 20 6d 61 73 6b 50 61 67 65 20 3d 20   u16 maskPage = 
34990 70 4f 6c 64 2d 3e 6d 61 73 6b 50 61 67 65 3b 0a  pOld->maskPage;.
349a0 20 20 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66        u16 cellOf
349b0 66 73 65 74 20 3d 20 70 4f 6c 64 2d 3e 63 65 6c  fset = pOld->cel
349c0 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 66  lOffset;.      f
349d0 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b  or(j=0; j<limit;
349e0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61   j++){.        a
349f0 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61  ssert( nCell<nMa
34a00 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
34a10 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    apCell[nCell] 
34a20 3d 20 66 69 6e 64 43 65 6c 6c 76 32 28 61 44 61  = findCellv2(aDa
34a30 74 61 2c 20 6d 61 73 6b 50 61 67 65 2c 20 63 65  ta, maskPage, ce
34a40 6c 6c 4f 66 66 73 65 74 2c 20 6a 29 3b 0a 20 20  llOffset, j);.  
34a50 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
34a60 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ll] = cellSizePt
34a70 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e  r(pOld, apCell[n
34a80 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 20 20  Cell]);.        
34a90 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d  nCell++;.      }
34aa0 0a 20 20 20 20 7d 20 20 20 20 20 20 20 0a 20 20  .    }       .  
34ab0 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 26    if( i<nOld-1 &
34ac0 26 20 21 6c 65 61 66 44 61 74 61 29 7b 0a 20 20  & !leafData){.  
34ad0 20 20 20 20 75 31 36 20 73 7a 20 3d 20 28 75 31      u16 sz = (u1
34ae0 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  6)szNew[i];.    
34af0 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20    u8 *pTemp;.   
34b00 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
34b10 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
34b20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
34b30 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 70 54  ] = sz;.      pT
34b40 65 6d 70 20 3d 20 26 61 53 70 61 63 65 31 5b 69  emp = &aSpace1[i
34b50 53 70 61 63 65 31 5d 3b 0a 20 20 20 20 20 20 69  Space1];.      i
34b60 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20 20  Space1 += sz;.  
34b70 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d      assert( sz<=
34b80 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33  pBt->maxLocal+23
34b90 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
34ba0 28 20 69 53 70 61 63 65 31 20 3c 3d 20 28 69 6e  ( iSpace1 <= (in
34bb0 74 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  t)pBt->pageSize 
34bc0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
34bd0 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d 2c  pTemp, apDiv[i],
34be0 20 73 7a 29 3b 0a 20 20 20 20 20 20 61 70 43 65   sz);.      apCe
34bf0 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d  ll[nCell] = pTem
34c00 70 2b 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  p+leafCorrection
34c10 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
34c20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
34c30 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72 65 63 74  0 || leafCorrect
34c40 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ion==4 );.      
34c50 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
34c60 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 20  szCell[nCell] - 
34c70 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
34c80 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c 64 2d        if( !pOld-
34c90 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
34ca0 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
34cb0 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20  rection==0 );.  
34cc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
34cd0 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 30  ld->hdrOffset==0
34ce0 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   );.        /* T
34cf0 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74 65 72  he right pointer
34d00 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61   of the child pa
34d10 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20  ge pOld becomes 
34d20 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20 20 20  the left.       
34d30 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20 74   ** pointer of t
34d40 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  he divider cell 
34d50 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  */.        memcp
34d60 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c  y(apCell[nCell],
34d70 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 38 5d   &pOld->aData[8]
34d80 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 4);.      }els
34d90 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
34da0 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
34db0 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20  n==4 );.        
34dc0 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c  if( szCell[nCell
34dd0 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ]<4 ){.         
34de0 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77   /* Do not allow
34df0 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c 6c   any cells small
34e00 65 72 20 74 68 61 6e 20 34 20 62 79 74 65 73 2e  er than 4 bytes.
34e10 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 7a   */.          sz
34e20 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b  Cell[nCell] = 4;
34e30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34e40 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b   }.      nCell++
34e50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
34e60 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75  *.  ** Figure ou
34e70 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
34e80 70 61 67 65 73 20 6e 65 65 64 65 64 20 74 6f 20  pages needed to 
34e90 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63  hold all nCell c
34ea0 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65  ells..  ** Store
34eb0 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69 6e 20   this number in 
34ec0 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75  "k".  Also compu
34ed0 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68  te szNew[] which
34ee0 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a 20 20   is the total.  
34ef0 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63  ** size of all c
34f00 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74 68  ells on the i-th
34f10 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e 65 77   page and cntNew
34f20 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20  [] which is the 
34f30 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70  index.  ** in ap
34f40 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65  Cell[] of the ce
34f50 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65 73 20  ll that divides 
34f60 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61 67 65  page i from page
34f70 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74   i+1.  .  ** cnt
34f80 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71  New[k] should eq
34f90 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a  ual nCell..  **.
34fa0 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70    ** Values comp
34fb0 75 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f  uted by this blo
34fc0 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ck:.  **.  **   
34fd0 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65 20 74          k: The t
34fe0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
34ff0 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20 20 2a  ibling pages.  *
35000 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53  *    szNew[i]: S
35010 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20 74 68  paced used on th
35020 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70  e i-th sibling p
35030 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e  age..  **   cntN
35040 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20  ew[i]: Index in 
35050 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43  apCell[] and szC
35060 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66 69  ell[] for the fi
35070 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a  rst cell to.  **
35080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
35090 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20 69  e right of the i
350a0 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65  -th sibling page
350b0 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53 70 61  ..  ** usableSpa
350c0 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79  ce: Number of by
350d0 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 76 61  tes of space ava
350e0 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68 20 73  ilable on each s
350f0 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20  ibling..  ** .  
35100 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61 63 65  */.  usableSpace
35110 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
35120 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f  ze - 12 + leafCo
35130 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28  rrection;.  for(
35140 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20  subtotal=k=i=0; 
35150 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
35160 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4d 61     assert( i<nMa
35170 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75  xCells );.    su
35180 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c  btotal += szCell
35190 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66 28  [i] + 2;.    if(
351a0 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73 61 62   subtotal > usab
351b0 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20  leSpace ){.     
351c0 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74   szNew[k] = subt
351d0 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d  otal - szCell[i]
351e0 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b  ;.      cntNew[k
351f0 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28  ] = i;.      if(
35200 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69 2d 2d   leafData ){ i--
35210 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74 6f 74  ; }.      subtot
35220 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b  al = 0;.      k+
35230 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3e 4e  +;.      if( k>N
35240 42 2b 31 20 29 7b 20 72 63 20 3d 20 53 51 4c 49  B+1 ){ rc = SQLI
35250 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
35260 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
35270 65 61 6e 75 70 3b 20 7d 0a 20 20 20 20 7d 0a 20  eanup; }.    }. 
35280 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20   }.  szNew[k] = 
35290 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e  subtotal;.  cntN
352a0 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20  ew[k] = nCell;. 
352b0 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a   k++;..  /*.  **
352c0 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d   The packing com
352d0 70 75 74 65 64 20 62 79 20 74 68 65 20 70 72 65  puted by the pre
352e0 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20 62  vious block is b
352f0 69 61 73 65 64 20 74 6f 77 61 72 64 20 74 68 65  iased toward the
35300 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f   siblings.  ** o
35310 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64 65 2e  n the left side.
35320 20 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c 69    The left sibli
35330 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e  ngs are always n
35340 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c  early full, whil
35350 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68 74  e the.  ** right
35360 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d 69  -most sibling mi
35370 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65 6d  ght be nearly em
35380 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b  pty.  This block
35390 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70 74   of code attempt
353a0 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74  s.  ** to adjust
353b0 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66 20   the packing of 
353c0 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74 20  siblings to get 
353d0 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63 65  a better balance
353e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
353f0 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d   adjustment is m
35400 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74 69  ore than an opti
35410 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 70  mization.  The p
35420 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69 67  acking above mig
35430 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75  ht.  ** be so ou
35440 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73 20  t of balance as 
35450 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20  to be illegal.  
35460 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  For example, the
35470 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a   right-most.  **
35480 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62   sibling might b
35490 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  e completely emp
354a0 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73 74  ty.  This adjust
354b0 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74 69  ment is not opti
354c0 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  onal..  */.  for
354d0 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d  (i=k-1; i>0; i--
354e0 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69 67  ){.    int szRig
354f0 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20  ht = szNew[i];  
35500 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69  /* Size of sibli
35510 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  ng on the right 
35520 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 66  */.    int szLef
35530 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20  t = szNew[i-1]; 
35540 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69  /* Size of sibli
35550 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a  ng on the left *
35560 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20 20  /.    int r;    
35570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
35580 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74  ex of right-most
35590 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69   cell in left si
355a0 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  bling */.    int
355b0 20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   d;             
355c0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
355d0 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c  st cell to the l
355e0 65 66 74 20 6f 66 20 72 69 67 68 74 20 73 69 62  eft of right sib
355f0 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d  ling */..    r =
35600 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31   cntNew[i-1] - 1
35610 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20  ;.    d = r + 1 
35620 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20  - leafData;.    
35630 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43 65  assert( d<nMaxCe
35640 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72  lls );.    asser
35650 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( r<nMaxCells )
35660 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a 52  ;.    while( szR
35670 69 67 68 74 3d 3d 30 20 0a 20 20 20 20 20 20 20  ight==0 .       
35680 7c 7c 20 28 21 62 42 75 6c 6b 20 26 26 20 73 7a  || (!bBulk && sz
35690 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b  Right+szCell[d]+
356a0 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c  2<=szLeft-(szCel
356b0 6c 5b 72 5d 2b 32 29 29 20 0a 20 20 20 20 29 7b  l[r]+2)) .    ){
356c0 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b  .      szRight +
356d0 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b  = szCell[d] + 2;
356e0 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d  .      szLeft -=
356f0 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a   szCell[r] + 2;.
35700 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31        cntNew[i-1
35710 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63  ]--;.      r = c
35720 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a  ntNew[i-1] - 1;.
35730 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20        d = r + 1 
35740 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20  - leafData;.    
35750 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d  }.    szNew[i] =
35760 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a   szRight;.    sz
35770 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66  New[i-1] = szLef
35780 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74  t;.  }..  /* Eit
35790 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65  her we found one
357a0 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28   or more cells (
357b0 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72  cntnew[0])>0) or
357c0 20 70 50 61 67 65 20 69 73 0a 20 20 2a 2a 20 61   pPage is.  ** a
357d0 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
357e0 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20 72  ge.  A virtual r
357f0 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68 65 6e  oot page is when
35800 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20   the real root. 
35810 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67 65   ** page is page
35820 20 31 20 61 6e 64 20 77 65 20 61 72 65 20 74 68   1 and we are th
35830 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20  e only child of 
35840 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2a 0a  that page..  **.
35850 20 20 2a 2a 20 55 50 44 41 54 45 3a 20 20 54 68    ** UPDATE:  Th
35860 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77  e assert() below
35870 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
35880 69 6c 79 20 74 72 75 65 20 69 66 20 74 68 65 20  ily true if the 
35890 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 66 69  database.  ** fi
358a0 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2e 20 20  le is corrupt.  
358b0 54 68 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  The corruption w
358c0 69 6c 6c 20 62 65 20 64 65 74 65 63 74 65 64 20  ill be detected 
358d0 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c 61 74  and reported lat
358e0 65 72 0a 20 20 2a 2a 20 69 6e 20 74 68 69 73 20  er.  ** in this 
358f0 70 72 6f 63 65 64 75 72 65 20 73 6f 20 74 68 65  procedure so the
35900 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
35910 20 61 63 74 20 75 70 6f 6e 20 69 74 20 6e 6f 77   act upon it now
35920 2e 0a 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61  ..  */.#if 0.  a
35930 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d  ssert( cntNew[0]
35940 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e  >0 || (pParent->
35950 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65  pgno==1 && pPare
35960 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b  nt->nCell==0) );
35970 0a 23 65 6e 64 69 66 0a 0a 20 20 54 52 41 43 45  .#endif..  TRACE
35980 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a  (("BALANCE: old:
35990 20 25 64 20 25 64 20 25 64 20 20 22 2c 0a 20 20   %d %d %d  ",.  
359a0 20 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f    apOld[0]->pgno
359b0 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f  , .    nOld>=2 ?
359c0 20 61 70 4f 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20   apOld[1]->pgno 
359d0 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33  : 0,.    nOld>=3
359e0 20 3f 20 61 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e   ? apOld[2]->pgn
359f0 6f 20 3a 20 30 0a 20 20 29 29 3b 0a 0a 20 20 2f  o : 0.  ));..  /
35a00 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  *.  ** Allocate 
35a10 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65  k new pages.  Re
35a20 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68  use old pages wh
35a30 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20  ere possible..  
35a40 2a 2f 0a 20 20 69 66 28 20 61 70 4f 6c 64 5b 30  */.  if( apOld[0
35a50 5d 2d 3e 70 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20  ]->pgno<=1 ){.  
35a60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
35a70 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
35a80 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
35a90 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 70 61 67 65  anup;.  }.  page
35aa0 46 6c 61 67 73 20 3d 20 61 70 4f 6c 64 5b 30 5d  Flags = apOld[0]
35ab0 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f  ->aData[0];.  fo
35ac0 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=0; i<k; i++)
35ad0 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
35ae0 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e  New;.    if( i<n
35af0 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  Old ){.      pNe
35b00 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61  w = apNew[i] = a
35b10 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61  pOld[i];.      a
35b20 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pOld[i] = 0;.   
35b30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
35b40 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e  agerWrite(pNew->
35b50 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
35b60 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66  nNew++;.      if
35b70 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
35b80 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
35b90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
35ba0 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20  sert( i>0 );.   
35bb0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
35bc0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
35bd0 70 4e 65 77 2c 20 26 70 67 6e 6f 2c 20 28 62 42  pNew, &pgno, (bB
35be0 75 6c 6b 20 3f 20 31 20 3a 20 70 67 6e 6f 29 2c  ulk ? 1 : pgno),
35bf0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
35c00 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
35c10 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
35c20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b  apNew[i] = pNew;
35c30 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a  .      nNew++;..
35c40 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65        /* Set the
35c50 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
35c60 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73  ry for the new s
35c70 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a  ibling page. */.
35c80 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54 4f        if( ISAUTO
35c90 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
35ca0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
35cb0 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54 52   pNew->pgno, PTR
35cc0 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65  MAP_BTREE, pPare
35cd0 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  nt->pgno, &rc);.
35ce0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
35cf0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
35d00 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
35d10 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
35d20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
35d30 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
35d40 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65  ree any old page
35d50 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20  s that were not 
35d60 72 65 75 73 65 64 20 61 73 20 6e 65 77 20 70 61  reused as new pa
35d70 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  ges..  */.  whil
35d80 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20  e( i<nOld ){.   
35d90 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b   freePage(apOld[
35da0 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66  i], &rc);.    if
35db0 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
35dc0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
35dd0 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f   releasePage(apO
35de0 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c  ld[i]);.    apOl
35df0 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b  d[i] = 0;.    i+
35e00 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  +;.  }..  /*.  *
35e10 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20 70 61  * Put the new pa
35e20 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67  ges in accending
35e30 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68 65   order.  This he
35e40 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70  lps to.  ** keep
35e50 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
35e60 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64  disk file in ord
35e70 65 72 20 73 6f 20 74 68 61 74 20 61 20 73 63 61  er so that a sca
35e80 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61  n.  ** of the ta
35e90 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20  ble is a linear 
35ea0 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  scan through the
35eb0 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a   file.  That.  *
35ec0 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20  * in turn helps 
35ed0 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
35ee0 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20  stem to deliver 
35ef0 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20  pages.  ** from 
35f00 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61  the disk more ra
35f10 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  pidly..  **.  **
35f20 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72   An O(n^2) inser
35f30 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69  tion sort algori
35f40 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74  thm is used, but
35f50 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73   since.  ** n is
35f60 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e   never more than
35f70 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e   NB (a small con
35f80 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f  stant), that sho
35f90 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20  uld.  ** not be 
35fa0 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a  a problem..  **.
35fb0 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c    ** When NB==3,
35fc0 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69   this one optimi
35fd0 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65  zation makes the
35fe0 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61   database.  ** a
35ff0 62 6f 75 74 20 32 35 25 20 66 61 73 74 65 72 20  bout 25% faster 
36000 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74  for large insert
36010 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f  ions and deletio
36020 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ns..  */.  for(i
36030 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b  =0; i<k-1; i++){
36040 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20  .    int minV = 
36050 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a  apNew[i]->pgno;.
36060 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69      int minI = i
36070 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b  ;.    for(j=i+1;
36080 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<k; j++){.    
36090 20 20 69 66 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e    if( apNew[j]->
360a0 70 67 6e 6f 3c 28 75 6e 73 69 67 6e 65 64 29 6d  pgno<(unsigned)m
360b0 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  inV ){.        m
360c0 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  inI = j;.       
360d0 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 6a 5d   minV = apNew[j]
360e0 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  ->pgno;.      }.
360f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69      }.    if( mi
36100 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 4d 65  nI>i ){.      Me
36110 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20  mPage *pT;.     
36120 20 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a   pT = apNew[i];.
36130 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d        apNew[i] =
36140 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20   apNew[minI];.  
36150 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20      apNew[minI] 
36160 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = pT;.    }.  }.
36170 20 20 54 52 41 43 45 28 28 22 6e 65 77 3a 20 25    TRACE(("new: %
36180 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
36190 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
361a0 29 5c 6e 22 2c 0a 20 20 20 20 61 70 4e 65 77 5b  )\n",.    apNew[
361b0 30 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e 65 77 5b  0]->pgno, szNew[
361c0 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20  0],.    nNew>=2 
361d0 3f 20 61 70 4e 65 77 5b 31 5d 2d 3e 70 67 6e 6f  ? apNew[1]->pgno
361e0 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20   : 0, nNew>=2 ? 
361f0 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20  szNew[1] : 0,.  
36200 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 61 70 4e 65    nNew>=3 ? apNe
36210 77 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20  w[2]->pgno : 0, 
36220 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b  nNew>=3 ? szNew[
36230 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77  2] : 0,.    nNew
36240 3e 3d 34 20 3f 20 61 70 4e 65 77 5b 33 5d 2d 3e  >=4 ? apNew[3]->
36250 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  pgno : 0, nNew>=
36260 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30  4 ? szNew[3] : 0
36270 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20  ,.    nNew>=5 ? 
36280 61 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e 6f 20 3a  apNew[4]->pgno :
36290 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a   0, nNew>=5 ? sz
362a0 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20  New[4] : 0));.. 
362b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
362c0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
362d0 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
362e0 65 29 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65  e) );.  put4byte
362f0 28 70 52 69 67 68 74 2c 20 61 70 4e 65 77 5b 6e  (pRight, apNew[n
36300 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a  New-1]->pgno);..
36310 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79    /*.  ** Evenly
36320 20 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20   distribute the 
36330 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  data in apCell[]
36340 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20   across the new 
36350 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65  pages..  ** Inse
36360 72 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  rt divider cells
36370 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73   into pParent as
36380 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
36390 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28  .  j = 0;.  for(
363a0 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
363b0 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62  ){.    /* Assemb
363c0 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69  le the new sibli
363d0 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ng page. */.    
363e0 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20  MemPage *pNew = 
363f0 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73  apNew[i];.    as
36400 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c  sert( j<nMaxCell
36410 73 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67  s );.    zeroPag
36420 65 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67  e(pNew, pageFlag
36430 73 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65  s);.    assemble
36440 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65  Page(pNew, cntNe
36450 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b  w[i]-j, &apCell[
36460 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b  j], &szCell[j]);
36470 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
36480 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e  w->nCell>0 || (n
36490 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77  New==1 && cntNew
364a0 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61  [0]==0) );.    a
364b0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76  ssert( pNew->nOv
364c0 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20  erflow==0 );..  
364d0 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b    j = cntNew[i];
364e0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
364f0 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73 73  sibling page ass
36500 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61 73  embled above was
36510 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d   not the right-m
36520 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20  ost sibling,.   
36530 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69 76   ** insert a div
36540 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74  ider cell into t
36550 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
36560 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
36570 74 28 20 69 3c 6e 4e 65 77 2d 31 20 7c 7c 20 6a  t( i<nNew-1 || j
36580 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69  ==nCell );.    i
36590 66 28 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20  f( j<nCell ){.  
365a0 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20      u8 *pCell;. 
365b0 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a       u8 *pTemp;.
365c0 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20        int sz;.. 
365d0 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e       assert( j<n
365e0 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
365f0 20 20 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c    pCell = apCell
36600 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20  [j];.      sz = 
36610 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66  szCell[j] + leaf
36620 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
36630 20 20 70 54 65 6d 70 20 3d 20 26 61 4f 76 66 6c    pTemp = &aOvfl
36640 53 70 61 63 65 5b 69 4f 76 66 6c 53 70 61 63 65  Space[iOvflSpace
36650 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e  ];.      if( !pN
36660 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ew->leaf ){.    
36670 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
36680 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c  ->aData[8], pCel
36690 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c  l, 4);.      }el
366a0 73 65 20 69 66 28 20 6c 65 61 66 44 61 74 61 20  se if( leafData 
366b0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
366c0 20 74 68 65 20 74 72 65 65 20 69 73 20 61 20 6c   the tree is a l
366d0 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61  eaf-data tree, a
366e0 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  nd the siblings 
366f0 61 72 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20  are leaves, .   
36700 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
36710 72 65 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72  re is no divider
36720 20 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b   cell in apCell[
36730 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20  ]. Instead, the 
36740 64 69 76 69 64 65 72 20 0a 20 20 20 20 20 20 20  divider .       
36750 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74   ** cell consist
36760 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  s of the integer
36770 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72 69 67   key for the rig
36780 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20  ht-most cell of 
36790 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
367a0 73 69 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73  sibling-page ass
367b0 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c  embled above onl
367c0 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  y..        */.  
367d0 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
367e0 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d  nfo;.        j--
367f0 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 50  ;.        btreeP
36800 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e 65 77  arseCellPtr(pNew
36810 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e  , apCell[j], &in
36820 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 43 65  fo);.        pCe
36830 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20  ll = pTemp;.    
36840 20 20 20 20 73 7a 20 3d 20 34 20 2b 20 70 75 74      sz = 4 + put
36850 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d  Varint(&pCell[4]
36860 2c 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 20 20  , info.nKey);.  
36870 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b        pTemp = 0;
36880 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
36890 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34        pCell -= 4
368a0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 73  ;.        /* Obs
368b0 63 75 72 65 20 63 61 73 65 20 66 6f 72 20 6e 6f  cure case for no
368c0 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65  n-leaf-data tree
368d0 73 3a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 61  s: If the cell a
368e0 74 20 70 43 65 6c 6c 20 77 61 73 0a 20 20 20 20  t pCell was.    
368f0 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c      ** previousl
36900 79 20 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65  y stored on a le
36910 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73  af node, and its
36920 20 72 65 70 6f 72 74 65 64 20 73 69 7a 65 20 77   reported size w
36930 61 73 20 34 0a 20 20 20 20 20 20 20 20 2a 2a 20  as 4.        ** 
36940 62 79 74 65 73 2c 20 74 68 65 6e 20 69 74 20 6d  bytes, then it m
36950 61 79 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73  ay actually be s
36960 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73  maller than this
36970 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 73 65   .        ** (se
36980 65 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e btreeParseCell
36990 50 74 72 28 29 2c 20 34 20 62 79 74 65 73 20 69  Ptr(), 4 bytes i
369a0 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69  s the minimum si
369b0 7a 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  ze of.        **
369c0 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74 20   any cell). But 
369d0 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
369e0 74 6f 20 70 61 73 73 20 74 68 65 20 63 6f 72 72  to pass the corr
369f0 65 63 74 20 73 69 7a 65 20 74 6f 20 0a 20 20 20  ect size to .   
36a00 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 43 65       ** insertCe
36a10 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61 72 73 65  ll(), so reparse
36a20 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20   the cell now.. 
36a30 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
36a40 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
36a50 68 69 73 20 63 61 6e 20 6e 65 76 65 72 20 68 61  his can never ha
36a60 70 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74  ppen in an SQLit
36a70 65 20 64 61 74 61 20 66 69 6c 65 2c 20 61 73 20  e data file, as 
36a80 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  all.        ** c
36a90 65 6c 6c 73 20 61 72 65 20 61 74 20 6c 65 61 73  ells are at leas
36aa0 74 20 34 20 62 79 74 65 73 2e 20 49 74 20 6f 6e  t 4 bytes. It on
36ab0 6c 79 20 68 61 70 70 65 6e 73 20 69 6e 20 62 2d  ly happens in b-
36ac0 74 72 65 65 73 20 75 73 65 64 0a 20 20 20 20 20  trees used.     
36ad0 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74     ** to evaluat
36ae0 65 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  e "IN (SELECT ..
36af0 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c 61 72 20  .)" and similar 
36b00 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20  clauses..       
36b10 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
36b20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a  szCell[j]==4 ){.
36b30 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
36b40 28 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d  (leafCorrection=
36b50 3d 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  =4);.          s
36b60 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  z = cellSizePtr(
36b70 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b  pParent, pCell);
36b80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
36b90 20 7d 0a 20 20 20 20 20 20 69 4f 76 66 6c 53 70   }.      iOvflSp
36ba0 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20  ace += sz;.     
36bb0 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74   assert( sz<=pBt
36bc0 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33 20 29 3b  ->maxLocal+23 );
36bd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
36be0 4f 76 66 6c 53 70 61 63 65 20 3c 3d 20 28 69 6e  OvflSpace <= (in
36bf0 74 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  t)pBt->pageSize 
36c00 29 3b 0a 20 20 20 20 20 20 69 6e 73 65 72 74 43  );.      insertC
36c10 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44  ell(pParent, nxD
36c20 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70  iv, pCell, sz, p
36c30 54 65 6d 70 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f  Temp, pNew->pgno
36c40 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66  , &rc);.      if
36c50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
36c60 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
36c70 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 73  leanup;.      as
36c80 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
36c90 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
36ca0 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20  arent->pDbPage) 
36cb0 29 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  );..      j++;. 
36cc0 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20       nxDiv++;.  
36cd0 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
36ce0 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20  ( j==nCell );.  
36cf0 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29  assert( nOld>0 )
36d00 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
36d10 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67  >0 );.  if( (pag
36d20 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41  eFlags & PTF_LEA
36d30 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20  F)==0 ){.    u8 
36d40 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70 43 6f 70  *zChild = &apCop
36d50 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61  y[nOld-1]->aData
36d60 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  [8];.    memcpy(
36d70 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e  &apNew[nNew-1]->
36d80 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64  aData[8], zChild
36d90 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  , 4);.  }..  if(
36da0 20 69 73 52 6f 6f 74 20 26 26 20 70 50 61 72 65   isRoot && pPare
36db0 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20  nt->nCell==0 && 
36dc0 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
36dd0 65 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46  et<=apNew[0]->nF
36de0 72 65 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ree ){.    /* Th
36df0 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
36e00 68 65 20 62 2d 74 72 65 65 20 6e 6f 77 20 63 6f  he b-tree now co
36e10 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e  ntains no cells.
36e20 20 54 68 65 20 6f 6e 6c 79 20 73 69 62 6c 69 6e   The only siblin
36e30 67 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73  g.    ** page is
36e40 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
36e50 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 2e 20   of the parent. 
36e60 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74  Copy the content
36e70 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  s of the.    ** 
36e80 63 68 69 6c 64 20 70 61 67 65 20 69 6e 74 6f 20  child page into 
36e90 74 68 65 20 70 61 72 65 6e 74 2c 20 64 65 63 72  the parent, decr
36ea0 65 61 73 69 6e 67 20 74 68 65 20 6f 76 65 72 61  easing the overa
36eb0 6c 6c 20 68 65 69 67 68 74 20 6f 66 20 74 68 65  ll height of the
36ec0 0a 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 73  .    ** b-tree s
36ed0 74 72 75 63 74 75 72 65 20 62 79 20 6f 6e 65 2e  tructure by one.
36ee0 20 54 68 69 73 20 69 73 20 64 65 73 63 72 69 62   This is describ
36ef0 65 64 20 61 73 20 74 68 65 20 22 62 61 6c 61 6e  ed as the "balan
36f00 63 65 2d 73 68 61 6c 6c 6f 77 65 72 22 0a 20 20  ce-shallower".  
36f10 20 20 2a 2a 20 73 75 62 2d 61 6c 67 6f 72 69 74    ** sub-algorit
36f20 68 6d 20 69 6e 20 73 6f 6d 65 20 64 6f 63 75 6d  hm in some docum
36f30 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a  entation..    **
36f40 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20  .    ** If this 
36f50 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
36f60 6d 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  m database, the 
36f70 63 61 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f 64 65  call to copyNode
36f80 43 6f 6e 74 65 6e 74 28 29 20 0a 20 20 20 20 2a  Content() .    *
36f90 2a 20 73 65 74 73 20 61 6c 6c 20 70 6f 69 6e 74  * sets all point
36fa0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63  er-map entries c
36fb0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
36fc0 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 70  database image p
36fd0 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 66 6f 72  ages .    ** for
36fe0 20 77 68 69 63 68 20 74 68 65 20 70 6f 69 6e 74   which the point
36ff0 65 72 20 69 73 20 73 74 6f 72 65 64 20 77 69 74  er is stored wit
37000 68 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hin the content 
37010 62 65 69 6e 67 20 63 6f 70 69 65 64 2e 0a 20 20  being copied..  
37020 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
37030 73 65 63 6f 6e 64 20 61 73 73 65 72 74 20 62 65  second assert be
37040 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 61  low verifies tha
37050 74 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  t the child page
37060 20 69 73 20 64 65 66 72 61 67 6d 65 6e 74 65 64   is defragmented
37070 0a 20 20 20 20 2a 2a 20 28 69 74 20 6d 75 73 74  .    ** (it must
37080 20 62 65 2c 20 61 73 20 69 74 20 77 61 73 20 6a   be, as it was j
37090 75 73 74 20 72 65 63 6f 6e 73 74 72 75 63 74 65  ust reconstructe
370a0 64 20 75 73 69 6e 67 20 61 73 73 65 6d 62 6c 65  d using assemble
370b0 50 61 67 65 28 29 29 2e 20 54 68 69 73 0a 20 20  Page()). This.  
370c0 20 20 2a 2a 20 69 73 20 69 6d 70 6f 72 74 61 6e    ** is importan
370d0 74 20 69 66 20 74 68 65 20 70 61 72 65 6e 74 20  t if the parent 
370e0 70 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20  page happens to 
370f0 62 65 20 70 61 67 65 20 31 20 6f 66 20 74 68 65  be page 1 of the
37100 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
37110 20 69 6d 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20   image.  */.    
37120 61 73 73 65 72 74 28 20 6e 4e 65 77 3d 3d 31 20  assert( nNew==1 
37130 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  );.    assert( a
37140 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 3d  pNew[0]->nFree =
37150 3d 20 0a 20 20 20 20 20 20 20 20 28 67 65 74 32  = .        (get2
37160 62 79 74 65 28 26 61 70 4e 65 77 5b 30 5d 2d 3e  byte(&apNew[0]->
37170 61 44 61 74 61 5b 35 5d 29 2d 61 70 4e 65 77 5b  aData[5])-apNew[
37180 30 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2d 61  0]->cellOffset-a
37190 70 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a 32  pNew[0]->nCell*2
371a0 29 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6f  ) .    );.    co
371b0 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 61 70  pyNodeContent(ap
371c0 4e 65 77 5b 30 5d 2c 20 70 50 61 72 65 6e 74 2c  New[0], pParent,
371d0 20 26 72 63 29 3b 0a 20 20 20 20 66 72 65 65 50   &rc);.    freeP
371e0 61 67 65 28 61 70 4e 65 77 5b 30 5d 2c 20 26 72  age(apNew[0], &r
371f0 63 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  c);.  }else if( 
37200 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
37210 20 20 20 20 2f 2a 20 46 69 78 20 74 68 65 20 70      /* Fix the p
37220 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
37230 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 20 63  es for all the c
37240 65 6c 6c 73 20 74 68 61 74 20 77 65 72 65 20 73  ells that were s
37250 68 69 66 74 65 64 20 61 72 6f 75 6e 64 2e 20 0a  hifted around. .
37260 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65      ** There are
37270 20 73 65 76 65 72 61 6c 20 64 69 66 66 65 72 65   several differe
37280 6e 74 20 74 79 70 65 73 20 6f 66 20 70 6f 69 6e  nt types of poin
37290 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
372a0 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 20 20 20  that need to.   
372b0 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74   ** be dealt wit
372c0 68 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  h by this routin
372d0 65 2e 20 53 6f 6d 65 20 6f 66 20 74 68 65 73 65  e. Some of these
372e0 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 61   have been set a
372f0 6c 72 65 61 64 79 2c 20 62 75 74 0a 20 20 20 20  lready, but.    
37300 2a 2a 20 6d 61 6e 79 20 68 61 76 65 20 6e 6f 74  ** many have not
37310 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
37320 69 73 20 61 20 73 75 6d 6d 61 72 79 3a 0a 20 20  is a summary:.  
37330 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 31 29    **.    **   1)
37340 20 54 68 65 20 65 6e 74 72 69 65 73 20 61 73 73   The entries ass
37350 6f 63 69 61 74 65 64 20 77 69 74 68 20 6e 65 77  ociated with new
37360 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74   sibling pages t
37370 68 61 74 20 77 65 72 65 20 6e 6f 74 0a 20 20 20  hat were not.   
37380 20 2a 2a 20 20 20 20 20 20 73 69 62 6c 69 6e 67   **      sibling
37390 73 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  s when this func
373a0 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e  tion was called.
373b0 20 54 68 65 73 65 20 68 61 76 65 20 61 6c 72 65   These have alre
373c0 61 64 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ady.    **      
373d0 62 65 65 6e 20 73 65 74 2e 20 57 65 20 64 6f 6e  been set. We don
373e0 27 74 20 6e 65 65 64 20 74 6f 20 77 6f 72 72 79  't need to worry
373f0 20 61 62 6f 75 74 20 6f 6c 64 20 73 69 62 6c 69   about old sibli
37400 6e 67 73 20 74 68 61 74 20 77 65 72 65 0a 20 20  ngs that were.  
37410 20 20 2a 2a 20 20 20 20 20 20 6d 6f 76 65 64 20    **      moved 
37420 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  to the free-list
37430 20 2d 20 74 68 65 20 66 72 65 65 50 61 67 65 28   - the freePage(
37440 29 20 63 6f 64 65 20 68 61 73 20 74 61 6b 65 6e  ) code has taken
37450 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 20 20 20   care.    **    
37460 20 20 6f 66 20 74 68 6f 73 65 2e 0a 20 20 20 20    of those..    
37470 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 32 29 20 54  **.    **   2) T
37480 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
37490 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65  ntries associate
374a0 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74  d with the first
374b0 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a   overflow.    **
374c0 20 20 20 20 20 20 70 61 67 65 20 69 6e 20 61 6e        page in an
374d0 79 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  y overflow chain
374e0 73 20 75 73 65 64 20 62 79 20 6e 65 77 20 64 69  s used by new di
374f0 76 69 64 65 72 20 63 65 6c 6c 73 2e 20 54 68 65  vider cells. The
37500 73 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  se .    **      
37510 68 61 76 65 20 61 6c 73 6f 20 61 6c 72 65 61 64  have also alread
37520 79 20 62 65 65 6e 20 74 61 6b 65 6e 20 63 61 72  y been taken car
37530 65 20 6f 66 20 62 79 20 74 68 65 20 69 6e 73 65  e of by the inse
37540 72 74 43 65 6c 6c 28 29 20 63 6f 64 65 2e 0a 20  rtCell() code.. 
37550 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 33     **.    **   3
37560 29 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  ) If the sibling
37570 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c   pages are not l
37580 65 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20  eaves, then the 
37590 63 68 69 6c 64 20 70 61 67 65 73 20 6f 66 0a 20  child pages of. 
375a0 20 20 20 2a 2a 20 20 20 20 20 20 63 65 6c 6c 73     **      cells
375b0 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 73   stored on the s
375c0 69 62 6c 69 6e 67 20 70 61 67 65 73 20 6d 61 79  ibling pages may
375d0 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61   need to be upda
375e0 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ted..    **.    
375f0 2a 2a 20 20 20 34 29 20 49 66 20 74 68 65 20 73  **   4) If the s
37600 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65  ibling pages are
37610 20 6e 6f 74 20 69 6e 74 65 72 6e 61 6c 20 69 6e   not internal in
37620 74 6b 65 79 20 6e 6f 64 65 73 2c 20 74 68 65 6e  tkey nodes, then
37630 20 61 6e 79 0a 20 20 20 20 2a 2a 20 20 20 20 20   any.    **     
37640 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
37650 75 73 65 64 20 62 79 20 74 68 65 73 65 20 63 65  used by these ce
37660 6c 6c 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20  lls may need to 
37670 62 65 20 75 70 64 61 74 65 64 0a 20 20 20 20 2a  be updated.    *
37680 2a 20 20 20 20 20 20 28 69 6e 74 65 72 6e 61 6c  *      (internal
37690 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73 20 6e 65   intkey nodes ne
376a0 76 65 72 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e  ver contain poin
376b0 74 65 72 73 20 74 6f 20 6f 76 65 72 66 6c 6f 77  ters to overflow
376c0 20 70 61 67 65 73 29 2e 0a 20 20 20 20 2a 2a 0a   pages)..    **.
376d0 20 20 20 20 2a 2a 20 20 20 35 29 20 49 66 20 74      **   5) If t
376e0 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  he sibling pages
376f0 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c   are not leaves,
37700 20 74 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65   then the pointe
37710 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 20 20 20  r-map.    **    
37720 20 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68    entries for th
37730 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 61  e right-child pa
37740 67 65 73 20 6f 66 20 65 61 63 68 20 73 69 62 6c  ges of each sibl
37750 69 6e 67 20 6d 61 79 20 6e 65 65 64 0a 20 20 20  ing may need.   
37760 20 2a 2a 20 20 20 20 20 20 74 6f 20 62 65 20 75   **      to be u
37770 70 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  pdated..    **. 
37780 20 20 20 2a 2a 20 43 61 73 65 73 20 31 20 61 6e     ** Cases 1 an
37790 64 20 32 20 61 72 65 20 64 65 61 6c 74 20 77 69  d 2 are dealt wi
377a0 74 68 20 61 62 6f 76 65 20 62 79 20 6f 74 68 65  th above by othe
377b0 72 20 63 6f 64 65 2e 20 54 68 65 20 6e 65 78 74  r code. The next
377c0 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 64 65  .    ** block de
377d0 61 6c 73 20 77 69 74 68 20 63 61 73 65 73 20 33  als with cases 3
377e0 20 61 6e 64 20 34 20 61 6e 64 20 74 68 65 20 6f   and 4 and the o
377f0 6e 65 20 61 66 74 65 72 20 74 68 61 74 2c 20 63  ne after that, c
37800 61 73 65 20 35 2e 20 53 69 6e 63 65 0a 20 20 20  ase 5. Since.   
37810 20 2a 2a 20 73 65 74 74 69 6e 67 20 61 20 70 6f   ** setting a po
37820 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
37830 69 73 20 61 20 72 65 6c 61 74 69 76 65 6c 79 20  is a relatively 
37840 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74  expensive operat
37850 69 6f 6e 2c 20 74 68 69 73 0a 20 20 20 20 2a 2a  ion, this.    **
37860 20 63 6f 64 65 20 6f 6e 6c 79 20 73 65 74 73 20   code only sets 
37870 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
37880 69 65 73 20 66 6f 72 20 63 68 69 6c 64 20 6f 72  ies for child or
37890 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
378a0 74 68 61 74 20 68 61 76 65 0a 20 20 20 20 2a 2a  that have.    **
378b0 20 61 63 74 75 61 6c 6c 79 20 6d 6f 76 65 64 20   actually moved 
378c0 62 65 74 77 65 65 6e 20 70 61 67 65 73 2e 20 20  between pages.  
378d0 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
378e0 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 30 5d 3b  pNew = apNew[0];
378f0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
37900 6c 64 20 3d 20 61 70 43 6f 70 79 5b 30 5d 3b 0a  ld = apCopy[0];.
37910 20 20 20 20 69 6e 74 20 6e 4f 76 65 72 66 6c 6f      int nOverflo
37920 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  w = pOld->nOverf
37930 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69 4e 65  low;.    int iNe
37940 78 74 4f 6c 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43  xtOld = pOld->nC
37950 65 6c 6c 20 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b  ell + nOverflow;
37960 0a 20 20 20 20 69 6e 74 20 69 4f 76 65 72 66 6c  .    int iOverfl
37970 6f 77 20 3d 20 28 6e 4f 76 65 72 66 6c 6f 77 20  ow = (nOverflow 
37980 3f 20 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c 5b 30  ? pOld->aiOvfl[0
37990 5d 20 3a 20 2d 31 29 3b 0a 20 20 20 20 6a 20 3d  ] : -1);.    j =
379a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
379b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
379c0 2f 2a 20 43 75 72 72 65 6e 74 20 27 6f 6c 64 27  /* Current 'old'
379d0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f   sibling page */
379e0 0a 20 20 20 20 6b 20 3d 20 30 3b 20 20 20 20 20  .    k = 0;     
379f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a00 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
37a10 6e 74 20 27 6e 65 77 27 20 73 69 62 6c 69 6e 67  nt 'new' sibling
37a20 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 66 6f 72   page */.    for
37a30 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
37a40 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ++){.      int i
37a50 73 44 69 76 69 64 65 72 20 3d 20 30 3b 0a 20 20  sDivider = 0;.  
37a60 20 20 20 20 77 68 69 6c 65 28 20 69 3d 3d 69 4e      while( i==iN
37a70 65 78 74 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  extOld ){.      
37a80 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20 74    /* Cell i is t
37a90 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74  he cell immediat
37aa0 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ely following th
37ab0 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6f  e last cell on o
37ac0 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69  ld.        ** si
37ad0 62 6c 69 6e 67 20 70 61 67 65 20 6a 2e 20 49 66  bling page j. If
37ae0 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
37af0 65 20 6e 6f 74 20 6c 65 61 66 20 70 61 67 65 73  e not leaf pages
37b00 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 20 20 2a   of an.        *
37b10 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c  * intkey b-tree,
37b20 20 74 68 65 6e 20 63 65 6c 6c 20 69 20 77 61 73   then cell i was
37b30 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e   a divider cell.
37b40 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
37b50 72 74 28 20 6a 2b 31 20 3c 20 41 72 72 61 79 53  rt( j+1 < ArrayS
37b60 69 7a 65 28 61 70 43 6f 70 79 29 20 29 3b 0a 20  ize(apCopy) );. 
37b70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a         assert( j
37b80 2b 31 20 3c 20 6e 4f 6c 64 20 29 3b 0a 20 20 20  +1 < nOld );.   
37b90 20 20 20 20 20 70 4f 6c 64 20 3d 20 61 70 43 6f       pOld = apCo
37ba0 70 79 5b 2b 2b 6a 5d 3b 0a 20 20 20 20 20 20 20  py[++j];.       
37bb0 20 69 4e 65 78 74 4f 6c 64 20 3d 20 69 20 2b 20   iNextOld = i + 
37bc0 21 6c 65 61 66 44 61 74 61 20 2b 20 70 4f 6c 64  !leafData + pOld
37bd0 2d 3e 6e 43 65 6c 6c 20 2b 20 70 4f 6c 64 2d 3e  ->nCell + pOld->
37be0 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20  nOverflow;.     
37bf0 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76     if( pOld->nOv
37c00 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
37c10 20 20 20 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20      nOverflow = 
37c20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
37c30 0a 20 20 20 20 20 20 20 20 20 20 69 4f 76 65 72  .          iOver
37c40 66 6c 6f 77 20 3d 20 69 20 2b 20 21 6c 65 61 66  flow = i + !leaf
37c50 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 61 69 4f  Data + pOld->aiO
37c60 76 66 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  vfl[0];.        
37c70 7d 0a 20 20 20 20 20 20 20 20 69 73 44 69 76 69  }.        isDivi
37c80 64 65 72 20 3d 20 21 6c 65 61 66 44 61 74 61 3b  der = !leafData;
37c90 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20    .      }..    
37ca0 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c    assert(nOverfl
37cb0 6f 77 3e 30 20 7c 7c 20 69 4f 76 65 72 66 6c 6f  ow>0 || iOverflo
37cc0 77 3c 69 20 29 3b 0a 20 20 20 20 20 20 61 73 73  w<i );.      ass
37cd0 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 32 20  ert(nOverflow<2 
37ce0 7c 7c 20 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c 5b  || pOld->aiOvfl[
37cf0 30 5d 3d 3d 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c  0]==pOld->aiOvfl
37d00 5b 31 5d 2d 31 29 3b 0a 20 20 20 20 20 20 61 73  [1]-1);.      as
37d10 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 33  sert(nOverflow<3
37d20 20 7c 7c 20 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c   || pOld->aiOvfl
37d30 5b 31 5d 3d 3d 70 4f 6c 64 2d 3e 61 69 4f 76 66  [1]==pOld->aiOvf
37d40 6c 5b 32 5d 2d 31 29 3b 0a 20 20 20 20 20 20 69  l[2]-1);.      i
37d50 66 28 20 69 3d 3d 69 4f 76 65 72 66 6c 6f 77 20  f( i==iOverflow 
37d60 29 7b 0a 20 20 20 20 20 20 20 20 69 73 44 69 76  ){.        isDiv
37d70 69 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20  ider = 1;.      
37d80 20 20 69 66 28 20 28 2d 2d 6e 4f 76 65 72 66 6c    if( (--nOverfl
37d90 6f 77 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ow)>0 ){.       
37da0 20 20 20 69 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a     iOverflow++;.
37db0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37dc0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d  }..      if( i==
37dd0 63 6e 74 4e 65 77 5b 6b 5d 20 29 7b 0a 20 20 20  cntNew[k] ){.   
37de0 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69       /* Cell i i
37df0 73 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64  s the cell immed
37e00 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
37e10 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f   the last cell o
37e20 6e 20 6e 65 77 0a 20 20 20 20 20 20 20 20 2a 2a  n new.        **
37e30 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6b 2e   sibling page k.
37e40 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73   If the siblings
37e50 20 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61   are not leaf pa
37e60 67 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20  ges of an.      
37e70 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72    ** intkey b-tr
37e80 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20  ee, then cell i 
37e90 69 73 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  is a divider cel
37ea0 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  l.  */.        p
37eb0 4e 65 77 20 3d 20 61 70 4e 65 77 5b 2b 2b 6b 5d  New = apNew[++k]
37ec0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6c  ;.        if( !l
37ed0 65 61 66 44 61 74 61 20 29 20 63 6f 6e 74 69 6e  eafData ) contin
37ee0 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
37ef0 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4f 6c 64    assert( j<nOld
37f00 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
37f10 28 20 6b 3c 6e 4e 65 77 20 29 3b 0a 0a 20 20 20  ( k<nNew );..   
37f20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c     /* If the cel
37f30 6c 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79  l was originally
37f40 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 28 61   divider cell (a
37f50 6e 64 20 69 73 20 6e 6f 74 20 6e 6f 77 29 20 6f  nd is not now) o
37f60 72 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 6f 76  r.      ** an ov
37f70 65 72 66 6c 6f 77 20 63 65 6c 6c 2c 20 6f 72 20  erflow cell, or 
37f80 69 66 20 74 68 65 20 63 65 6c 6c 20 77 61 73 20  if the cell was 
37f90 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 64 69 66  located on a dif
37fa0 66 65 72 65 6e 74 20 73 69 62 6c 69 6e 67 0a 20  ferent sibling. 
37fb0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 62 65 66       ** page bef
37fc0 6f 72 65 20 74 68 65 20 62 61 6c 61 6e 63 69 6e  ore the balancin
37fd0 67 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 69 6e  g, then the poin
37fe0 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20  ter map entries 
37ff0 61 73 73 6f 63 69 61 74 65 64 0a 20 20 20 20 20  associated.     
38000 20 2a 2a 20 77 69 74 68 20 61 6e 79 20 63 68 69   ** with any chi
38010 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70  ld or overflow p
38020 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ages need to be 
38030 75 70 64 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20  updated.  */.   
38040 20 20 20 69 66 28 20 69 73 44 69 76 69 64 65 72     if( isDivider
38050 20 7c 7c 20 70 4f 6c 64 2d 3e 70 67 6e 6f 21 3d   || pOld->pgno!=
38060 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20  pNew->pgno ){.  
38070 20 20 20 20 20 20 69 66 28 20 21 6c 65 61 66 43        if( !leafC
38080 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20  orrection ){.   
38090 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
380a0 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 61  (pBt, get4byte(a
380b0 70 43 65 6c 6c 5b 69 5d 29 2c 20 50 54 52 4d 41  pCell[i]), PTRMA
380c0 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70  P_BTREE, pNew->p
380d0 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  gno, &rc);.     
380e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
380f0 20 73 7a 43 65 6c 6c 5b 69 5d 3e 70 4e 65 77 2d   szCell[i]>pNew-
38100 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >minLocal ){.   
38110 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
38120 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c 20 61 70  OvflPtr(pNew, ap
38130 43 65 6c 6c 5b 69 5d 2c 20 26 72 63 29 3b 0a 20  Cell[i], &rc);. 
38140 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
38150 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
38160 21 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20  !leafCorrection 
38170 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
38180 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a  ; i<nNew; i++){.
38190 20 20 20 20 20 20 20 20 75 33 32 20 6b 65 79 20          u32 key 
381a0 3d 20 67 65 74 34 62 79 74 65 28 26 61 70 4e 65  = get4byte(&apNe
381b0 77 5b 69 5d 2d 3e 61 44 61 74 61 5b 38 5d 29 3b  w[i]->aData[8]);
381c0 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50  .        ptrmapP
381d0 75 74 28 70 42 74 2c 20 6b 65 79 2c 20 50 54 52  ut(pBt, key, PTR
381e0 4d 41 50 5f 42 54 52 45 45 2c 20 61 70 4e 65 77  MAP_BTREE, apNew
381f0 5b 69 5d 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b  [i]->pgno, &rc);
38200 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
38210 23 69 66 20 30 0a 20 20 20 20 2f 2a 20 54 68 65  #if 0.    /* The
38220 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65   ptrmapCheckPage
38230 73 28 29 20 63 6f 6e 74 61 69 6e 73 20 61 73 73  s() contains ass
38240 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
38250 20 74 68 61 74 20 76 65 72 69 66 79 20 74 68 61   that verify tha
38260 74 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 70 6f 69  t.    ** all poi
38270 6e 74 65 72 20 6d 61 70 20 70 61 67 65 73 20 61  nter map pages a
38280 72 65 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79  re set correctly
38290 2e 20 54 68 69 73 20 69 73 20 68 65 6c 70 66 75  . This is helpfu
382a0 6c 20 77 68 69 6c 65 20 0a 20 20 20 20 2a 2a 20  l while .    ** 
382b0 64 65 62 75 67 67 69 6e 67 2e 20 54 68 69 73 20  debugging. This 
382c0 69 73 20 75 73 75 61 6c 6c 79 20 64 69 73 61 62  is usually disab
382d0 6c 65 64 20 62 65 63 61 75 73 65 20 61 20 63 6f  led because a co
382e0 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 6d  rrupt database m
382f0 61 79 0a 20 20 20 20 2a 2a 20 63 61 75 73 65 20  ay.    ** cause 
38300 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
38310 65 6d 65 6e 74 20 74 6f 20 66 61 69 6c 2e 20 20  ement to fail.  
38320 2a 2f 0a 20 20 20 20 70 74 72 6d 61 70 43 68 65  */.    ptrmapChe
38330 63 6b 50 61 67 65 73 28 61 70 4e 65 77 2c 20 6e  ckPages(apNew, n
38340 4e 65 77 29 3b 0a 20 20 20 20 70 74 72 6d 61 70  New);.    ptrmap
38350 43 68 65 63 6b 50 61 67 65 73 28 26 70 50 61 72  CheckPages(&pPar
38360 65 6e 74 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a  ent, 1);.#endif.
38370 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
38380 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29  Parent->isInit )
38390 3b 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  ;.  TRACE(("BALA
383a0 4e 43 45 3a 20 66 69 6e 69 73 68 65 64 3a 20 6f  NCE: finished: o
383b0 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c  ld=%d new=%d cel
383c0 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ls=%d\n",.      
383d0 20 20 20 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20      nOld, nNew, 
383e0 6e 43 65 6c 6c 29 29 3b 0a 0a 20 20 2f 2a 0a 20  nCell));..  /*. 
383f0 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62 65 66 6f   ** Cleanup befo
38400 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20  re returning..  
38410 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  */.balance_clean
38420 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 53 63 72  up:.  sqlite3Scr
38430 61 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29  atchFree(apCell)
38440 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
38450 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  Old; i++){.    r
38460 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64  eleasePage(apOld
38470 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  [i]);.  }.  for(
38480 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<