/ Hex Artifact Content
Login

Artifact 7d780ca1211169b7b705a54f666d9c58a75d8e2f:


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 23 69 66 20 64 65 66  enable){.#if def
0b30: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
0b40: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
0b50: 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65 66  TE_TEST) && !def
0b60: 69 6e 65 64 28 54 48 33 5f 43 4f 4d 50 41 54 49  ined(TH3_COMPATI
0b70: 42 49 4c 49 54 59 29 0a 20 20 2f 2a 20 45 6e 61  BILITY).  /* Ena
0b80: 62 6c 65 20 67 6c 6f 62 61 6c 20 73 68 61 72 65  ble global share
0b90: 64 20 63 61 63 68 65 20 66 75 6e 63 74 69 6f 6e  d cache function
0ba0: 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 61   for debugging a
0bb0: 6e 64 20 75 6e 69 74 20 74 65 73 74 73 2c 20 0a  nd unit tests, .
0bc0: 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 66 6f 72    ** but not for
0bd0: 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 72 65   release */.  re
0be0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
0bf0: 53 45 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69  SE;.#else.  sqli
0c00: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0c10: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0c20: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0c30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0c40: 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69 66  .#endif.}.#endif
0c50: 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ....#ifdef SQLIT
0c60: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0c70: 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  CHE.  /*.  ** Th
0c80: 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65 72  e functions quer
0c90: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
0ca0: 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61 72  eLock(), setShar
0cb0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0cc0: 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c 65  (),.  ** and cle
0cd0: 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
0ce0: 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20 2a  TableLocks().  *
0cf0: 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e 74  * manipulate ent
0d00: 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53 68  ries in the BtSh
0d10: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b 65  ared.pLock linke
0d20: 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20 73  d list used to s
0d30: 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65 64  tore.  ** shared
0d40: 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65 76  -cache table lev
0d50: 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68 65  el locks. If the
0d60: 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70   library is comp
0d70: 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  iled with the.  
0d80: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0d90: 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65 64  feature disabled
0da0: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
0db0: 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75 73  only ever one us
0dc0: 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68 20  er.  ** of each 
0dd0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
0de0: 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20 6c  re and so this l
0df0: 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65  ocking is not ne
0e00: 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20 53  cessary. .  ** S
0e10: 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f 63  o define the loc
0e20: 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69  k related functi
0e30: 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a 20  ons as no-ops.. 
0e40: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71 75   */.  #define qu
0e50: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
0e60: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53  bleLock(a,b,c) S
0e70: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
0e80: 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63 68  ne setSharedCach
0e90: 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63  eTableLock(a,b,c
0ea0: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
0eb0: 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53 68  efine clearAllSh
0ec0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0ed0: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0ee0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
0ef0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0f00: 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65 20  ks(a).  #define 
0f10: 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
0f20: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64 29  bleLock(a,b,c,d)
0f30: 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61 73   1.  #define has
0f40: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61 2c  ReadConflicts(a,
0f50: 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69   b) 0.#endif..#i
0f60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0f70: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a  T_SHARED_CACHE..
0f80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
0f90: 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73  BUG./*.**** This
0fa0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
0fb0: 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
0fc0: 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74  f an assert() st
0fd0: 61 74 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a  atement. ***.**.
0fe0: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
0ff0: 69 66 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20  if pBtree holds 
1000: 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63  the required loc
1010: 6b 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ks to read or wr
1020: 69 74 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74  ite to the .** t
1030: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70  able with root p
1040: 61 67 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74  age iRoot.   Ret
1050: 75 72 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73  urn 1 if it does
1060: 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a   and 0 if not..*
1070: 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
1080: 2c 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74  , when writing t
1090: 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 72  o a table with r
10a0: 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76  oot-page iRoot v
10b0: 69 61 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e  ia .** Btree con
10c0: 6e 65 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a  nection pBtree:.
10d0: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
10e0: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
10f0: 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c  ableLock(pBtree,
1100: 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45   iRoot, 0, WRITE
1110: 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20  _LOCK) );.**.** 
1120: 57 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  When writing to 
1130: 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 72 65  an index that re
1140: 73 69 64 65 73 20 69 6e 20 61 20 73 68 61 72 61  sides in a shara
1150: 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ble database, th
1160: 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f  e .** caller sho
1170: 75 6c 64 20 68 61 76 65 20 66 69 72 73 74 20 6f  uld have first o
1180: 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73  btained a lock s
1190: 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f  pecifying the ro
11a0: 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68  ot page of.** th
11b0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
11c0: 74 61 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65  table. This make
11d0: 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d  s things a bit m
11e0: 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c  ore complicated,
11f0: 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75  .** as this modu
1200: 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20 74  le treats each t
1210: 61 62 6c 65 20 61 73 20 61 20 73 65 70 61 72 61  able as a separa
1220: 74 65 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f  te structure. To
1230: 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68   determine.** th
1240: 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f  e table correspo
1250: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64  nding to the ind
1260: 65 78 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  ex being written
1270: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
1280: 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63 68  on has to search
1290: 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61 74   through the dat
12a0: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a  abase schema..**
12b0: 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61  .** Instead of a
12c0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62   lock on the tab
12d0: 6c 65 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20  le/index rooted 
12e0: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74  at page iRoot, t
12f0: 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a  he caller may.**
1300: 20 68 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f   hold a write-lo
1310: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1320: 20 74 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67   table (root pag
1330: 65 20 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c  e 1). This is al
1340: 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65  so.** acceptable
1350: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1360: 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
1370: 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65  bleLock(.  Btree
1380: 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20   *pBtree,       
1390: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74    /* Handle that
13a0: 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20   must hold lock 
13b0: 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c  */.  Pgno iRoot,
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
13d0: 6f 6f 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72  oot page of b-tr
13e0: 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e  ee */.  int isIn
13f0: 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f  dex,           /
1400: 2a 20 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20  * True if iRoot 
1410: 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61  is the root of a
1420: 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a  n index b-tree *
1430: 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70  /.  int eLockTyp
1440: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  e          /* Re
1450: 71 75 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65  quired lock type
1460: 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57   (READ_LOCK or W
1470: 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b  RITE_LOCK) */.){
1480: 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65  .  Schema *pSche
1490: 6d 61 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70  ma = (Schema *)p
14a0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68  Btree->pBt->pSch
14b0: 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62  ema;.  Pgno iTab
14c0: 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a   = 0;.  BtLock *
14d0: 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20  pLock;..  /* If 
14e0: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69 73  this database is
14f0: 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20   not shareable, 
1500: 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74  or if the client
1510: 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a   is reading.  **
1520: 20 61 6e 64 20 68 61 73 20 74 68 65 20 72 65 61   and has the rea
1530: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
1540: 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20  ag set, then no 
1550: 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65 64  lock is required
1560: 2e 20 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  . .  ** Return t
1570: 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  rue immediately.
1580: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74  .  */.  if( (pBt
1590: 72 65 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30  ree->sharable==0
15a0: 29 0a 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79  ).   || (eLockTy
15b0: 70 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26  pe==READ_LOCK &&
15c0: 20 28 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c   (pBtree->db->fl
15d0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
15e0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 29 0a 20  dUncommitted)). 
15f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1600: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
1610: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1620: 64 69 6e 67 20 20 6f 72 20 77 72 69 74 69 6e 67  ding  or writing
1630: 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 74 68   an index and th
1640: 65 20 73 63 68 65 6d 61 20 69 73 0a 20 20 2a 2a  e schema is.  **
1650: 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68 65   not loaded, the
1660: 6e 20 69 74 20 69 73 20 74 6f 6f 20 64 69 66 66  n it is too diff
1670: 69 63 75 6c 74 20 74 6f 20 61 63 74 75 61 6c 6c  icult to actuall
1680: 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  y check to see i
1690: 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 72 72 65  f.  ** the corre
16a0: 63 74 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c  ct locks are hel
16b0: 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 62 6f  d.  So do not bo
16c0: 74 68 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  ther - just retu
16d0: 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a 20 54 68  rn true..  ** Th
16e0: 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f 74  is case does not
16f0: 20 63 6f 6d 65 20 75 70 20 76 65 72 79 20 6f 66   come up very of
1700: 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f  ten anyhow..  */
1710: 0a 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 26  .  if( isIndex &
1720: 26 20 28 21 70 53 63 68 65 6d 61 20 7c 7c 20 28  & (!pSchema || (
1730: 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 46  pSchema->schemaF
1740: 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61 4c 6f  lags&DB_SchemaLo
1750: 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20 20 20  aded)==0) ){.   
1760: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1770: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
1780: 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 74 68  the root-page th
1790: 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68 6f 75  at the lock shou
17a0: 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e 20 46  ld be held on. F
17b0: 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 62 2d  or table.  ** b-
17c0: 74 72 65 65 73 2c 20 74 68 69 73 20 69 73 20 6a  trees, this is j
17d0: 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67  ust the root pag
17e0: 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  e of the b-tree 
17f0: 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a 20 20  being read or.  
1800: 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f 72 20  ** written. For 
1810: 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c 20 69  index b-trees, i
1820: 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61  t is the root pa
1830: 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f 63 69  ge of the associ
1840: 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c 65 2e  ated.  ** table.
1850: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49 6e 64    */.  if( isInd
1860: 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68 45 6c  ex ){.    HashEl
1870: 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70  em *p;.    for(p
1880: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
1890: 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  (&pSchema->idxHa
18a0: 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65  sh); p; p=sqlite
18b0: 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20 20  HashNext(p)){.  
18c0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
18d0: 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c 69 74  = (Index *)sqlit
18e0: 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20  eHashData(p);.  
18f0: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e      if( pIdx->tn
1900: 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74 20 29  um==(int)iRoot )
1910: 7b 0a 20 20 20 20 20 20 20 20 69 54 61 62 20 3d  {.        iTab =
1920: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 74   pIdx->pTable->t
1930: 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  num;.      }.   
1940: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1950: 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20 20  iTab = iRoot;.  
1960: 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66  }..  /* Search f
1970: 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64 20  or the required 
1980: 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20 77  lock. Either a w
1990: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f 6f  rite-lock on roo
19a0: 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20 0a  t-page iTab, a .
19b0: 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b 20    ** write-lock 
19c0: 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74 61  on the schema ta
19d0: 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65 20  ble, or (if the 
19e0: 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e  client is readin
19f0: 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d 6c  g) a.  ** read-l
1a00: 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c 6c  ock on iTab will
1a10: 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72 6e   suffice. Return
1a20: 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65   1 if any of the
1a30: 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20 2a  se are found.  *
1a40: 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42  /.  for(pLock=pB
1a50: 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63 6b  tree->pBt->pLock
1a60: 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70  ; pLock; pLock=p
1a70: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Lock->pNext){.  
1a80: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74    if( pLock->pBt
1a90: 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20 20  ree==pBtree .   
1aa0: 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54 61    && (pLock->iTa
1ab0: 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70 4c  ble==iTab || (pL
1ac0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54  ock->eLock==WRIT
1ad0: 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b 2d  E_LOCK && pLock-
1ae0: 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20 20  >iTable==1)).   
1af0: 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63    && pLock->eLoc
1b00: 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20 20  k>=eLockType .  
1b10: 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
1b20: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n 1;.    }.  }..
1b30: 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 66    /* Failed to f
1b40: 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65 64  ind the required
1b50: 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74 75   lock. */.  retu
1b60: 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 0;.}.#endif /
1b70: 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  * SQLITE_DEBUG *
1b80: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
1b90: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54  _DEBUG./*.**** T
1ba0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
1bb0: 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72 74   be used as part
1bc0: 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61   of assert() sta
1bd0: 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a 2a  tements only. **
1be0: 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  **.**.** Return 
1bf0: 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c 64  true if it would
1c00: 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20   be illegal for 
1c10: 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20  pBtree to write 
1c20: 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62 6c  into the.** tabl
1c30: 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74 65  e or index roote
1c40: 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61 75  d at iRoot becau
1c50: 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64 20  se other shared 
1c60: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 0a  connections are.
1c70: 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c  ** simultaneousl
1c80: 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20 73  y reading that s
1c90: 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  ame table or ind
1ca0: 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  ex..**.** It is 
1cb0: 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74 72  illegal for pBtr
1cc0: 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20 73  ee to write if s
1cd0: 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  ome other Btree 
1ce0: 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 73  object that.** s
1cf0: 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20 42  hares the same B
1d00: 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 69  tShared object i
1d10: 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64  s currently read
1d20: 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a 2a  ing or writing.*
1d30: 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62 6c  * the iRoot tabl
1d40: 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20 74  e.  Except, if t
1d50: 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f  he other Btree o
1d60: 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a 2a  bject has the.**
1d70: 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65   read-uncommitte
1d80: 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65 6e  d flag set, then
1d90: 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68   it is OK for th
1da0: 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20 74  e other object t
1db0: 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61 64  o.** have a read
1dc0: 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 46   cursor..**.** F
1dd0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66 6f  or example, befo
1de0: 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  re writing to an
1df0: 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74 61  y part of the ta
1e00: 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a 20  ble or index.** 
1e10: 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 69  rooted at page i
1e20: 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c 64  Root, one should
1e30: 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   call:.**.**    
1e40: 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61 64  assert( !hasRead
1e50: 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65 65  Conflicts(pBtree
1e60: 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a 73  , iRoot) );.*/.s
1e70: 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65 61  tatic int hasRea
1e80: 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65 65  dConflicts(Btree
1e90: 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20 69   *pBtree, Pgno i
1ea0: 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  Root){.  BtCurso
1eb0: 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 42  r *p;.  for(p=pB
1ec0: 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73  tree->pBt->pCurs
1ed0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
1ee0: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  t){.    if( p->p
1ef0: 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20 0a  gnoRoot==iRoot .
1f00: 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72 65       && p->pBtre
1f10: 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20 26  e!=pBtree.     &
1f20: 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65 2d  & 0==(p->pBtree-
1f30: 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
1f40: 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74  ITE_ReadUncommit
1f50: 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ted).    ){.    
1f60: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1f70: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
1f80: 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a  ;.}.#endif    /*
1f90: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44   #ifdef SQLITE_D
1fa0: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51  EBUG */../*.** Q
1fb0: 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 42  uery to see if B
1fc0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61  tree handle p ma
1fd0: 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  y obtain a lock 
1fe0: 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a  of type eLock .*
1ff0: 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  * (READ_LOCK or 
2000: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74  WRITE_LOCK) on t
2010: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
2020: 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65  ot-page iTab. Re
2030: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
2040: 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61  K if the lock ma
2050: 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62  y be obtained (b
2060: 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74  y calling.** set
2070: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2080: 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49  Lock()), or SQLI
2090: 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74  TE_LOCKED if not
20a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20b0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
20c0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
20d0: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75  *p, Pgno iTab, u
20e0: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
20f0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
2100: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49  Bt;.  BtLock *pI
2110: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2120: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2130: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2140: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
2150: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
2160: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2170: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
2180: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2190: 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53  !(p->db->flags&S
21a0: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
21b0: 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d 57  itted)||eLock==W
21c0: 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62 3d  RITE_LOCK||iTab=
21d0: 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66  =1 );.  .  /* If
21e0: 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77 72   requesting a wr
21f0: 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74  ite-lock, then t
2200: 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68 61  he Btree must ha
2210: 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  ve an open write
2220: 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
2230: 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e 20  n on this file. 
2240: 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20  And, obviously, 
2250: 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20 73  for this to be s
2260: 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75  o there .  ** mu
2270: 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77 72  st be an open wr
2280: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2290: 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73 65  on the file itse
22a0: 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  lf..  */.  asser
22b0: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
22c0: 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e  OCK || (p==pBt->
22d0: 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69 6e  pWriter && p->in
22e0: 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
22f0: 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  TE) );.  assert(
2300: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
2310: 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e  K || pBt->inTran
2320: 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
2330: 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  RITE );.  .  /* 
2340: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2350: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 73  a no-op if the s
2360: 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20 6e  hared-cache is n
2370: 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  ot enabled */.  
2380: 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65  if( !p->sharable
2390: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
23a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
23b0: 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68 65   /* If some othe
23c0: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  r connection is 
23d0: 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c 75  holding an exclu
23e0: 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20  sive lock, the. 
23f0: 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c 6f   ** requested lo
2400: 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62  ck may not be ob
2410: 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  tained..  */.  i
2420: 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 21  f( pBt->pWriter!
2430: 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  =p && (pBt->btsF
2440: 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c 55  lags & BTS_EXCLU
2450: 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  SIVE)!=0 ){.    
2460: 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
2470: 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20  nBlocked(p->db, 
2480: 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62  pBt->pWriter->db
2490: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
24a0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
24b0: 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20  EDCACHE;.  }..  
24c0: 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
24d0: 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
24e0: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
24f0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e  {.    /* The con
2500: 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e 65  dition (pIter->e
2510: 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e 20  Lock!=eLock) in 
2520: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 66  the following if
2530: 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73 74  (...) .    ** st
2540: 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69 6d  atement is a sim
2550: 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a 0a  plification of:.
2560: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
2570: 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  (eLock==WRITE_LO
2580: 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f  CK || pIter->eLo
2590: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29 0a  ck==WRITE_LOCK).
25a0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 69      **.    ** si
25b0: 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  nce we know that
25c0: 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   if eLock==WRITE
25d0: 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f  _LOCK, then no o
25e0: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  ther connection.
25f0: 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20      ** may hold 
2600: 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20  a WRITE_LOCK on 
2610: 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68 69  any table in thi
2620: 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74 68  s file (since th
2630: 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f  ere can.    ** o
2640: 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65 20  nly be a single 
2650: 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f 0a  writer)..    */.
2660: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
2670: 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  r->eLock==READ_L
2680: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
2690: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
26a0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  );.    assert( e
26b0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20  Lock==READ_LOCK 
26c0: 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  || pIter->pBtree
26d0: 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  ==p || pIter->eL
26e0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b  ock==READ_LOCK);
26f0: 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
2700: 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49 74  pBtree!=p && pIt
2710: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
2720: 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   && pIter->eLock
2730: 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  !=eLock ){.     
2740: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2750: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2760: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e   pIter->pBtree->
2770: 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  db);.      if( e
2780: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2790: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
27a0: 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69  rt( p==pBt->pWri
27b0: 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ter );.        p
27c0: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
27d0: 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 20  BTS_PENDING;.   
27e0: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
27f0: 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f  n SQLITE_LOCKED_
2800: 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20  SHAREDCACHE;.   
2810: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2820: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
2830: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
2840: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
2850: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
2860: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
2870: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20  CACHE./*.** Add 
2880: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  a lock on the ta
2890: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
28a0: 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68 65  ge iTable to the
28b0: 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75 73   shared-btree us
28c0: 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20 68  ed.** by Btree h
28d0: 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65 74  andle p. Paramet
28e0: 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65  er eLock must be
28f0: 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f 43   either READ_LOC
2900: 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c  K or .** WRITE_L
2910: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  OCK..**.** This 
2920: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
2930: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
2940: 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65 20  **.**   (a) The 
2950: 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65 20  specified Btree 
2960: 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e 6e  object p is conn
2970: 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72 61  ected to a shara
2980: 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74  ble.**       dat
2990: 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68 20  abase (one with 
29a0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68 61  the BtShared.sha
29b0: 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29 2c  rable flag set),
29c0: 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29   and.**.**   (b)
29d0: 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65 20   No other Btree 
29e0: 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20 6c  objects hold a l
29f0: 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69 63  ock that conflic
2a00: 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74 68  ts.**       with
2a10: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
2a20: 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79 53  ock (i.e. queryS
2a30: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
2a40: 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20 20  ock() has.**    
2a50: 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20     already been 
2a60: 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75 72  called and retur
2a70: 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a  ned SQLITE_OK)..
2a80: 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
2a90: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
2aa0: 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65 64  he lock is added
2ab0: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53   successfully. S
2ac0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20  QLITE_NOMEM .** 
2ad0: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61  is returned if a
2ae0: 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20   malloc attempt 
2af0: 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
2b00: 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43 61   int setSharedCa
2b10: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72  cheTableLock(Btr
2b20: 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62  ee *p, Pgno iTab
2b30: 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20  le, u8 eLock){. 
2b40: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2b50: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63   p->pBt;.  BtLoc
2b60: 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20  k *pLock = 0;.  
2b70: 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a  BtLock *pIter;..
2b80: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2b90: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
2ba0: 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
2bb0: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
2bc0: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  K || eLock==WRIT
2bd0: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  E_LOCK );.  asse
2be0: 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a  rt( p->db!=0 );.
2bf0: 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69  .  /* A connecti
2c00: 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61 64  on with the read
2c10: 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  -uncommitted fla
2c20: 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65 72  g set will never
2c30: 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74   try to.  ** obt
2c40: 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ain a read-lock 
2c50: 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  using this funct
2c60: 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65  ion. The only re
2c70: 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64  ad-lock obtained
2c80: 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65  .  ** by a conne
2c90: 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e  ction in read-un
2ca0: 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20 69  committed mode i
2cb0: 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  s on the sqlite_
2cc0: 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61 62  master .  ** tab
2cd0: 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f 63  le, and that loc
2ce0: 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e  k is obtained in
2cf0: 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73   BtreeBeginTrans
2d00: 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ().  */.  assert
2d10: 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61  ( 0==(p->db->fla
2d20: 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e  gs&SQLITE_ReadUn
2d30: 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65 4c  committed) || eL
2d40: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2d50: 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75  );..  /* This fu
2d60: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e  nction should on
2d70: 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  ly be called on 
2d80: 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72 65  a sharable b-tre
2d90: 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a 2a  e after it .  **
2da0: 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72 6d   has been determ
2db0: 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74 68  ined that no oth
2dc0: 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73 20  er b-tree holds 
2dd0: 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c 6f  a conflicting lo
2de0: 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ck.  */.  assert
2df0: 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 3b  ( p->sharable );
2e00: 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
2e10: 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72 65  E_OK==queryShare
2e20: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
2e30: 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63 6b  p, iTable, eLock
2e40: 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74  ) );..  /* First
2e50: 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73 74   search the list
2e60: 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67   for an existing
2e70: 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74 61   lock on this ta
2e80: 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49  ble. */.  for(pI
2e90: 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ter=pBt->pLock; 
2ea0: 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74  pIter; pIter=pIt
2eb0: 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
2ec0: 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62 6c  if( pIter->iTabl
2ed0: 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49 74  e==iTable && pIt
2ee0: 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  er->pBtree==p ){
2ef0: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70  .      pLock = p
2f00: 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65 61  Iter;.      brea
2f10: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
2f20: 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65 20  /* If the above 
2f30: 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20 66  search did not f
2f40: 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74 72  ind a BtLock str
2f50: 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67 20  uct associating 
2f60: 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69 74  Btree p.  ** wit
2f70: 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c 20  h table iTable, 
2f80: 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e 64  allocate one and
2f90: 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68   link it into th
2fa0: 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  e list..  */.  i
2fb0: 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20  f( !pLock ){.   
2fc0: 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63 6b   pLock = (BtLock
2fd0: 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
2fe0: 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c 6f  Zero(sizeof(BtLo
2ff0: 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ck));.    if( !p
3000: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 65  Lock ){.      re
3010: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
3020: 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f  M;.    }.    pLo
3030: 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61  ck->iTable = iTa
3040: 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  ble;.    pLock->
3050: 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20  pBtree = p;.    
3060: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70  pLock->pNext = p
3070: 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70  Bt->pLock;.    p
3080: 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63  Bt->pLock = pLoc
3090: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  k;.  }..  /* Set
30a0: 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63   the BtLock.eLoc
30b0: 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68  k variable to th
30c0: 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65  e maximum of the
30d0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20   current lock.  
30e0: 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75 65  ** and the reque
30f0: 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20  sted lock. This 
3100: 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69 74 65  means if a write
3110: 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64  -lock was alread
3120: 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20  y held.  ** and 
3130: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75  a read-lock requ
3140: 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20  ested, we don't 
3150: 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e  incorrectly down
3160: 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a  grade the lock..
3170: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57    */.  assert( W
3180: 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c  RITE_LOCK>READ_L
3190: 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f  OCK );.  if( eLo
31a0: 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20  ck>pLock->eLock 
31b0: 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c  ){.    pLock->eL
31c0: 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d  ock = eLock;.  }
31d0: 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
31e0: 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
31f0: 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  * !SQLITE_OMIT_S
3200: 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a  HARED_CACHE */..
3210: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3220: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
3230: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
3240: 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63  ll the table loc
3250: 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e  ks (locks obtain
3260: 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a  ed via calls to.
3270: 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72 65 64  ** the setShared
3280: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
3290: 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64   procedure) held
32a0: 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74   by Btree object
32b0: 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66   p..**.** This f
32c0: 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  unction assumes 
32d0: 74 68 61 74 20 42 74 72 65 65 20 70 20 68 61 73  that Btree p has
32e0: 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72   an open read or
32f0: 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73   write .** trans
3300: 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f  action. If it do
3310: 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65  es not, then the
3320: 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61   BTS_PENDING fla
3330: 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f  g.** may be inco
3340: 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e  rrectly cleared.
3350: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3360: 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61  clearAllSharedCa
3370: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74  cheTableLocks(Bt
3380: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
3390: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
33a0: 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70  t;.  BtLock **pp
33b0: 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f  Iter = &pBt->pLo
33c0: 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ck;..  assert( s
33d0: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
33e0: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
33f0: 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c  sert( p->sharabl
3400: 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20  e || 0==*ppIter 
3410: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
3420: 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20  inTrans>0 );..  
3430: 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29  while( *ppIter )
3440: 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c  {.    BtLock *pL
3450: 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20  ock = *ppIter;. 
3460: 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d     assert( (pBt-
3470: 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
3480: 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c 7c  EXCLUSIVE)==0 ||
3490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70   pBt->pWriter==p
34a0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a  Lock->pBtree );.
34b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
34c0: 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61  k->pBtree->inTra
34d0: 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  ns>=pLock->eLock
34e0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63   );.    if( pLoc
34f0: 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  k->pBtree==p ){.
3500: 20 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20        *ppIter = 
3510: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
3520: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
3530: 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20  k->iTable!=1 || 
3540: 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20  pLock==&p->lock 
3550: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  );.      if( pLo
3560: 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b  ck->iTable!=1 ){
3570: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3580: 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20  _free(pLock);.  
3590: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
35a0: 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20  .      ppIter = 
35b0: 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20  &pLock->pNext;. 
35c0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
35d0: 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  rt( (pBt->btsFla
35e0: 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47  gs & BTS_PENDING
35f0: 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72  )==0 || pBt->pWr
3600: 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70 42  iter );.  if( pB
3610: 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b  t->pWriter==p ){
3620: 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65  .    pBt->pWrite
3630: 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e  r = 0;.    pBt->
3640: 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  btsFlags &= ~(BT
3650: 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f  S_EXCLUSIVE|BTS_
3660: 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73  PENDING);.  }els
3670: 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e  e if( pBt->nTran
3680: 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20  saction==2 ){.  
3690: 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
36a0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
36b0: 6e 20 42 74 72 65 65 20 70 20 69 73 20 63 6f 6e  n Btree p is con
36c0: 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20  cluding its .   
36d0: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e   ** transaction.
36e0: 20 49 66 20 74 68 65 72 65 20 63 75 72 72 65 6e   If there curren
36f0: 74 6c 79 20 65 78 69 73 74 73 20 61 20 77 72 69  tly exists a wri
3700: 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f  ter, and p is no
3710: 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72  t.    ** that wr
3720: 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e  iter, then the n
3730: 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68  umber of locks h
3740: 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f  eld by connectio
3750: 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20  ns other.    ** 
3760: 74 68 61 6e 20 74 68 65 20 77 72 69 74 65 72 20  than the writer 
3770: 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f  must be about to
3780: 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49   drop to zero. I
3790: 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20 20 20  n this case.    
37a0: 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f 50  ** set the BTS_P
37b0: 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20 30  ENDING flag to 0
37c0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
37d0: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  If there is not 
37e0: 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74  currently a writ
37f0: 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45 4e  er, then BTS_PEN
3800: 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a 2a  DING must.    **
3810: 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79   be zero already
3820: 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c  . So this next l
3830: 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20  ine is harmless 
3840: 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20  in that case..  
3850: 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62 74    */.    pBt->bt
3860: 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 50  sFlags &= ~BTS_P
3870: 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ENDING;.  }.}../
3880: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3890: 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77  on changes all w
38a0: 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20  rite-locks held 
38b0: 62 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f 20  by Btree p into 
38c0: 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73  read-locks..*/.s
38d0: 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e 67  tatic void downg
38e0: 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63  radeAllSharedCac
38f0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72  heTableLocks(Btr
3900: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
3910: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
3920: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72  ;.  if( pBt->pWr
3930: 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42  iter==p ){.    B
3940: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20  tLock *pLock;.  
3950: 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d    pBt->pWriter =
3960: 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73   0;.    pBt->bts
3970: 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f 45  Flags &= ~(BTS_E
3980: 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45 4e  XCLUSIVE|BTS_PEN
3990: 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28 70  DING);.    for(p
39a0: 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Lock=pBt->pLock;
39b0: 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c   pLock; pLock=pL
39c0: 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ock->pNext){.   
39d0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
39e0: 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ->eLock==READ_LO
39f0: 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74  CK || pLock->pBt
3a00: 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20  ree==p );.      
3a10: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52  pLock->eLock = R
3a20: 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  EAD_LOCK;.    }.
3a30: 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a    }.}..#endif /*
3a40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
3a50: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74  RED_CACHE */..st
3a60: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
3a70: 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
3a80: 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77 61  Page);  /* Forwa
3a90: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
3aa0: 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20 72  ./*.***** This r
3ab0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 69  outine is used i
3ac0: 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28  nside of assert(
3ad0: 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a 2a  ) only ****.**.*
3ae0: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
3af0: 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20 74  e cursor holds t
3b00: 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74 73 20  he mutex on its 
3b10: 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66 64  BtShared.*/.#ifd
3b20: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
3b30: 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f  static int curso
3b40: 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43 75  rHoldsMutex(BtCu
3b50: 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  rsor *p){.  retu
3b60: 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  rn sqlite3_mutex
3b70: 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75  _held(p->pBt->mu
3b80: 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  tex);.}.#endif..
3b90: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
3ba0: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61   the overflow ca
3bb0: 63 68 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f  che of the curso
3bc0: 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
3bd0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
3be0: 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64  ** on the shared
3bf0: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
3c00: 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65   pBt..*/.#define
3c10: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
3c20: 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 20 28  lowCache(pCur) (
3c30: 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
3c40: 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  = ~BTCF_ValidOvf
3c50: 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69  l)../*.** Invali
3c60: 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  date the overflo
3c70: 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
3c80: 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72  e for all cursor
3c90: 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74  s opened.** on t
3ca0: 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20  he shared btree 
3cb0: 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a  structure pBt..*
3cc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
3cd0: 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
3ce0: 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61 72 65  lowCache(BtShare
3cf0: 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72  d *pBt){.  BtCur
3d00: 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  sor *p;.  assert
3d10: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
3d20: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
3d30: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
3d40: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
3d50: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
3d60: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
3d70: 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a  Cache(p);.  }.}.
3d80: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3d90: 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a  OMIT_INCRBLOB./*
3da0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3db0: 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f  n is called befo
3dc0: 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  re modifying the
3dd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 74   contents of a t
3de0: 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c  able.** to inval
3df0: 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c  idate any incrbl
3e00: 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  ob cursors that 
3e10: 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a  are open on the.
3e20: 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66  ** row or one of
3e30: 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e 67 20   the rows being 
3e40: 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  modified..**.** 
3e50: 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c  If argument isCl
3e60: 65 61 72 54 61 62 6c 65 20 69 73 20 74 72 75 65  earTable is true
3e70: 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72  , then the entir
3e80: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3e90: 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 61 62  e.** table is ab
3ea0: 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65  out to be delete
3eb0: 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
3ec0: 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 69  invalidate all i
3ed0: 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f  ncrblob.** curso
3ee0: 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72  rs open on any r
3ef0: 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20 74 61  ow within the ta
3f00: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
3f10: 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a  ge pgnoRoot..**.
3f20: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
3f30: 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61   argument isClea
3f40: 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73 65 2c  rTable is false,
3f50: 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 77 69   then the row wi
3f60: 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77  th.** rowid iRow
3f70: 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c 61 63   is being replac
3f80: 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49  ed or deleted. I
3f90: 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76 61  n this case inva
3fa0: 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74  lidate.** only t
3fb0: 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20 63 75  hose incrblob cu
3fc0: 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
3fd0: 61 74 20 73 70 65 63 69 66 69 63 20 72 6f 77 2e  at specific row.
3fe0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3ff0: 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c  invalidateIncrbl
4000: 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42 74 72  obCursors(.  Btr
4010: 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20  ee *pBtree,     
4020: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
4030: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68 65  base file to che
4040: 63 6b 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77  ck */.  i64 iRow
4050: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4060: 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74 68 61  /* The rowid tha
4070: 74 20 6d 69 67 68 74 20 62 65 20 63 68 61 6e 67  t might be chang
4080: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43  ing */.  int isC
4090: 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20 20 20  learTable       
40a0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c 6c 20   /* True if all 
40b0: 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67 20 64  rows are being d
40c0: 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42  eleted */.){.  B
40d0: 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74  tCursor *p;.  Bt
40e0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 42  Shared *pBt = pB
40f0: 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73  tree->pBt;.  ass
4100: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
4110: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72  eHoldsMutex(pBtr
4120: 65 65 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  ee) );.  for(p=p
4130: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
4140: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
4150: 20 69 66 28 20 28 70 2d 3e 63 75 72 46 6c 61 67   if( (p->curFlag
4160: 73 20 26 20 42 54 43 46 5f 49 6e 63 72 62 6c 6f  s & BTCF_Incrblo
4170: 62 29 21 3d 30 20 26 26 20 28 69 73 43 6c 65 61  b)!=0 && (isClea
4180: 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66  rTable || p->inf
4190: 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29 7b  o.nKey==iRow) ){
41a0: 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65  .      p->eState
41b0: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
41c0: 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  D;.    }.  }.}..
41d0: 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62 20  #else.  /* Stub 
41e0: 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e 20 49 4e  function when IN
41f0: 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74 74 65  CRBLOB is omitte
4200: 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 69  d */.  #define i
4210: 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f  nvalidateIncrblo
4220: 62 43 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a  bCursors(x,y,z).
4230: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
4240: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a  _OMIT_INCRBLOB *
4250: 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74  /../*.** Set bit
4260: 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53   pgno of the BtS
4270: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4280: 74 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 69  t bitvec. This i
4290: 73 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65  s called .** whe
42a0: 6e 20 61 20 70 61 67 65 20 74 68 61 74 20 70 72  n a page that pr
42b0: 65 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e  eviously contain
42c0: 65 64 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20  ed data becomes 
42d0: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
42e0: 20 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   .** page..**.**
42f0: 20 54 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   The BtShared.pH
4300: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
4310: 20 65 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20   exists to work 
4320: 61 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72  around an obscur
4330: 65 0a 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20  e.** bug caused 
4340: 62 79 20 74 68 65 20 69 6e 74 65 72 61 63 74 69  by the interacti
4350: 6f 6e 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c  on of two useful
4360: 20 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   IO optimization
4370: 73 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a  s surrounding.**
4380: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4390: 70 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  pages:.**.**   1
43a0: 29 20 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20  ) When all data 
43b0: 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20  is deleted from 
43c0: 61 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 70  a page and the p
43d0: 61 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20  age becomes.**  
43e0: 20 20 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20      a free-list 
43f0: 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 70  leaf page, the p
4400: 61 67 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  age is not writt
4410: 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
4420: 73 65 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66  se.**      (as f
4430: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
4440: 67 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d  ges contain no m
4450: 65 61 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e  eaningful data).
4460: 20 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20   Sometimes.**   
4470: 20 20 20 73 75 63 68 20 61 20 70 61 67 65 20 69     such a page i
4480: 73 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e  s not even journ
4490: 61 6c 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c  alled (as it wil
44a0: 6c 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65  l not be modifie
44b0: 64 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62  d,.**      why b
44c0: 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e  other journallin
44d0: 67 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  g it?)..**.**   
44e0: 32 29 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c  2) When a free-l
44f0: 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73  ist leaf page is
4500: 20 72 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e   reused, its con
4510: 74 65 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64  tent is not read
4520: 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68  .**      from th
4530: 65 20 64 61 74 61 62 61 73 65 20 6f 72 20 77 72  e database or wr
4540: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
4550: 72 6e 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73  rnal file (why s
4560: 68 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20  hould it.**     
4570: 20 62 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f   be, if it is no
4580: 74 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67  t at all meaning
4590: 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20  ful?)..**.** By 
45a0: 74 68 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73  themselves, thes
45b0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  e optimizations 
45c0: 77 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72  work fine and pr
45d0: 6f 76 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a  ovide a handy.**
45e0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f   performance boo
45f0: 73 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74  st to bulk delet
4600: 65 20 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72  e or insert oper
4610: 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c  ations. However,
4620: 20 69 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73   if.** a page is
4630: 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72   moved to the fr
4640: 65 65 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e  ee-list and then
4650: 20 72 65 75 73 65 64 20 77 69 74 68 69 6e 20 74   reused within t
4660: 68 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73  he same.** trans
4670: 61 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65  action, a proble
4680: 6d 20 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74  m comes up. If t
4690: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a  he page is not j
46a0: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a  ournalled when.*
46b0: 2a 20 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f  * it is moved to
46c0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61   the free-list a
46d0: 6e 64 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f  nd it is also no
46e0: 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65  t journalled whe
46f0: 6e 20 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61  n it.** is extra
4700: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72  cted from the fr
4710: 65 65 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73  ee-list and reus
4720: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69  ed, then the ori
4730: 67 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61  ginal data.** ma
4740: 79 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68  y be lost. In th
4750: 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c  e event of a rol
4760: 6c 62 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f  lback, it may no
4770: 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a  t be possible.**
4780: 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
4790: 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20  database to its 
47a0: 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75  original configu
47b0: 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ration..**.** Th
47c0: 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68  e solution is th
47d0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
47e0: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57  ontent bitvec. W
47f0: 68 65 6e 65 76 65 72 20 61 20 70 61 67 65 20 69  henever a page i
4800: 73 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62  s .** moved to b
4810: 65 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73  ecome a free-lis
4820: 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  t leaf page, the
4830: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
4840: 69 74 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20  it is.** set in 
4850: 74 68 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e  the bitvec. When
4860: 65 76 65 72 20 61 20 6c 65 61 66 20 70 61 67 65  ever a leaf page
4870: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
4880: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
4890: 2c 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ,.** optimizatio
48a0: 6e 20 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69  n 2 above is omi
48b0: 74 74 65 64 20 69 66 20 74 68 65 20 63 6f 72 72  tted if the corr
48c0: 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
48d0: 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20   already.** set 
48e0: 69 6e 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  in BtShared.pHas
48f0: 43 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e  Content. The con
4900: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74  tents of the bit
4910: 76 65 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a  vec are cleared.
4920: 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
4930: 20 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69   every transacti
4940: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
4950: 74 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  t btreeSetHasCon
4960: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
4970: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
4980: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
4990: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74  E_OK;.  if( !pBt
49a0: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b  ->pHasContent ){
49b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
49c0: 6f 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b  o<=pBt->nPage );
49d0: 0a 20 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f  .    pBt->pHasCo
49e0: 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42  ntent = sqlite3B
49f0: 69 74 76 65 63 43 72 65 61 74 65 28 70 42 74 2d  itvecCreate(pBt-
4a00: 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  >nPage);.    if(
4a10: 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65   !pBt->pHasConte
4a20: 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nt ){.      rc =
4a30: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
4a40: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
4a50: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
4a60: 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74  pgno<=sqlite3Bit
4a70: 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61  vecSize(pBt->pHa
4a80: 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20  sContent) ){.   
4a90: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74   rc = sqlite3Bit
4aa0: 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73  vecSet(pBt->pHas
4ab0: 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a  Content, pgno);.
4ac0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
4ad0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20  .}../*.** Query 
4ae0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4af0: 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e  sContent vector.
4b00: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
4b10: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
4b20: 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20  hen a free-list 
4b30: 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65 6d  leaf page is rem
4b40: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  oved from the.**
4b50: 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72   free-list for r
4b60: 65 75 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73  euse. It returns
4b70: 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20   false if it is 
4b80: 73 61 66 65 20 74 6f 20 72 65 74 72 69 65 76 65  safe to retrieve
4b90: 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f   the.** page fro
4ba0: 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  m the pager laye
4bb0: 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63  r with the 'no-c
4bc0: 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74  ontent' flag set
4bd0: 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69 73 65  . True otherwise
4be0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4bf0: 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65  btreeGetHasConte
4c00: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
4c10: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
4c20: 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d  Bitvec *p = pBt-
4c30: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20  >pHasContent;.  
4c40: 72 65 74 75 72 6e 20 28 70 20 26 26 20 28 70 67  return (p && (pg
4c50: 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63  no>sqlite3Bitvec
4c60: 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74  Size(p) || sqlit
4c70: 65 33 42 69 74 76 65 63 54 65 73 74 28 70 2c 20  e3BitvecTest(p, 
4c80: 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pgno)));.}../*.*
4c90: 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79  * Clear (destroy
4ca0: 29 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  ) the BtShared.p
4cb0: 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65  HasContent bitve
4cc0: 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  c. This should b
4cd0: 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20  e.** invoked at 
4ce0: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f  the conclusion o
4cf0: 66 20 65 61 63 68 20 77 72 69 74 65 2d 74 72 61  f each write-tra
4d00: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
4d10: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c  tic void btreeCl
4d20: 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74  earHasContent(Bt
4d30: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
4d40: 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
4d50: 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f  troy(pBt->pHasCo
4d60: 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70  ntent);.  pBt->p
4d70: 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a  HasContent = 0;.
4d80: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
4d90: 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70 50 61   all of the apPa
4da0: 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72 20 61  ge[] pages for a
4db0: 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74   cursor..*/.stat
4dc0: 69 63 20 76 6f 69 64 20 62 74 72 65 65 52 65 6c  ic void btreeRel
4dd0: 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
4de0: 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  es(BtCursor *pCu
4df0: 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  r){.  int i;.  f
4e00: 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d  or(i=0; i<=pCur-
4e10: 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
4e20: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
4e30: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  ur->apPage[i]);.
4e40: 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
4e50: 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  [i] = 0;.  }.  p
4e60: 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b  Cur->iPage = -1;
4e70: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20  .}.../*.** Save 
4e80: 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
4e90: 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74  or position in t
4ea0: 68 65 20 76 61 72 69 61 62 6c 65 73 20 42 74 43  he variables BtC
4eb0: 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61  ursor.nKey .** a
4ec0: 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79  nd BtCursor.pKey
4ed0: 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73 20 73  . The cursor's s
4ee0: 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 43  tate is set to C
4ef0: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
4f00: 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  K..**.** The cal
4f10: 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20  ler must ensure 
4f20: 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
4f30: 69 73 20 76 61 6c 69 64 20 28 68 61 73 20 65 53  is valid (has eS
4f40: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
4f50: 49 44 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20  ID).** prior to 
4f60: 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
4f70: 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69  tine.  .*/.stati
4f80: 63 20 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72  c int saveCursor
4f90: 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f  Position(BtCurso
4fa0: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
4fb0: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43  rc;..  assert( C
4fc0: 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75  URSOR_VALID==pCu
4fd0: 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61  r->eState );.  a
4fe0: 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e  ssert( 0==pCur->
4ff0: 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74  pKey );.  assert
5000: 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
5010: 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 72  ex(pCur) );..  r
5020: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
5030: 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 70  KeySize(pCur, &p
5040: 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20 61 73  Cur->nKey);.  as
5050: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
5060: 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b 65 79 53 69  _OK );  /* KeySi
5070: 7a 65 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c  ze() cannot fail
5080: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   */..  /* If thi
5090: 73 20 69 73 20 61 6e 20 69 6e 74 4b 65 79 20 74  s is an intKey t
50a0: 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 61  able, then the a
50b0: 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42 74 72  bove call to Btr
50c0: 65 65 4b 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a  eeKeySize().  **
50d0: 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e 74 65   stores the inte
50e0: 67 65 72 20 6b 65 79 20 69 6e 20 70 43 75 72 2d  ger key in pCur-
50f0: 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73 20 63  >nKey. In this c
5100: 61 73 65 20 74 68 69 73 20 76 61 6c 75 65 20 69  ase this value i
5110: 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20  s.  ** all that 
5120: 69 73 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68  is required. Oth
5130: 65 72 77 69 73 65 2c 20 69 66 20 70 43 75 72 20  erwise, if pCur 
5140: 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61  is not open on a
5150: 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61  n intKey.  ** ta
5160: 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63  ble, then malloc
5170: 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 73   space for and s
5180: 74 6f 72 65 20 74 68 65 20 70 43 75 72 2d 3e 6e  tore the pCur->n
5190: 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b 65 79  Key bytes of key
51a0: 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a   .  ** data..  *
51b0: 2f 0a 20 20 69 66 28 20 30 3d 3d 70 43 75 72 2d  /.  if( 0==pCur-
51c0: 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
51d0: 65 79 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a  ey ){.    void *
51e0: 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61  pKey = sqlite3Ma
51f0: 6c 6c 6f 63 28 20 28 69 6e 74 29 70 43 75 72 2d  lloc( (int)pCur-
5200: 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20 69 66 28  >nKey );.    if(
5210: 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72   pKey ){.      r
5220: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
5230: 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 28 69 6e  Key(pCur, 0, (in
5240: 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b  t)pCur->nKey, pK
5250: 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ey);.      if( r
5260: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
5270: 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b          pCur->pK
5280: 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20  ey = pKey;.     
5290: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
52a0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65  sqlite3_free(pKe
52b0: 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  y);.      }.    
52c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
52d0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
52e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
52f0: 72 74 28 20 21 70 43 75 72 2d 3e 61 70 50 61 67  rt( !pCur->apPag
5300: 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20  e[0]->intKey || 
5310: 21 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a  !pCur->pKey );..
5320: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5330: 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65  _OK ){.    btree
5340: 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72  ReleaseAllCursor
5350: 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20  Pages(pCur);.   
5360: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5370: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5380: 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c  EK;.  }..  inval
5390: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
53a0: 68 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  he(pCur);.  retu
53b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
53c0: 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
53d0: 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  ns of all cursor
53e0: 73 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70  s (except pExcep
53f0: 74 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  t) that are open
5400: 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   on.** the table
5410: 20 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65    with root-page
5420: 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c   iRoot. Usually,
5430: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
5440: 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73  just before curs
5450: 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73  or.** pExcept is
5460: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
5470: 74 68 65 20 74 61 62 6c 65 20 28 42 74 72 65 65  the table (Btree
5480: 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65  Delete() or Btre
5490: 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73  eInsert())..*/.s
54a0: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
54b0: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
54c0: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
54d0: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
54e0: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
54f0: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
5500: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
5510: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
5520: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
5530: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
5540: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
5550: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
5560: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
5570: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
5580: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
5590: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
55a0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a  Root==iRoot) ){.
55b0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
55c0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
55d0: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  D ){.        int
55e0: 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72   rc = saveCursor
55f0: 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20  Position(p);.   
5600: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
5610: 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20  OK!=rc ){.      
5620: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
5630: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
5640: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65  else{.        te
5650: 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65  stcase( p->iPage
5660: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74  >0 );.        bt
5670: 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
5680: 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20  sorPages(p);.   
5690: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
56a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
56b0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  K;.}../*.** Clea
56c0: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  r the current cu
56d0: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a  rsor position..*
56e0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
56f0: 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42  reeClearCursor(B
5700: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5710: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
5720: 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
5730: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   );.  sqlite3_fr
5740: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a  ee(pCur->pKey);.
5750: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30    pCur->pKey = 0
5760: 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  ;.  pCur->eState
5770: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
5780: 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74  D;.}../*.** In t
5790: 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42  his version of B
57a0: 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79  treeMoveto, pKey
57b0: 20 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64   is a packed ind
57c0: 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63  ex record.** suc
57d0: 68 20 61 73 20 69 73 20 67 65 6e 65 72 61 74 65  h as is generate
57e0: 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65  d by the OP_Make
57f0: 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20  Record opcode.  
5800: 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65  Unpack the.** re
5810: 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61  cord and then ca
5820: 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  ll BtreeMovetoUn
5830: 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74  packed() to do t
5840: 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74  he work..*/.stat
5850: 69 63 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65  ic int btreeMove
5860: 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  to(.  BtCursor *
5870: 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72  pCur,     /* Cur
5880: 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  sor open on the 
5890: 62 74 72 65 65 20 74 6f 20 62 65 20 73 65 61 72  btree to be sear
58a0: 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ched */.  const 
58b0: 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a  void *pKey,   /*
58c0: 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74   Packed key if t
58d0: 68 65 20 62 74 72 65 65 20 69 73 20 61 6e 20 69  he btree is an i
58e0: 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b  ndex */.  i64 nK
58f0: 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ey,           /*
5900: 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72   Integer key for
5910: 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f   tables.  Size o
5920: 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63  f pKey for indic
5930: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73  es */.  int bias
5940: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
5950: 69 61 73 20 73 65 61 72 63 68 20 74 6f 20 74 68  ias search to th
5960: 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20  e high end */.  
5970: 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
5980: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61      /* Write sea
5990: 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65  rch results here
59a0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
59b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59c0: 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f      /* Status co
59d0: 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  de */.  Unpacked
59e0: 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b  Record *pIdxKey;
59f0: 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69     /* Unpacked i
5a00: 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68  ndex key */.  ch
5a10: 61 72 20 61 53 70 61 63 65 5b 32 30 30 5d 3b 20  ar aSpace[200]; 
5a20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
5a30: 20 73 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b   space for pIdxK
5a40: 65 79 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20  ey - to avoid a 
5a50: 6d 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72  malloc */.  char
5a60: 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20   *pFree = 0;..  
5a70: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
5a80: 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69  assert( nKey==(i
5a90: 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a  64)(int)nKey );.
5aa0: 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71      pIdxKey = sq
5ab0: 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e  lite3VdbeAllocUn
5ac0: 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20  packedRecord(.  
5ad0: 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79        pCur->pKey
5ae0: 49 6e 66 6f 2c 20 61 53 70 61 63 65 2c 20 73 69  Info, aSpace, si
5af0: 7a 65 6f 66 28 61 53 70 61 63 65 29 2c 20 26 70  zeof(aSpace), &p
5b00: 46 72 65 65 0a 20 20 20 20 29 3b 0a 20 20 20 20  Free.    );.    
5b10: 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29  if( pIdxKey==0 )
5b20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
5b30: 4f 4d 45 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65  OMEM;.    sqlite
5b40: 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63  3VdbeRecordUnpac
5b50: 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  k(pCur->pKeyInfo
5b60: 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65  , (int)nKey, pKe
5b70: 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  y, pIdxKey);.   
5b80: 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46   if( pIdxKey->nF
5b90: 69 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ield==0 ){.     
5ba0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
5bb0: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  Cur->pKeyInfo->d
5bc0: 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20 20  b, pFree);.     
5bd0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
5be0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
5bf0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
5c00: 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d  pIdxKey = 0;.  }
5c10: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
5c20: 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
5c30: 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79  ed(pCur, pIdxKey
5c40: 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52  , nKey, bias, pR
5c50: 65 73 29 3b 0a 20 20 69 66 28 20 70 46 72 65 65  es);.  if( pFree
5c60: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
5c70: 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  bFree(pCur->pKey
5c80: 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29  Info->db, pFree)
5c90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5ca0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74  c;.}../*.** Rest
5cb0: 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ore the cursor t
5cc0: 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69  o the position i
5cd0: 74 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20  t was in (or as 
5ce0: 63 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73  close to as poss
5cf0: 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61  ible).** when sa
5d00: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
5d10: 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e  () was called. N
5d20: 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61  ote that this ca
5d30: 6c 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a  ll deletes the .
5d40: 2a 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f  ** saved positio
5d50: 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79  n info stored by
5d60: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
5d70: 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20  ion(), so there 
5d80: 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73  can be.** at mos
5d90: 74 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20  t one effective 
5da0: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
5db0: 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74  ition() call aft
5dc0: 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65  er each .** save
5dd0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
5de0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5df0: 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73  btreeRestoreCurs
5e00: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
5e10: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
5e20: 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
5e30: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
5e40: 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
5e50: 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
5e60: 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
5e70: 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43  SEEK );.  if( pC
5e80: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
5e90: 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
5ea0: 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
5eb0: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75  pNext;.  }.  pCu
5ec0: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
5ed0: 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63  OR_INVALID;.  rc
5ee0: 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70   = btreeMoveto(p
5ef0: 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c  Cur, pCur->pKey,
5f00: 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20   pCur->nKey, 0, 
5f10: 26 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 29  &pCur->skipNext)
5f20: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
5f30: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
5f40: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
5f50: 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d  pKey);.    pCur-
5f60: 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61  >pKey = 0;.    a
5f70: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
5f80: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
5f90: 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
5fa0: 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
5fb0: 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  D );.    if( pCu
5fc0: 72 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70  r->skipNext && p
5fd0: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
5fe0: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
5ff0: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
6000: 3d 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  = CURSOR_SKIPNEX
6010: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  T;.    }.  }.  r
6020: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65  eturn rc;.}..#de
6030: 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73  fine restoreCurs
6040: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a  orPosition(p) \.
6050: 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55    (p->eState>=CU
6060: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
6070: 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74   ? \.         bt
6080: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
6090: 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a  Position(p) : \.
60a0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
60b0: 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  OK)../*.** Deter
60c0: 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
60d0: 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73  not a cursor has
60e0: 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20   moved from the 
60f0: 70 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77  position it.** w
6100: 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 20 61  as last placed a
6110: 74 2e 20 20 43 75 72 73 6f 72 73 20 63 61 6e 20  t.  Cursors can 
6120: 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f  move when the ro
6130: 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74  w they are point
6140: 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c  ing.** at is del
6150: 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
6160: 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  der them..**.** 
6170: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
6180: 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 63 6f  urns an error co
6190: 64 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  de if something 
61a0: 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54 68 65  goes wrong.  The
61b0: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70 48 61  .** integer *pHa
61c0: 73 4d 6f 76 65 64 20 69 73 20 73 65 74 20 61 73  sMoved is set as
61d0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
61e0: 20 20 20 30 3a 20 20 20 54 68 65 20 63 75 72 73     0:   The curs
61f0: 6f 72 20 69 73 20 75 6e 63 68 61 6e 67 65 64 0a  or is unchanged.
6200: 2a 2a 20 20 20 20 31 3a 20 20 20 54 68 65 20 63  **    1:   The c
6210: 75 72 73 6f 72 20 69 73 20 73 74 69 6c 6c 20 70  ursor is still p
6220: 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 73  ointing at the s
6230: 61 6d 65 20 72 6f 77 2c 20 62 75 74 20 74 68 65  ame row, but the
6240: 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 20 20 20   pointers.**    
6250: 20 20 20 20 20 72 65 74 75 72 6e 65 64 20 62 79       returned by
6260: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
6270: 46 65 74 63 68 28 29 20 6f 72 20 73 71 6c 69 74  Fetch() or sqlit
6280: 65 33 42 74 72 65 65 44 61 74 61 46 65 74 63 68  e3BtreeDataFetch
6290: 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 6d 69  ().**         mi
62a0: 67 68 74 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c  ght now be inval
62b0: 69 64 20 62 65 63 61 75 73 65 20 6f 66 20 61 20  id because of a 
62c0: 62 61 6c 61 6e 63 65 28 29 20 6f 72 20 6f 74 68  balance() or oth
62d0: 65 72 20 63 68 61 6e 67 65 20 74 6f 20 74 68 65  er change to the
62e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 62 2d 74 72  .**         b-tr
62f0: 65 65 2e 0a 2a 2a 20 20 20 20 32 3a 20 20 20 54  ee..**    2:   T
6300: 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 20  he cursor is no 
6310: 6c 6f 6e 67 65 72 20 70 6f 69 6e 74 69 6e 67 20  longer pointing 
6320: 74 6f 20 74 68 65 20 72 6f 77 2e 20 20 54 68 65  to the row.  The
6330: 20 72 6f 77 20 6d 69 67 68 74 20 68 61 76 65 0a   row might have.
6340: 2a 2a 20 20 20 20 20 20 20 20 20 62 65 65 6e 20  **         been 
6350: 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
6360: 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
6370: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
6380: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
6390: 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70  oved(BtCursor *p
63a0: 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73 4d 6f  Cur, int *pHasMo
63b0: 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ved){.  int rc;.
63c0: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
63d0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
63e0: 44 20 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f  D ){.    *pHasMo
63f0: 76 65 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  ved = 0;.    ret
6400: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
6410: 20 7d 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72   }.  rc = restor
6420: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6430: 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
6440: 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65  ){.    *pHasMove
6450: 64 20 3d 20 32 3b 0a 20 20 20 20 72 65 74 75 72  d = 2;.    retur
6460: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
6470: 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
6480: 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 4e 45  RSOR_VALID || NE
6490: 56 45 52 28 70 43 75 72 2d 3e 73 6b 69 70 4e 65  VER(pCur->skipNe
64a0: 78 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 2a 70  xt!=0) ){.    *p
64b0: 48 61 73 4d 6f 76 65 64 20 3d 20 32 3b 0a 20 20  HasMoved = 2;.  
64c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48 61 73  }else{.    *pHas
64d0: 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  Moved = 1;.  }. 
64e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
64f0: 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
6500: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
6510: 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  CUUM./*.** Given
6520: 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f   a page number o
6530: 66 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61  f a regular data
6540: 62 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72  base page, retur
6550: 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75  n the page.** nu
6560: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69  mber for the poi
6570: 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68  nter-map page th
6580: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
6590: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a  entry for the.**
65a0: 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62   input page numb
65b0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
65c0: 20 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20   0 (not a valid 
65d0: 70 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d  page) for pgno==
65e0: 31 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  1 since there is
65f0: 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d  .** no pointer m
6600: 61 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ap associated wi
6610: 74 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20  th page 1.  The 
6620: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
6630: 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65  logic.** require
6640: 73 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67  s that ptrmapPag
6650: 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a  eno(*,1)!=1..*/.
6660: 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d  static Pgno ptrm
6670: 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65  apPageno(BtShare
6680: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
6690: 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73  o){.  int nPages
66a0: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67  PerMapPage;.  Pg
66b0: 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b  no iPtrMap, ret;
66c0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
66d0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
66e0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
66f0: 66 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75  f( pgno<2 ) retu
6700: 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65  rn 0;.  nPagesPe
6710: 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d  rMapPage = (pBt-
6720: 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31  >usableSize/5)+1
6730: 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70  ;.  iPtrMap = (p
6740: 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72  gno-2)/nPagesPer
6750: 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d  MapPage;.  ret =
6760: 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73   (iPtrMap*nPages
6770: 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b  PerMapPage) + 2;
6780: 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e   .  if( ret==PEN
6790: 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
67a0: 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b  Bt) ){.    ret++
67b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
67c0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  et;.}../*.** Wri
67d0: 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  te an entry into
67e0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
67f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
6800: 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65  tine updates the
6810: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
6820: 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62  ry for page numb
6830: 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74  er 'key'.** so t
6840: 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74  hat it maps to t
6850: 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20  ype 'eType' and 
6860: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
6870: 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a  er 'pgno'..**.**
6880: 20 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74   If *pRC is init
6890: 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28  ially non-zero (
68a0: 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74  non-SQLITE_OK) t
68b0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
68c0: 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20   is.** a no-op. 
68d0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
68e0: 75 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72  urs, the appropr
68f0: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
6900: 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
6910: 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74  to *pRC..*/.stat
6920: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
6930: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
6940: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54   Pgno key, u8 eT
6950: 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74  ype, Pgno parent
6960: 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44  , int *pRC){.  D
6970: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
6980: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
6990: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  map page */.  u8
69a0: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
69b0: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
69c0: 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e  ap data */.  Pgn
69d0: 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f  o iPtrmap;     /
69e0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
69f0: 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  p page number */
6a00: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
6a10: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
6a20: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  n pointer map pa
6a30: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
6a40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
6a50: 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  urn code from su
6a60: 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20  bfunctions */.. 
6a70: 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
6a80: 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rn;..  assert( s
6a90: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
6aa0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
6ab0: 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72  .  /* The master
6ac0: 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75  -journal page nu
6ad0: 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20  mber must never 
6ae0: 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69  be used as a poi
6af0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
6b00: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54  .  assert( 0==PT
6b10: 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
6b20: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41   PENDING_BYTE_PA
6b30: 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61  GE(pBt)) );..  a
6b40: 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
6b50: 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20  Vacuum );.  if( 
6b60: 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  key==0 ){.    *p
6b70: 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
6b80: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  UPT_BKPT;.    re
6b90: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72  turn;.  }.  iPtr
6ba0: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
6bb0: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
6bc0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
6bd0: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
6be0: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
6bf0: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
6c00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6c10: 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
6c20: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f   return;.  }.  o
6c30: 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50  ffset = PTRMAP_P
6c40: 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70  TROFFSET(iPtrmap
6c50: 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66  , key);.  if( of
6c60: 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70  fset<0 ){.    *p
6c70: 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
6c80: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f  UPT_BKPT;.    go
6c90: 74 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a  to ptrmap_exit;.
6ca0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66    }.  assert( of
6cb0: 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74  fset <= (int)pBt
6cc0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29  ->usableSize-5 )
6cd0: 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75  ;.  pPtrmap = (u
6ce0: 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  8 *)sqlite3Pager
6cf0: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
6d00: 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d  ;..  if( eType!=
6d10: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20  pPtrmap[offset] 
6d20: 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74  || get4byte(&pPt
6d30: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21  rmap[offset+1])!
6d40: 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54  =parent ){.    T
6d50: 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50  RACE(("PTRMAP_UP
6d60: 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64  DATE: %d->(%d,%d
6d70: 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65  )\n", key, eType
6d80: 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20  , parent));.    
6d90: 2a 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74  *pRC= rc = sqlit
6da0: 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
6db0: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
6dc0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6dd0: 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66        pPtrmap[of
6de0: 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20  fset] = eType;. 
6df0: 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
6e00: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d  Ptrmap[offset+1]
6e10: 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d  , parent);.    }
6e20: 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69  .  }..ptrmap_exi
6e30: 74 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  t:.  sqlite3Page
6e40: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
6e50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
6e60: 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65  n entry from the
6e70: 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a   pointer map..**
6e80: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6e90: 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20 70   retrieves the p
6ea0: 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
6eb0: 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c   for page 'key',
6ec0: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
6ed0: 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20  type and parent 
6ee0: 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a  page number to *
6ef0: 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e  pEType and *pPgn
6f00: 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  o respectively..
6f10: 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** An error code
6f20: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
6f30: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
6f40: 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20  rong, otherwise 
6f50: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
6f60: 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47  atic int ptrmapG
6f70: 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  et(BtShared *pBt
6f80: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a  , Pgno key, u8 *
6f90: 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50  pEType, Pgno *pP
6fa0: 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  gno){.  DbPage *
6fb0: 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68  pDbPage;   /* Th
6fc0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
6fd0: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72  ge */.  int iPtr
6fe0: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
6ff0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69  inter map page i
7000: 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50  ndex */.  u8 *pP
7010: 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20  trmap;       /* 
7020: 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  Pointer map page
7030: 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f   data */.  int o
7040: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a  ffset;        /*
7050: 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79   Offset of entry
7060: 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20   in pointer map 
7070: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
7080: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
7090: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
70a0: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74  mutex) );..  iPt
70b0: 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41  rmap = PTRMAP_PA
70c0: 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a  GENO(pBt, key);.
70d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
70e0: 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
70f0: 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44  er, iPtrmap, &pD
7100: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
7110: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
7120: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72  n rc;.  }.  pPtr
7130: 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  map = (u8 *)sqli
7140: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
7150: 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66  pDbPage);..  off
7160: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
7170: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
7180: 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73  key);.  if( offs
7190: 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  et<0 ){.    sqli
71a0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
71b0: 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75  bPage);.    retu
71c0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
71d0: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73  T_BKPT;.  }.  as
71e0: 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20  sert( offset <= 
71f0: 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65  (int)pBt->usable
7200: 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65  Size-5 );.  asse
7210: 72 74 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b  rt( pEType!=0 );
7220: 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74  .  *pEType = pPt
7230: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20  rmap[offset];.  
7240: 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67  if( pPgno ) *pPg
7250: 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
7260: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d  Ptrmap[offset+1]
7270: 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67  );..  sqlite3Pag
7280: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
7290: 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c  ;.  if( *pEType<
72a0: 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29  1 || *pEType>5 )
72b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
72c0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72  ORRUPT_BKPT;.  r
72d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
72e0: 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  .}..#else /* if 
72f0: 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f  defined SQLITE_O
7300: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a  MIT_AUTOVACUUM *
7310: 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  /.  #define ptrm
7320: 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63  apPut(w,x,y,z,rc
7330: 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  ).  #define ptrm
7340: 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53  apGet(w,x,y,z) S
7350: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
7360: 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  ne ptrmapPutOvfl
7370: 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65  Ptr(x, y, rc).#e
7380: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ndif../*.** Give
7390: 6e 20 61 20 62 74 72 65 65 20 70 61 67 65 20 61  n a btree page a
73a0: 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20  nd a cell index 
73b0: 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72  (0 means the fir
73c0: 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68  st cell on.** th
73d0: 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20  e page, 1 means 
73e0: 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c  the second cell,
73f0: 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72   and so forth) r
7400: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a  eturn a pointer.
7410: 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  ** to the cell c
7420: 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ontent..**.** Th
7430: 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  is routine works
7440: 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20   only for pages 
7450: 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74  that do not cont
7460: 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ain overflow cel
7470: 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66  ls..*/.#define f
7480: 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20  indCell(P,I) \. 
7490: 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28   ((P)->aData + (
74a0: 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20  (P)->maskPage & 
74b0: 67 65 74 32 62 79 74 65 28 26 28 50 29 2d 3e 61  get2byte(&(P)->a
74c0: 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29  CellIdx[2*(I)]))
74d0: 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65  ).#define findCe
74e0: 6c 6c 76 32 28 44 2c 4d 2c 4f 2c 49 29 20 28 44  llv2(D,M,O,I) (D
74f0: 2b 28 4d 26 67 65 74 32 62 79 74 65 28 44 2b 28  +(M&get2byte(D+(
7500: 4f 2b 32 2a 28 49 29 29 29 29 29 0a 0a 0a 2f 2a  O+2*(I))))).../*
7510: 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20  .** This a more 
7520: 63 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20  complex version 
7530: 6f 66 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68  of findCell() th
7540: 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20  at works for.** 
7550: 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f  pages that do co
7560: 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ntain overflow c
7570: 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ells..*/.static 
7580: 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77  u8 *findOverflow
7590: 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
75a0: 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b  age, int iCell){
75b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
75c0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
75d0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
75e0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66  t->mutex) );.  f
75f0: 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65  or(i=pPage->nOve
7600: 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69  rflow-1; i>=0; i
7610: 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a  --){.    int k;.
7620: 20 20 20 20 6b 20 3d 20 70 50 61 67 65 2d 3e 61      k = pPage->a
7630: 69 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 69 66  iOvfl[i];.    if
7640: 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20  ( k<=iCell ){.  
7650: 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c      if( k==iCell
7660: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
7670: 72 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  rn pPage->apOvfl
7680: 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [i];.      }.   
7690: 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20     iCell--;.    
76a0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66  }.  }.  return f
76b0: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
76c0: 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Cell);.}../*.** 
76d0: 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e  Parse a cell con
76e0: 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66  tent block and f
76f0: 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49  ill in the CellI
7700: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
7710: 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f  There.** are two
7720: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69   versions of thi
7730: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74 72  s function.  btr
7740: 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61  eeParseCell() ta
7750: 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69  kes a .** cell i
7760: 6e 64 65 78 20 61 73 20 74 68 65 20 73 65 63 6f  ndex as the seco
7770: 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20  nd argument and 
7780: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
7790: 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20  r() .** takes a 
77a0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62  pointer to the b
77b0: 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ody of the cell 
77c0: 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72  as its second ar
77d0: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69  gument..**.** Wi
77e0: 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20  thin this file, 
77f0: 74 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20  the parseCell() 
7800: 6d 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c  macro can be cal
7810: 6c 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  led instead of.*
7820: 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
7830: 50 74 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d  Ptr(). Using som
7840: 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69  e compilers, thi
7850: 73 20 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72  s will be faster
7860: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7870: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
7880: 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  tr(.  MemPage *p
7890: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
78a0: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
78b0: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
78c0: 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
78d0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
78e0: 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65  r to the cell te
78f0: 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  xt. */.  CellInf
7900: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
7910: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
7920: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
7930: 0a 20 20 75 31 36 20 6e 3b 20 20 20 20 20 20 20  .  u16 n;       
7940: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7950: 6d 62 65 72 20 62 79 74 65 73 20 69 6e 20 63 65  mber bytes in ce
7960: 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65  ll content heade
7970: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  r */.  u32 nPayl
7980: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
7990: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
79a0: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
79b0: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
79c0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
79d0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
79e0: 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66  utex) );..  pInf
79f0: 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c  o->pCell = pCell
7a00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
7a10: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
7a20: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
7a30: 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69    n = pPage->chi
7a40: 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73  ldPtrSize;.  ass
7a50: 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67  ert( n==4-4*pPag
7a60: 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28  e->leaf );.  if(
7a70: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
7a80: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  {.    if( pPage-
7a90: 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
7aa0: 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 30 20 29    assert( n==0 )
7ab0: 3b 0a 20 20 20 20 20 20 6e 20 3d 20 67 65 74 56  ;.      n = getV
7ac0: 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 6e  arint32(pCell, n
7ad0: 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65  Payload);.    }e
7ae0: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c  lse{.      nPayl
7af0: 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  oad = 0;.    }. 
7b00: 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e     n += getVarin
7b10: 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36  t(&pCell[n], (u6
7b20: 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29  4*)&pInfo->nKey)
7b30: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61  ;.    pInfo->nDa
7b40: 74 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ta = nPayload;. 
7b50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66   }else{.    pInf
7b60: 6f 2d 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20  o->nData = 0;.  
7b70: 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    n += getVarint
7b80: 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50  32(&pCell[n], nP
7b90: 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e  ayload);.    pIn
7ba0: 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c  fo->nKey = nPayl
7bb0: 6f 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f  oad;.  }.  pInfo
7bc0: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61  ->nPayload = nPa
7bd0: 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e  yload;.  pInfo->
7be0: 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20 74  nHeader = n;.  t
7bf0: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
7c00: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
7c10: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
7c20: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
7c30: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
7c40: 0a 20 20 69 66 28 20 6c 69 6b 65 6c 79 28 6e 50  .  if( likely(nP
7c50: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
7c60: 61 78 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20  axLocal) ){.    
7c70: 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28  /* This is the (
7c80: 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73  easy) common cas
7c90: 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69  e where the enti
7ca0: 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a  re payload fits.
7cb0: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f      ** on the lo
7cc0: 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76  cal page.  No ov
7cd0: 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72  erflow is requir
7ce0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
7cf0: 66 28 20 28 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  f( (pInfo->nSize
7d00: 20 3d 20 28 75 31 36 29 28 6e 2b 6e 50 61 79 6c   = (u16)(n+nPayl
7d10: 6f 61 64 29 29 3c 34 20 29 20 70 49 6e 66 6f 2d  oad))<4 ) pInfo-
7d20: 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20  >nSize = 4;.    
7d30: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
7d40: 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20  (u16)nPayload;. 
7d50: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
7d60: 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  low = 0;.  }else
7d70: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
7d80: 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74  payload will not
7d90: 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   fit completely 
7da0: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
7db0: 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a  e, we have.    *
7dc0: 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20  * to decide how 
7dd0: 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f  much to store lo
7de0: 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75  cally and how mu
7df0: 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f  ch to spill onto
7e00: 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77  .    ** overflow
7e10: 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72   pages.  The str
7e20: 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69  ategy is to mini
7e30: 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  mize the amount 
7e40: 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a  of unused.    **
7e50: 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c   space on overfl
7e60: 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b  ow pages while k
7e70: 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e  eeping the amoun
7e80: 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61  t of local stora
7e90: 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65 74  ge.    ** in bet
7ea0: 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e  ween minLocal an
7eb0: 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20  d maxLocal..    
7ec0: 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e  **.    ** Warnin
7ed0: 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65  g:  changing the
7ee0: 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   way overflow pa
7ef0: 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62  yload is distrib
7f00: 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 20 20  uted in any.    
7f10: 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75  ** way will resu
7f20: 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61  lt in an incompa
7f30: 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61  tible file forma
7f40: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  t..    */.    in
7f50: 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t minLocal;  /* 
7f60: 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Minimum amount o
7f70: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
7f80: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e  ocally */.    in
7f90: 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t maxLocal;  /* 
7fa0: 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Maximum amount o
7fb0: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
7fc0: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e  ocally */.    in
7fd0: 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20  t surplus;   /* 
7fe0: 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64  Overflow payload
7ff0: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c   available for l
8000: 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a  ocal storage */.
8010: 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20  .    minLocal = 
8020: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
8030: 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20  .    maxLocal = 
8040: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  pPage->maxLocal;
8050: 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d  .    surplus = m
8060: 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c  inLocal + (nPayl
8070: 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25  oad - minLocal)%
8080: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
8090: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
80a0: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
80b0: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b  lus==maxLocal );
80c0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73  .    testcase( s
80d0: 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c  urplus==maxLocal
80e0: 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 73 75  +1 );.    if( su
80f0: 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61  rplus <= maxLoca
8100: 6c 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f  l ){.      pInfo
8110: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
8120: 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c  surplus;.    }el
8130: 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  se{.      pInfo-
8140: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d  >nLocal = (u16)m
8150: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
8160: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
8170: 6c 6f 77 20 3d 20 28 75 31 36 29 28 70 49 6e 66  low = (u16)(pInf
8180: 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 29 3b 0a  o->nLocal + n);.
8190: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65      pInfo->nSize
81a0: 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66   = pInfo->iOverf
81b0: 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23  low + 4;.  }.}.#
81c0: 64 65 66 69 6e 65 20 70 61 72 73 65 43 65 6c 6c  define parseCell
81d0: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70  (pPage, iCell, p
81e0: 49 6e 66 6f 29 20 5c 0a 20 20 62 74 72 65 65 50  Info) \.  btreeP
81f0: 61 72 73 65 43 65 6c 6c 50 74 72 28 28 70 50 61  arseCellPtr((pPa
8200: 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70  ge), findCell((p
8210: 50 61 67 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c  Page), (iCell)),
8220: 20 28 70 49 6e 66 6f 29 29 0a 73 74 61 74 69 63   (pInfo)).static
8230: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
8240: 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
8250: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
8260: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
8270: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
8280: 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20   int iCell,     
8290: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
82a0: 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72  cell index.  Fir
82b0: 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a  st cell is 0 */.
82c0: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
82d0: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
82e0: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
82f0: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73  ure */.){.  pars
8300: 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  eCell(pPage, iCe
8310: 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f  ll, pInfo);.}../
8320: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
8330: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
8340: 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65   bytes that a Ce
8350: 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20  ll needs in the 
8360: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65  cell.** data are
8370: 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70  a of the btree-p
8380: 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e  age.  The return
8390: 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73   number includes
83a0: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
83b0: 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65  a header and the
83c0: 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20   local payload, 
83d0: 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72  but not any over
83e0: 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20  flow page or.** 
83f0: 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62  the space used b
8400: 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  y the cell point
8410: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31  er..*/.static u1
8420: 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65  6 cellSizePtr(Me
8430: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
8440: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a   *pCell){.  u8 *
8450: 70 49 74 65 72 20 3d 20 26 70 43 65 6c 6c 5b 70  pIter = &pCell[p
8460: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
8470: 7a 65 5d 3b 0a 20 20 75 33 32 20 6e 53 69 7a 65  ze];.  u32 nSize
8480: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
8490: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20  _DEBUG.  /* The 
84a0: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
84b0: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
84c0: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
84d0: 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a   the same as.  *
84e0: 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e  * the (CellInfo.
84f0: 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75  nSize) value fou
8500: 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75  nd by doing a fu
8510: 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a  ll parse of the.
8520: 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51    ** cell. If SQ
8530: 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
8540: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
8550: 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  () at the bottom
8560: 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75   of.  ** this fu
8570: 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20  nction verifies 
8580: 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69  that this invari
8590: 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61  ant is not viola
85a0: 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ted. */.  CellIn
85b0: 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20  fo debuginfo;.  
85c0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
85d0: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
85e0: 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e  &debuginfo);.#en
85f0: 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61 67 65  dif..  if( pPage
8600: 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
8610: 75 38 20 2a 70 45 6e 64 3b 0a 20 20 20 20 69 66  u8 *pEnd;.    if
8620: 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
8630: 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 20   ){.      pIter 
8640: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70  += getVarint32(p
8650: 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20  Iter, nSize);.  
8660: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
8670: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Size = 0;.    }.
8680: 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f  .    /* pIter no
8690: 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  w points at the 
86a0: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b  64-bit integer k
86b0: 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69  ey value, a vari
86c0: 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20  able length .   
86d0: 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65   ** integer. The
86e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
86f0: 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20   moves pIter to 
8700: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69 72  point at the fir
8710: 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70  st byte.    ** p
8720: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
8730: 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f  he key value. */
8740: 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74  .    pEnd = &pIt
8750: 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65  er[9];.    while
8760: 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38  ( (*pIter++)&0x8
8770: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
8780: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
8790: 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69  pIter += getVari
87a0: 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a  nt32(pIter, nSiz
87b0: 65 29 3b 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63  e);.  }..  testc
87c0: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
87d0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
87e0: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
87f0: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
8800: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69  l+1 );.  if( nSi
8810: 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  ze>pPage->maxLoc
8820: 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69  al ){.    int mi
8830: 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  nLocal = pPage->
8840: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53  minLocal;.    nS
8850: 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b  ize = minLocal +
8860: 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63   (nSize - minLoc
8870: 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42  al) % (pPage->pB
8880: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
8890: 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  4);.    testcase
88a0: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
88b0: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20  maxLocal );.    
88c0: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
88d0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
88e0: 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53  +1 );.    if( nS
88f0: 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ize>pPage->maxLo
8900: 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69  cal ){.      nSi
8910: 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  ze = minLocal;. 
8920: 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b     }.    nSize +
8930: 3d 20 34 3b 0a 20 20 7d 0a 20 20 6e 53 69 7a 65  = 4;.  }.  nSize
8940: 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20   += (u32)(pIter 
8950: 2d 20 70 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20  - pCell);..  /* 
8960: 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65  The minimum size
8970: 20 6f 66 20 61 6e 79 20 63 65 6c 6c 20 69 73 20   of any cell is 
8980: 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 69 66  4 bytes. */.  if
8990: 28 20 6e 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20  ( nSize<4 ){.   
89a0: 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 0a   nSize = 4;.  }.
89b0: 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65  .  assert( nSize
89c0: 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a  ==debuginfo.nSiz
89d0: 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  e );.  return (u
89e0: 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66  16)nSize;.}..#if
89f0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
8a00: 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69  ./* This variati
8a10: 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74  on on cellSizePt
8a20: 72 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69  r() is used insi
8a30: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
8a40: 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c  tatements.** onl
8a50: 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  y. */.static u16
8a60: 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67   cellSize(MemPag
8a70: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
8a80: 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63  ell){.  return c
8a90: 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
8aa0: 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  , findCell(pPage
8ab0: 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e  , iCell));.}.#en
8ac0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
8ad0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
8ae0: 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  UUM./*.** If the
8af0: 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72   cell pCell, par
8b00: 74 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20  t of page pPage 
8b10: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
8b20: 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72  er.** to an over
8b30: 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72  flow page, inser
8b40: 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  t an entry into 
8b50: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
8b60: 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ** for the overf
8b70: 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  low page..*/.sta
8b80: 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50  tic void ptrmapP
8b90: 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67  utOvflPtr(MemPag
8ba0: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
8bb0: 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  ell, int *pRC){.
8bc0: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
8bd0: 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
8be0: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
8bf0: 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74  pCell!=0 );.  bt
8c00: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
8c10: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
8c20: 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
8c30: 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61  (info.nData+(pPa
8c40: 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66  ge->intKey?0:inf
8c50: 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e  o.nKey))==info.n
8c60: 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28  Payload );.  if(
8c70: 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20   info.iOverflow 
8c80: 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c  ){.    Pgno ovfl
8c90: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
8ca0: 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
8cb0: 77 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50  w]);.    ptrmapP
8cc0: 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f  ut(pPage->pBt, o
8cd0: 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
8ce0: 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67  FLOW1, pPage->pg
8cf0: 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a  no, pRC);.  }.}.
8d00: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44  #endif.../*.** D
8d10: 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61  efragment the pa
8d20: 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43  ge given.  All C
8d30: 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74  ells are moved t
8d40: 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  o the.** end of 
8d50: 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c  the page and all
8d60: 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63   free space is c
8d70: 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e  ollected into on
8d80: 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b  e.** big FreeBlk
8d90: 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
8da0: 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61 64  between the head
8db0: 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70  er and cell.** p
8dc0: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64  ointer array and
8dd0: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
8de0: 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69  t area..*/.stati
8df0: 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74  c int defragment
8e00: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
8e10: 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  age){.  int i;  
8e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e30: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
8e40: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20  er */.  int pc; 
8e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e60: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
8e70: 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a   a i-th cell */.
8e80: 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
8e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8ea0: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61  Offset to the pa
8eb0: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ge header */.  i
8ec0: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
8ed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
8ee0: 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20  e of a cell */. 
8ef0: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
8f10: 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20  umber of usable 
8f20: 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20  bytes on a page 
8f30: 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
8f40: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
8f50: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
8f60: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
8f70: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72  ray */.  int cbr
8f80: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
8f90: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
8fa0: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
8fb0: 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20  t area */.  int 
8fc0: 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
8fd0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
8fe0: 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65   of cells on the
8ff0: 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67   page */.  unsig
9000: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20  ned char *data; 
9010: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
9020: 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69  e data */.  unsi
9030: 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b  gned char *temp;
9040: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61         /* Temp a
9050: 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e  rea for cell con
9060: 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43  tent */.  int iC
9070: 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20  ellFirst;       
9080: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c       /* First al
9090: 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64  lowable cell ind
90a0: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ex */.  int iCel
90b0: 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20  lLast;          
90c0: 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69     /* Last possi
90d0: 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a  ble cell index *
90e0: 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  /...  assert( sq
90f0: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
9100: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
9110: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
9120: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
9130: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
9140: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
9150: 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d  Size <= SQLITE_M
9160: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a  AX_PAGE_SIZE );.
9170: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9180: 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
9190: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
91a0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
91b0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
91c0: 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c   );.  temp = sql
91d0: 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
91e0: 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  ce(pPage->pBt->p
91f0: 50 61 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d  Pager);.  data =
9200: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
9210: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
9220: 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f  rOffset;.  cellO
9230: 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63  ffset = pPage->c
9240: 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65  ellOffset;.  nCe
9250: 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
9260: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65  l;.  assert( nCe
9270: 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61  ll==get2byte(&da
9280: 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20  ta[hdr+3]) );.  
9290: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61  usableSize = pPa
92a0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
92b0: 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65  ize;.  cbrk = ge
92c0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
92d0: 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  +5]);.  memcpy(&
92e0: 74 65 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74  temp[cbrk], &dat
92f0: 61 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53  a[cbrk], usableS
9300: 69 7a 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63  ize - cbrk);.  c
9310: 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  brk = usableSize
9320: 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d  ;.  iCellFirst =
9330: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
9340: 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61  nCell;.  iCellLa
9350: 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  st = usableSize 
9360: 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  - 4;.  for(i=0; 
9370: 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
9380: 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20     u8 *pAddr;   
9390: 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65    /* The i-th ce
93a0: 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
93b0: 20 20 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b    pAddr = &data[
93c0: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32  cellOffset + i*2
93d0: 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32  ];.    pc = get2
93e0: 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20  byte(pAddr);.   
93f0: 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69   testcase( pc==i
9400: 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20  CellFirst );.   
9410: 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69   testcase( pc==i
9420: 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 23 69 66 20  CellLast );.#if 
9430: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
9440: 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f  ENABLE_OVERSIZE_
9450: 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20  CELL_CHECK).    
9460: 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69  /* These conditi
9470: 6f 6e 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  ons have already
9480: 20 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 69   been verified i
9490: 6e 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  n btreeInitPage(
94a0: 29 0a 20 20 20 20 2a 2a 20 69 66 20 53 51 4c 49  ).    ** if SQLI
94b0: 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49  TE_ENABLE_OVERSI
94c0: 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 20 69 73  ZE_CELL_CHECK is
94d0: 20 64 65 66 69 6e 65 64 20 0a 20 20 20 20 2a 2f   defined .    */
94e0: 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c  .    if( pc<iCel
94f0: 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
9500: 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
9510: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
9520: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
9530: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73  }.#endif.    ass
9540: 65 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69  ert( pc>=iCellFi
9550: 72 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c  rst && pc<=iCell
9560: 4c 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65  Last );.    size
9570: 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
9580: 50 61 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29  Page, &temp[pc])
9590: 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69  ;.    cbrk -= si
95a0: 7a 65 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ze;.#if defined(
95b0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56  SQLITE_ENABLE_OV
95c0: 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43  ERSIZE_CELL_CHEC
95d0: 4b 29 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c  K).    if( cbrk<
95e0: 69 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20  iCellFirst ){.  
95f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9600: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
9610: 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
9620: 69 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69  if( cbrk<iCellFi
9630: 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  rst || pc+size>u
9640: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
9650: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9660: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9670: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
9680: 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a  assert( cbrk+siz
9690: 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26  e<=usableSize &&
96a0: 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73   cbrk>=iCellFirs
96b0: 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
96c0: 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73  e( cbrk+size==us
96d0: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
96e0: 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a  testcase( pc+siz
96f0: 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  e==usableSize );
9700: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
9710: 61 5b 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70  a[cbrk], &temp[p
9720: 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70  c], size);.    p
9730: 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63  ut2byte(pAddr, c
9740: 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  brk);.  }.  asse
9750: 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46  rt( cbrk>=iCellF
9760: 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79  irst );.  put2by
9770: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
9780: 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68   cbrk);.  data[h
9790: 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74  dr+1] = 0;.  dat
97a0: 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20  a[hdr+2] = 0;.  
97b0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
97c0: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
97d0: 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20  iCellFirst], 0, 
97e0: 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29  cbrk-iCellFirst)
97f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
9800: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
9810: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
9820: 67 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72  ge) );.  if( cbr
9830: 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50  k-iCellFirst!=pP
9840: 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  age->nFree ){.  
9850: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9860: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
9870: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
9880: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
9890: 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79  llocate nByte by
98a0: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f  tes of space fro
98b0: 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54  m within the B-T
98c0: 72 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a  ree page passed.
98d0: 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ** as the first 
98e0: 61 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20  argument. Write 
98f0: 69 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69  into *pIdx the i
9900: 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d  ndex into pPage-
9910: 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74  >aData[].** of t
9920: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
9930: 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65   allocated space
9940: 2e 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20  . Return either 
9950: 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20  SQLITE_OK or.** 
9960: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75  an error code (u
9970: 73 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f  sually SQLITE_CO
9980: 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  RRUPT)..**.** Th
9990: 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74  e caller guarant
99a0: 65 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69  ees that there i
99b0: 73 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  s sufficient spa
99c0: 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a  ce to make the.*
99d0: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54  * allocation.  T
99e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
99f0: 74 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67  t need to defrag
9a00: 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f  ment in order to
9a10: 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68   bring.** all th
9a20: 65 20 73 70 61 63 65 20 74 6f 67 65 74 68 65 72  e space together
9a30: 2c 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73  , however.  This
9a40: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76   routine will av
9a50: 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65  oid using.** the
9a60: 20 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73   first two bytes
9a70: 20 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70   past the cell p
9a80: 6f 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63  ointer area sinc
9a90: 65 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69  e presumably thi
9aa0: 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  s.** allocation 
9ab0: 69 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e  is being made in
9ac0: 20 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74   order to insert
9ad0: 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20   a new cell, so 
9ae0: 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  we will.** also 
9af0: 65 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61  end up needing a
9b00: 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65   new cell pointe
9b10: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
9b20: 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d   allocateSpace(M
9b30: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
9b40: 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70  nt nByte, int *p
9b50: 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  Idx){.  const in
9b60: 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  t hdr = pPage->h
9b70: 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  drOffset;    /* 
9b80: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70  Local cache of p
9b90: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
9ba0: 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  */.  u8 * const 
9bb0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
9bc0: 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63  ata;      /* Loc
9bd0: 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67  al cache of pPag
9be0: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e  e->aData */.  in
9bf0: 74 20 6e 46 72 61 67 3b 20 20 20 20 20 20 20 20  t nFrag;        
9c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9c20: 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73  fragmented bytes
9c30: 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 69   on pPage */.  i
9c40: 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20  nt top;         
9c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c60: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
9c70: 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  e of cell conten
9c80: 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20  t area */.  int 
9c90: 67 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  gap;        /* F
9ca0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70  irst byte of gap
9cb0: 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f   between cell po
9cc0: 69 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20  inters and cell 
9cd0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  content */.  int
9ce0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   rc;         /* 
9cf0: 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63  Integer return c
9d00: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ode */.  int usa
9d10: 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62  bleSize; /* Usab
9d20: 6c 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70  le size of the p
9d30: 61 67 65 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65  age */.  .  asse
9d40: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
9d50: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
9d60: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
9d70: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9d80: 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
9d90: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
9da0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
9db0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
9dc0: 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20  rt( nByte>=0 ); 
9dd0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
9de0: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
9df0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
9e00: 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20  Free>=nByte );. 
9e10: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9e20: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
9e30: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
9e40: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
9e50: 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
9e60: 20 6e 42 79 74 65 20 3c 20 75 73 61 62 6c 65 53   nByte < usableS
9e70: 69 7a 65 2d 38 20 29 3b 0a 0a 20 20 6e 46 72 61  ize-8 );..  nFra
9e80: 67 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b  g = data[hdr+7];
9e90: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9ea0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20  ->cellOffset == 
9eb0: 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61  hdr + 12 - 4*pPa
9ec0: 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61  ge->leaf );.  ga
9ed0: 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  p = pPage->cellO
9ee0: 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
9ef0: 3e 6e 43 65 6c 6c 3b 0a 20 20 74 6f 70 20 3d 20  >nCell;.  top = 
9f00: 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
9f10: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
9f20: 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29 20 72   if( gap>top ) r
9f30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
9f40: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73  RUPT_BKPT;.  tes
9f50: 74 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f  tcase( gap+2==to
9f60: 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  p );.  testcase(
9f70: 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20   gap+1==top );. 
9f80: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d   testcase( gap==
9f90: 74 6f 70 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46  top );..  if( nF
9fa0: 72 61 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f  rag>=60 ){.    /
9fb0: 2a 20 41 6c 77 61 79 73 20 64 65 66 72 61 67 6d  * Always defragm
9fc0: 65 6e 74 20 68 69 67 68 6c 79 20 66 72 61 67 6d  ent highly fragm
9fd0: 65 6e 74 65 64 20 70 61 67 65 73 20 2a 2f 0a 20  ented pages */. 
9fe0: 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65     rc = defragme
9ff0: 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  ntPage(pPage);. 
a000: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
a010: 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d  rn rc;.    top =
a020: 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f   get2byteNotZero
a030: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
a040: 20 20 7d 65 6c 73 65 20 69 66 28 20 67 61 70 2b    }else if( gap+
a050: 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20 2f 2a  2<=top ){.    /*
a060: 20 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65   Search the free
a070: 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  list looking for
a080: 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67   a free slot big
a090: 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73   enough to satis
a0a0: 66 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 72  fy .    ** the r
a0b0: 65 71 75 65 73 74 2e 20 54 68 65 20 61 6c 6c 6f  equest. The allo
a0c0: 63 61 74 69 6f 6e 20 69 73 20 6d 61 64 65 20 66  cation is made f
a0d0: 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 66 72  rom the first fr
a0e0: 65 65 20 73 6c 6f 74 20 69 6e 20 0a 20 20 20 20  ee slot in .    
a0f0: 2a 2a 20 74 68 65 20 6c 69 73 74 20 74 68 61 74  ** the list that
a100: 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
a110: 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20   to accommodate 
a120: 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  it..    */.    i
a130: 6e 74 20 70 63 2c 20 61 64 64 72 3b 0a 20 20 20  nt pc, addr;.   
a140: 20 66 6f 72 28 61 64 64 72 3d 68 64 72 2b 31 3b   for(addr=hdr+1;
a150: 20 28 70 63 20 3d 20 67 65 74 32 62 79 74 65 28   (pc = get2byte(
a160: 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 3b  &data[addr]))>0;
a170: 20 61 64 64 72 3d 70 63 29 7b 0a 20 20 20 20 20   addr=pc){.     
a180: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
a190: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
a1a0: 20 74 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a   the free slot *
a1b0: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 63 3e 75  /.      if( pc>u
a1c0: 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70  sableSize-4 || p
a1d0: 63 3c 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20  c<addr+4 ){.    
a1e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a1f0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
a200: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 69        }.      si
a210: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
a220: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
a230: 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74    if( size>=nByt
a240: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  e ){.        int
a250: 20 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74   x = size - nByt
a260: 65 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  e;.        testc
a270: 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20  ase( x==4 );.   
a280: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78       testcase( x
a290: 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==3 );.        i
a2a0: 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20  f( x<4 ){.      
a2b0: 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
a2c0: 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20  e slot from the 
a2d0: 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74  free-list. Updat
a2e0: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  e the number of.
a2f0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61            ** fra
a300: 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77 69  gmented bytes wi
a310: 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a  thin the page. *
a320: 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  /.          memc
a330: 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20  py(&data[addr], 
a340: 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20  &data[pc], 2);. 
a350: 20 20 20 20 20 20 20 20 20 64 61 74 61 5b 68 64           data[hd
a360: 72 2b 37 5d 20 3d 20 28 75 38 29 28 6e 46 72 61  r+7] = (u8)(nFra
a370: 67 20 2b 20 78 29 3b 0a 20 20 20 20 20 20 20 20  g + x);.        
a380: 7d 65 6c 73 65 20 69 66 28 20 73 69 7a 65 2b 70  }else if( size+p
a390: 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29  c > usableSize )
a3a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
a3b0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
a3c0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
a3d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
a3e0: 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72 65 6d   /* The slot rem
a3f0: 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ains on the free
a400: 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20 69 74  -list. Reduce it
a410: 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e  s size to accoun
a420: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  t.          ** f
a430: 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 75  or the portion u
a440: 73 65 64 20 62 79 20 74 68 65 20 6e 65 77 20 61  sed by the new a
a450: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  llocation. */.  
a460: 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65          put2byte
a470: 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29  (&data[pc+2], x)
a480: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a490: 20 20 20 20 2a 70 49 64 78 20 3d 20 70 63 20 2b      *pIdx = pc +
a4a0: 20 78 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   x;.        retu
a4b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
a4c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
a4d0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d  .  /* Check to m
a4e0: 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69  ake sure there i
a4f0: 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 69  s enough space i
a500: 6e 20 74 68 65 20 67 61 70 20 74 6f 20 73 61 74  n the gap to sat
a510: 69 73 66 79 0a 20 20 2a 2a 20 74 68 65 20 61 6c  isfy.  ** the al
a520: 6c 6f 63 61 74 69 6f 6e 2e 20 20 49 66 20 6e 6f  location.  If no
a530: 74 2c 20 64 65 66 72 61 67 6d 65 6e 74 2e 0a 20  t, defragment.. 
a540: 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
a550: 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70  gap+2+nByte==top
a560: 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b   );.  if( gap+2+
a570: 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20  nByte>top ){.   
a580: 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74   rc = defragment
a590: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
a5a0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
a5b0: 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67   rc;.    top = g
a5c0: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
a5d0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
a5e0: 20 20 61 73 73 65 72 74 28 20 67 61 70 2b 6e 42    assert( gap+nB
a5f0: 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a  yte<=top );.  }.
a600: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
a610: 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20  memory from the 
a620: 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74  gap in between t
a630: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
a640: 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74  array.  ** and t
a650: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
a660: 61 72 65 61 2e 20 20 54 68 65 20 62 74 72 65 65  area.  The btree
a670: 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20  InitPage() call 
a680: 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  has already.  **
a690: 20 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 66   validated the f
a6a0: 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20  reelist.  Given 
a6b0: 74 68 61 74 20 74 68 65 20 66 72 65 65 6c 69 73  that the freelis
a6c0: 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72  t is valid, ther
a6d0: 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79  e.  ** is no way
a6e0: 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61   that the alloca
a6f0: 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20  tion can extend 
a700: 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
a710: 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68  he page..  ** Th
a720: 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77  e assert() below
a730: 20 76 65 72 69 66 69 65 73 20 74 68 65 20 70 72   verifies the pr
a740: 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e  evious sentence.
a750: 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e  .  */.  top -= n
a760: 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65  Byte;.  put2byte
a770: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
a780: 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  op);.  assert( t
a790: 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74  op+nByte <= (int
a7a0: 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  )pPage->pBt->usa
a7b0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49  bleSize );.  *pI
a7c0: 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75  dx = top;.  retu
a7d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
a7e0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
a7f0: 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  section of the p
a800: 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74  Page->aData to t
a810: 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20  he freelist..** 
a820: 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
a830: 66 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62  f the new free b
a840: 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61  lock is pPage->a
a850: 44 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61  Disk[start].** a
a860: 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
a870: 68 65 20 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a  he block is "siz
a880: 65 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  e" bytes..**.** 
a890: 4d 6f 73 74 20 6f 66 20 74 68 65 20 65 66 66 6f  Most of the effo
a8a0: 72 74 20 68 65 72 65 20 69 73 20 69 6e 76 6f 6c  rt here is invol
a8b0: 76 65 64 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67  ved in coalesing
a8c0: 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65   adjacent.** fre
a8d0: 65 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20  e blocks into a 
a8e0: 73 69 6e 67 6c 65 20 62 69 67 20 66 72 65 65 20  single big free 
a8f0: 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  block..*/.static
a900: 20 69 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d   int freeSpace(M
a910: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
a920: 6e 74 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69  nt start, int si
a930: 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c  ze){.  int addr,
a940: 20 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20   pbegin, hdr;.  
a950: 69 6e 74 20 69 4c 61 73 74 3b 20 20 20 20 20 20  int iLast;      
a960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a970: 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f 73    /* Largest pos
a980: 73 69 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20  sible freeblock 
a990: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 6e 73 69  offset */.  unsi
a9a0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20  gned char *data 
a9b0: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
a9c0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
a9d0: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
a9e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
a9f0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
aa00: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
aa10: 0a 20 20 61 73 73 65 72 74 28 20 73 74 61 72 74  .  assert( start
aa20: 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  >=pPage->hdrOffs
aa30: 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c  et+6+pPage->chil
aa40: 64 50 74 72 53 69 7a 65 20 29 3b 0a 20 20 61 73  dPtrSize );.  as
aa50: 73 65 72 74 28 20 28 73 74 61 72 74 20 2b 20 73  sert( (start + s
aa60: 69 7a 65 29 20 3c 3d 20 28 69 6e 74 29 70 50 61  ize) <= (int)pPa
aa70: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
aa80: 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
aa90: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
aaa0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
aab0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
aac0: 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20  rt( size>=0 );  
aad0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
aae0: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 20   size is 4 */.. 
aaf0: 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d   if( pPage->pBt-
ab00: 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
ab10: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b  SECURE_DELETE ){
ab20: 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74  .    /* Overwrit
ab30: 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
ab40: 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
ab50: 20 77 68 65 6e 20 74 68 65 20 73 65 63 75 72 65   when the secure
ab60: 5f 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a 20 6f  _delete.    ** o
ab70: 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
ab80: 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
ab90: 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20  data[start], 0, 
aba0: 73 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  size);.  }..  /*
abb0: 20 41 64 64 20 74 68 65 20 73 70 61 63 65 20 62   Add the space b
abc0: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ack into the lin
abd0: 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65  ked list of free
abe0: 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74 65 20 74 68  blocks.  Note th
abf0: 61 74 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f  at.  ** even tho
ac00: 75 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63  ugh the freebloc
ac10: 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b  k list was check
ac20: 65 64 20 62 79 20 62 74 72 65 65 49 6e 69 74 50  ed by btreeInitP
ac30: 61 67 65 28 29 2c 0a 20 20 2a 2a 20 62 74 72 65  age(),.  ** btre
ac40: 65 49 6e 69 74 50 61 67 65 28 29 20 64 69 64 20  eInitPage() did 
ac50: 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c  not detect overl
ac60: 61 70 70 69 6e 67 20 63 65 6c 6c 73 20 6f 72 0a  apping cells or.
ac70: 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 20    ** freeblocks 
ac80: 74 68 61 74 20 6f 76 65 72 6c 61 70 70 65 64 20  that overlapped 
ac90: 63 65 6c 6c 73 2e 20 20 20 4e 6f 72 20 64 6f 65  cells.   Nor doe
aca0: 73 20 69 74 20 64 65 74 65 63 74 20 77 68 65 6e  s it detect when
acb0: 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 20 63   the.  ** cell c
acc0: 6f 6e 74 65 6e 74 20 61 72 65 61 20 65 78 63 65  ontent area exce
acd0: 65 64 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e  eds the value in
ace0: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
acf0: 2e 20 20 49 66 20 74 68 65 73 65 0a 20 20 2a 2a  .  If these.  **
ad00: 20 73 69 74 75 61 74 69 6f 6e 73 20 61 72 69 73   situations aris
ad10: 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65  e, then subseque
ad20: 6e 74 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74  nt insert operat
ad30: 69 6f 6e 73 20 6d 69 67 68 74 20 63 6f 72 72 75  ions might corru
ad40: 70 74 0a 20 20 2a 2a 20 74 68 65 20 66 72 65 65  pt.  ** the free
ad50: 6c 69 73 74 2e 20 20 53 6f 20 77 65 20 64 6f 20  list.  So we do 
ad60: 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66 6f  need to check fo
ad70: 72 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 68 69  r corruption whi
ad80: 6c 65 20 73 63 61 6e 6e 69 6e 67 0a 20 20 2a 2a  le scanning.  **
ad90: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20   the freelist.. 
ada0: 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67   */.  hdr = pPag
adb0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
adc0: 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a  addr = hdr + 1;.
add0: 20 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d    iLast = pPage-
ade0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
adf0: 20 2d 20 34 3b 0a 20 20 61 73 73 65 72 74 28 20   - 4;.  assert( 
ae00: 73 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a  start<=iLast );.
ae10: 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e    while( (pbegin
ae20: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
ae30: 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74 20  a[addr]))<start 
ae40: 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20  && pbegin>0 ){. 
ae50: 20 20 20 69 66 28 20 70 62 65 67 69 6e 3c 61 64     if( pbegin<ad
ae60: 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 72 65  dr+4 ){.      re
ae70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
ae80: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
ae90: 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69      addr = pbegi
aea0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 62 65  n;.  }.  if( pbe
aeb0: 67 69 6e 3e 69 4c 61 73 74 20 29 7b 0a 20 20 20  gin>iLast ){.   
aec0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
aed0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
aee0: 0a 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69  .  assert( pbegi
aef0: 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67 69 6e  n>addr || pbegin
af00: 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62 79 74  ==0 );.  put2byt
af10: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 73  e(&data[addr], s
af20: 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62 79 74  tart);.  put2byt
af30: 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20  e(&data[start], 
af40: 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74 32 62  pbegin);.  put2b
af50: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 2b  yte(&data[start+
af60: 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50 61  2], size);.  pPa
af70: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61 67  ge->nFree = pPag
af80: 65 2d 3e 6e 46 72 65 65 20 2b 20 28 75 31 36 29  e->nFree + (u16)
af90: 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c  size;..  /* Coal
afa0: 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20 66 72  esce adjacent fr
afb0: 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61  ee blocks */.  a
afc0: 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  ddr = hdr + 1;. 
afd0: 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20   while( (pbegin 
afe0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
aff0: 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20  [addr]))>0 ){.  
b000: 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70 73 69    int pnext, psi
b010: 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73 73 65 72  ze, x;.    asser
b020: 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29  t( pbegin>addr )
b030: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62  ;.    assert( pb
b040: 65 67 69 6e 20 3c 3d 20 28 69 6e 74 29 70 50 61  egin <= (int)pPa
b050: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
b060: 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65  ize-4 );.    pne
b070: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
b080: 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20  ata[pbegin]);.  
b090: 20 20 70 73 69 7a 65 20 3d 20 67 65 74 32 62 79    psize = get2by
b0a0: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b  te(&data[pbegin+
b0b0: 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 62 65  2]);.    if( pbe
b0c0: 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20 33 20  gin + psize + 3 
b0d0: 3e 3d 20 70 6e 65 78 74 20 26 26 20 70 6e 65 78  >= pnext && pnex
b0e0: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  t>0 ){.      int
b0f0: 20 66 72 61 67 20 3d 20 70 6e 65 78 74 20 2d 20   frag = pnext - 
b100: 28 70 62 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a  (pbegin+psize);.
b110: 20 20 20 20 20 20 69 66 28 20 28 66 72 61 67 3c        if( (frag<
b120: 30 29 20 7c 7c 20 28 66 72 61 67 3e 28 69 6e 74  0) || (frag>(int
b130: 29 64 61 74 61 5b 68 64 72 2b 37 5d 29 20 29 7b  )data[hdr+7]) ){
b140: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
b150: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
b160: 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
b170: 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d     data[hdr+7] -
b180: 3d 20 28 75 38 29 66 72 61 67 3b 0a 20 20 20 20  = (u8)frag;.    
b190: 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28 26    x = get2byte(&
b1a0: 64 61 74 61 5b 70 6e 65 78 74 5d 29 3b 0a 20 20  data[pnext]);.  
b1b0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
b1c0: 74 61 5b 70 62 65 67 69 6e 5d 2c 20 78 29 3b 0a  ta[pbegin], x);.
b1d0: 20 20 20 20 20 20 78 20 3d 20 70 6e 65 78 74 20        x = pnext 
b1e0: 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  + get2byte(&data
b1f0: 5b 70 6e 65 78 74 2b 32 5d 29 20 2d 20 70 62 65  [pnext+2]) - pbe
b200: 67 69 6e 3b 0a 20 20 20 20 20 20 70 75 74 32 62  gin;.      put2b
b210: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
b220: 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 7d 65 6c  +2], x);.    }el
b230: 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  se{.      addr =
b240: 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20   pbegin;.    }. 
b250: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
b260: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
b270: 61 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 20  a begins with a 
b280: 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76  freeblock, remov
b290: 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64  e it. */.  if( d
b2a0: 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61  ata[hdr+1]==data
b2b0: 5b 68 64 72 2b 35 5d 20 26 26 20 64 61 74 61 5b  [hdr+5] && data[
b2c0: 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72  hdr+2]==data[hdr
b2d0: 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 74  +6] ){.    int t
b2e0: 6f 70 3b 0a 20 20 20 20 70 62 65 67 69 6e 20 3d  op;.    pbegin =
b2f0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b300: 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d  hdr+1]);.    mem
b310: 63 70 79 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  cpy(&data[hdr+1]
b320: 2c 20 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c  , &data[pbegin],
b330: 20 32 29 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67   2);.    top = g
b340: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
b350: 72 2b 35 5d 29 20 2b 20 67 65 74 32 62 79 74 65  r+5]) + get2byte
b360: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
b370: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
b380: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f  &data[hdr+5], to
b390: 70 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  p);.  }.  assert
b3a0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
b3b0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
b3c0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72  >pDbPage) );.  r
b3d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b3e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65  .}../*.** Decode
b3f0: 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
b400: 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20  (the first byte 
b410: 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66  of the header) f
b420: 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64  or a page.** and
b430: 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c   initialize fiel
b440: 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ds of the MemPag
b450: 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f  e structure acco
b460: 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f  rdingly..**.** O
b470: 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  nly the followin
b480: 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61  g combinations a
b490: 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41  re supported.  A
b4a0: 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e  nything differen
b4b0: 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61  t.** indicates a
b4c0: 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
b4d0: 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  e files:.**.**  
b4e0: 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44         PTF_ZEROD
b4f0: 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  ATA.**         P
b500: 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54  TF_ZERODATA | PT
b510: 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20  F_LEAF.**       
b520: 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c    PTF_LEAFDATA |
b530: 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20   PTF_INTKEY.**  
b540: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
b550: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
b560: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73   | PTF_LEAF.*/.s
b570: 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65  tatic int decode
b580: 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70  Flags(MemPage *p
b590: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79  Page, int flagBy
b5a0: 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  te){.  BtShared 
b5b0: 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63  *pBt;     /* A c
b5c0: 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42  opy of pPage->pB
b5d0: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
b5e0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
b5f0: 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  ==(pPage->pgno==
b600: 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a  1 ? 100 : 0) );.
b610: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
b620: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
b630: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
b640: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66  );.  pPage->leaf
b650: 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74 65   = (u8)(flagByte
b660: 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20 50  >>3);  assert( P
b670: 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20  TF_LEAF == 1<<3 
b680: 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d  );.  flagByte &=
b690: 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50   ~PTF_LEAF;.  pP
b6a0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
b6b0: 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c  e = 4-4*pPage->l
b6c0: 65 61 66 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  eaf;.  pBt = pPa
b6d0: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66  ge->pBt;.  if( f
b6e0: 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45  lagByte==(PTF_LE
b6f0: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
b700: 4b 45 59 29 20 29 7b 0a 20 20 20 20 70 50 61 67  KEY) ){.    pPag
b710: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20  e->intKey = 1;. 
b720: 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74     pPage->hasDat
b730: 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b  a = pPage->leaf;
b740: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c  .    pPage->maxL
b750: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c  ocal = pBt->maxL
b760: 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  eaf;.    pPage->
b770: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  minLocal = pBt->
b780: 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65  minLeaf;.  }else
b790: 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 50   if( flagByte==P
b7a0: 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20  TF_ZERODATA ){. 
b7b0: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
b7c0: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d   = 0;.    pPage-
b7d0: 3e 68 61 73 44 61 74 61 20 3d 20 30 3b 0a 20 20  >hasData = 0;.  
b7e0: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
b7f0: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  l = pBt->maxLoca
b800: 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69  l;.    pPage->mi
b810: 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69  nLocal = pBt->mi
b820: 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b  nLocal;.  }else{
b830: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
b840: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
b850: 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61  .  }.  pPage->ma
b860: 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
b870: 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  pBt->max1bytePay
b880: 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  load;.  return S
b890: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
b8a0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
b8b0: 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f  e auxiliary info
b8c0: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69  rmation for a di
b8d0: 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  sk block..**.** 
b8e0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
b8f0: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
b900: 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65   we see that the
b910: 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   page does.** no
b920: 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c  t contain a well
b930: 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
b940: 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75   page, then retu
b950: 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f  rn .** SQLITE_CO
b960: 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61  RRUPT.  Note tha
b970: 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51  t a return of SQ
b980: 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74  LITE_OK does not
b990: 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68  .** guarantee th
b9a0: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77  at the page is w
b9b0: 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20  ell-formed.  It 
b9c0: 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a  only shows that.
b9d0: 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20  ** we failed to 
b9e0: 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75  detect any corru
b9f0: 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
ba00: 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61   int btreeInitPa
ba10: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
ba20: 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  e){..  assert( p
ba30: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
ba40: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ba50: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
ba60: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
ba70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
ba80: 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65  ge->pgno==sqlite
ba90: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
baa0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
bab0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
bac0: 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61  age == sqlite3Pa
bad0: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
bae0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
baf0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
bb00: 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33  aData == sqlite3
bb10: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
bb20: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
bb30: 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69  .  if( !pPage->i
bb40: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75 31 36  sInit ){.    u16
bb50: 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
bb60: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20  /* Address of a 
bb70: 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e  freeblock within
bb80: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20   pPage->aData[] 
bb90: 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20 20  */.    u8 hdr;  
bba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
bbb0: 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67  set to beginning
bbc0: 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20   of page header 
bbd0: 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b  */.    u8 *data;
bbe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75            /* Equ
bbf0: 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61  al to pPage->aDa
bc00: 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72  ta */.    BtShar
bc10: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
bc20: 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65  /* The main btre
bc30: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
bc40: 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a     int usableSiz
bc50: 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20  e;    /* Amount 
bc60: 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20  of usable space 
bc70: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  on each page */.
bc80: 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73      u16 cellOffs
bc90: 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74  et;    /* Offset
bca0: 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70   from start of p
bcb0: 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c  age to first cel
bcc0: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
bcd0: 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
bce0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
bcf0: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e   unused bytes on
bd00: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
bd10: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
bd20: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
bd30: 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  e of the cell co
bd40: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
bd50: 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
bd60: 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c  ;    /* First al
bd70: 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20  lowable cell or 
bd80: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
bd90: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c   */.    int iCel
bda0: 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61  lLast;     /* La
bdb0: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
bdc0: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66   or freeblock of
bdd0: 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74  fset */..    pBt
bde0: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a   = pPage->pBt;..
bdf0: 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d      hdr = pPage-
be00: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  >hdrOffset;.    
be10: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
be20: 61 74 61 3b 0a 20 20 20 20 69 66 28 20 64 65 63  ata;.    if( dec
be30: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
be40: 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74  data[hdr]) ) ret
be50: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
be60: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  PT_BKPT;.    ass
be70: 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69  ert( pBt->pageSi
be80: 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e  ze>=512 && pBt->
be90: 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20  pageSize<=65536 
bea0: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  );.    pPage->ma
beb0: 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70  skPage = (u16)(p
bec0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
bed0: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f  );.    pPage->nO
bee0: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
bef0: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42   usableSize = pB
bf00: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
bf10: 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66     pPage->cellOf
bf20: 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  fset = cellOffse
bf30: 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34  t = hdr + 12 - 4
bf40: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20  *pPage->leaf;.  
bf50: 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e    pPage->aDataEn
bf60: 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65  d = &data[usable
bf70: 53 69 7a 65 5d 3b 0a 20 20 20 20 70 50 61 67 65  Size];.    pPage
bf80: 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61  ->aCellIdx = &da
bf90: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a  ta[cellOffset];.
bfa0: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
bfb0: 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
bfc0: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61  hdr+5]);.    pPa
bfd0: 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32  ge->nCell = get2
bfe0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
bff0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ]);.    if( pPag
c000: 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c  e->nCell>MX_CELL
c010: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
c020: 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20  * To many cells 
c030: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67  for a single pag
c040: 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73  e.  The page mus
c050: 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a  t be corrupt */.
c060: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
c070: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
c080: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74  ;.    }.    test
c090: 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65  case( pPage->nCe
c0a0: 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ll==MX_CELL(pBt)
c0b0: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61   );..    /* A ma
c0c0: 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  lformed database
c0d0: 20 70 61 67 65 20 6d 69 67 68 74 20 63 61 75 73   page might caus
c0e0: 65 20 75 73 20 74 6f 20 72 65 61 64 20 70 61 73  e us to read pas
c0f0: 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a  t the end.    **
c100: 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70 61   of page when pa
c110: 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a  rsing a cell.  .
c120: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
c130: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
c140: 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b 73  k of code checks
c150: 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69 66   early to see if
c160: 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a   a cell extends.
c170: 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20      ** past the 
c180: 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62 6f  end of a page bo
c190: 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73 65  undary and cause
c1a0: 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  s SQLITE_CORRUPT
c1b0: 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 72   to be .    ** r
c1c0: 65 74 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f  eturned if it do
c1d0: 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  es..    */.    i
c1e0: 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c  CellFirst = cell
c1f0: 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
c200: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65  ->nCell;.    iCe
c210: 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53  llLast = usableS
c220: 69 7a 65 20 2d 20 34 3b 0a 23 69 66 20 64 65 66  ize - 4;.#if def
c230: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
c240: 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c  LE_OVERSIZE_CELL
c250: 5f 43 48 45 43 4b 29 0a 20 20 20 20 7b 0a 20 20  _CHECK).    {.  
c260: 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
c270: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
c280: 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  nto the cell poi
c290: 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
c2a0: 20 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20      int sz;     
c2b0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
c2c0: 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20   a cell */..    
c2d0: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
c2e0: 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d  af ) iCellLast--
c2f0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
c300: 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
c310: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
c320: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
c330: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a  ta[cellOffset+i*
c340: 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  2]);.        tes
c350: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
c360: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20 20  First );.       
c370: 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69   testcase( pc==i
c380: 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20  CellLast );.    
c390: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
c3a0: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
c3b0: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20  lLast ){.       
c3c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c3d0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
c3e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c3f0: 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74   sz = cellSizePt
c400: 72 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70  r(pPage, &data[p
c410: 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  c]);.        tes
c420: 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73  tcase( pc+sz==us
c430: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
c440: 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73      if( pc+sz>us
c450: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
c460: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
c470: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
c480: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c490: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
c4a0: 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65  Page->leaf ) iCe
c4b0: 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20  llLast++;.    } 
c4c0: 20 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a   .#endif..    /*
c4d0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
c4e0: 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e  al free space on
c4f0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
c500: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
c510: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
c520: 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68    nFree = data[h
c530: 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 0a 20 20 20  dr+7] + top;.   
c540: 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a   while( pc>0 ){.
c550: 20 20 20 20 20 20 75 31 36 20 6e 65 78 74 2c 20        u16 next, 
c560: 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  size;.      if( 
c570: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
c580: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
c590: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72  .        /* Star
c5a0: 74 20 6f 66 20 66 72 65 65 20 62 6c 6f 63 6b 20  t of free block 
c5b0: 69 73 20 6f 66 66 20 74 68 65 20 70 61 67 65 20  is off the page 
c5c0: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
c5d0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c5e0: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a  _BKPT; .      }.
c5f0: 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
c600: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29  2byte(&data[pc])
c610: 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67  ;.      size = g
c620: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
c630: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
c640: 28 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c  (next>0 && next<
c650: 3d 70 63 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70  =pc+size+3) || p
c660: 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a  c+size>usableSiz
c670: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
c680: 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74  Free blocks must
c690: 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67   be in ascending
c6a0: 20 6f 72 64 65 72 2e 20 41 6e 64 20 74 68 65 20   order. And the 
c6b0: 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 20 20 20  last byte of.   
c6c0: 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65       ** the free
c6d0: 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20  -block must lie 
c6e0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
c6f0: 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
c700: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c710: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
c720: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72       }.      nFr
c730: 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a  ee = nFree + siz
c740: 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65  e;.      pc = ne
c750: 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  xt;.    }..    /
c760: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
c770: 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20   nFree contains 
c780: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f  the sum of the o
c790: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
c7a0: 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  rt.    ** of the
c7b0: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72   cell-content ar
c7c0: 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62  ea plus the numb
c7d0: 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73  er of free bytes
c7e0: 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74   within.    ** t
c7f0: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
c800: 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73  area. If this is
c810: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
c820: 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20  e usable-size.  
c830: 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65    ** of the page
c840: 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
c850: 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65  must be corrupte
c860: 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c  d. This check al
c870: 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73  so.    ** serves
c880: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
c890: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
c8a0: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  e start of the c
c8b0: 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20  ell-content.    
c8c0: 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69  ** area, accordi
c8d0: 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  ng to the page h
c8e0: 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68  eader, lies with
c8f0: 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20  in the page..   
c900: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65   */.    if( nFre
c910: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
c920: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
c930: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
c940: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  ; .    }.    pPa
c950: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36  ge->nFree = (u16
c960: 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46  )(nFree - iCellF
c970: 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67 65  irst);.    pPage
c980: 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20  ->isInit = 1;.  
c990: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
c9a0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
c9b0: 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65  et up a raw page
c9c0: 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b   so that it look
c9d0: 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73  s like a databas
c9e0: 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a  e page holding.*
c9f0: 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  * no entries..*/
ca00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72  .static void zer
ca10: 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  oPage(MemPage *p
ca20: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  Page, int flags)
ca30: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
ca40: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
ca50: 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72  >aData;.  BtShar
ca60: 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
ca70: 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d  >pBt;.  u8 hdr =
ca80: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
ca90: 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a  t;.  u16 first;.
caa0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
cab0: 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
cac0: 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
cad0: 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29  )==pPage->pgno )
cae0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
caf0: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
cb00: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
cb10: 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
cb20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
cb30: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
cb40: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
cb50: 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61  ) == data );.  a
cb60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
cb70: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
cb80: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
cb90: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
cba0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
cbb0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
cbc0: 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
cbd0: 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
cbe0: 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d  ELETE ){.    mem
cbf0: 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20  set(&data[hdr], 
cc00: 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  0, pBt->usableSi
cc10: 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20  ze - hdr);.  }. 
cc20: 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68   data[hdr] = (ch
cc30: 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73  ar)flags;.  firs
cc40: 74 20 3d 20 68 64 72 20 2b 20 28 28 66 6c 61 67  t = hdr + ((flag
cc50: 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f  s&PTF_LEAF)==0 ?
cc60: 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73   12 : 8);.  mems
cc70: 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
cc80: 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68   0, 4);.  data[h
cc90: 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74  dr+7] = 0;.  put
cca0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
ccb0: 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  5], pBt->usableS
ccc0: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
ccd0: 46 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74  Free = (u16)(pBt
cce0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66  ->usableSize - f
ccf0: 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46  irst);.  decodeF
cd00: 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67  lags(pPage, flag
cd10: 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c  s);.  pPage->cel
cd20: 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b  lOffset = first;
cd30: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45  .  pPage->aDataE
cd40: 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e  nd = &data[pBt->
cd50: 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70  usableSize];.  p
cd60: 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d  Page->aCellIdx =
cd70: 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20   &data[first];. 
cd80: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
cd90: 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  w = 0;.  assert(
cda0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d   pBt->pageSize>=
cdb0: 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65  512 && pBt->page
cdc0: 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20  Size<=65536 );. 
cdd0: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
cde0: 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61   = (u16)(pBt->pa
cdf0: 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70  geSize - 1);.  p
ce00: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b  Page->nCell = 0;
ce10: 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
ce20: 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 1;.}.../*.** 
ce30: 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65  Convert a DbPage
ce40: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74   obtained from t
ce50: 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20  he pager into a 
ce60: 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a  MemPage used by.
ce70: 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  ** the btree lay
ce80: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65  er..*/.static Me
ce90: 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65  mPage *btreePage
cea0: 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67  FromDbPage(DbPag
ceb0: 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f  e *pDbPage, Pgno
cec0: 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20   pgno, BtShared 
ced0: 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65  *pBt){.  MemPage
cee0: 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61   *pPage = (MemPa
cef0: 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  ge*)sqlite3Pager
cf00: 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
cf10: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  );.  pPage->aDat
cf20: 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  a = sqlite3Pager
cf30: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
cf40: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61  ;.  pPage->pDbPa
cf50: 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  ge = pDbPage;.  
cf60: 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74  pPage->pBt = pBt
cf70: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20  ;.  pPage->pgno 
cf80: 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d  = pgno;.  pPage-
cf90: 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  >hdrOffset = pPa
cfa0: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
cfb0: 30 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  0 : 0;.  return 
cfc0: 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage; .}../*.**
cfd0: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
cfe0: 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69   the pager.  Ini
cff0: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
d000: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
d010: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
d020: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
d030: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f  .**.** If the no
d040: 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20  Content flag is 
d050: 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
d060: 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
d070: 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63  e about.** the c
d080: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
d090: 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ge at this time.
d0a0: 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74    So do not go t
d0b0: 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f  o the disk.** to
d0c0: 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65   fetch the conte
d0d0: 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  nt.  Just fill i
d0e0: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69  n the content wi
d0f0: 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77  th zeros for now
d100: 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66  ..** If in the f
d110: 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71  uture we call sq
d120: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
d130: 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20  ) on this page, 
d140: 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65  that.** means we
d150: 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f   have started to
d160: 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62   be concerned ab
d170: 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  out content and 
d180: 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  the disk.** read
d190: 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74   should occur at
d1a0: 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   that point..*/.
d1b0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
d1c0: 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  GetPage(.  BtSha
d1d0: 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
d1e0: 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
d1f0: 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
d200: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
d210: 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
d220: 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61  fetch */.  MemPa
d230: 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
d240: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  /* Return the pa
d250: 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d  ge in this param
d260: 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  eter */.  int fl
d270: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
d280: 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  * PAGER_GET_NOCO
d290: 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47  NTENT or PAGER_G
d2a0: 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29  ET_READONLY */.)
d2b0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62  {.  int rc;.  Db
d2c0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a  Page *pDbPage;..
d2d0: 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
d2e0: 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47  =0 || flags==PAG
d2f0: 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
d300: 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52   || flags==PAGER
d310: 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b  _GET_READONLY );
d320: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d330: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
d340: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
d350: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
d360: 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61  Acquire(pBt->pPa
d370: 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61  ger, pgno, (DbPa
d380: 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66  ge**)&pDbPage, f
d390: 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20  lags);.  if( rc 
d3a0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
d3b0: 70 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61  ppPage = btreePa
d3c0: 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
d3d0: 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
d3e0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
d3f0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
d400: 65 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66  etrieve a page f
d410: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61  rom the pager ca
d420: 63 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75  che. If the requ
d430: 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
d440: 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20  t.** already in 
d450: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
d460: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69  return NULL. Ini
d470: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
d480: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
d490: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
d4a0: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
d4b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61  .*/.static MemPa
d4c0: 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f  ge *btreePageLoo
d4d0: 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  kup(BtShared *pB
d4e0: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
d4f0: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
d500: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
d510: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
d520: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
d530: 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65  pDbPage = sqlite
d540: 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74  3PagerLookup(pBt
d550: 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  ->pPager, pgno);
d560: 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29  .  if( pDbPage )
d570: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  {.    return btr
d580: 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
d590: 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
d5a0: 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pBt);.  }.  retu
d5b0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
d5c0: 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
d5d0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
d5e0: 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66  ile in pages. If
d5f0: 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69   there is any ki
d600: 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20  nd of.** error, 
d610: 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65  return ((unsigne
d620: 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74  d int)-1)..*/.st
d630: 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50  atic Pgno btreeP
d640: 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65  agecount(BtShare
d650: 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72  d *pBt){.  retur
d660: 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a  n pBt->nPage;.}.
d670: 75 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65  u32 sqlite3Btree
d680: 4c 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a  LastPage(Btree *
d690: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  p){.  assert( sq
d6a0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
d6b0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
d6c0: 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e  ert( ((p->pBt->n
d6d0: 50 61 67 65 29 26 30 78 38 30 30 30 30 30 30 29  Page)&0x8000000)
d6e0: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
d6f0: 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
d700: 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pBt);.}../*.**
d710: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
d720: 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69   the pager and i
d730: 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54  nitialize it.  T
d740: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a  his routine is j
d750: 75 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69  ust a.** conveni
d760: 65 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f  ence wrapper aro
d770: 75 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c  und separate cal
d780: 6c 73 20 74 6f 20 62 74 72 65 65 47 65 74 50 61  ls to btreeGetPa
d790: 67 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72  ge() and .** btr
d7a0: 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a  eeInitPage()..**
d7b0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
d7c0: 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
d7d0: 20 76 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69   value *ppPage i
d7e0: 73 20 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65  s set to is unde
d7f0: 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79  fined. It.** may
d800: 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65   remain unchange
d810: 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20  d, or it may be 
d820: 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69  set to an invali
d830: 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  d value..*/.stat
d840: 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69  ic int getAndIni
d850: 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
d860: 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
d870: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
d880: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
d890: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
d8c0: 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20  the page to get 
d8d0: 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
d8e0: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
d8f0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
d900: 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68  e page pointer h
d910: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  ere */.  int bRe
d920: 61 64 6f 6e 6c 79 20 20 20 20 20 20 20 20 20 20  adonly          
d930: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
d940: 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 6f  R_GET_READONLY o
d950: 72 20 30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  r 0 */.){.  int 
d960: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
d970: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d980: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
d990: 20 20 61 73 73 65 72 74 28 20 62 52 65 61 64 6f    assert( bReado
d9a0: 6e 6c 79 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52  nly==PAGER_GET_R
d9b0: 45 41 44 4f 4e 4c 59 20 7c 7c 20 62 52 65 61 64  EADONLY || bRead
d9c0: 6f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  only==0 );..  if
d9d0: 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65  ( pgno>btreePage
d9e0: 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
d9f0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
da00: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65  RRUPT_BKPT;.  }e
da10: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  lse{.    rc = bt
da20: 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
da30: 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 52  pgno, ppPage, bR
da40: 65 61 64 6f 6e 6c 79 29 3b 0a 20 20 20 20 69 66  eadonly);.    if
da50: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
da60: 26 26 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73  && (*ppPage)->is
da70: 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Init==0 ){.     
da80: 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
da90: 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
daa0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
dab0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
dac0: 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
dad0: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
dae0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 74 65 73 74     }.  }..  test
daf0: 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b  case( pgno==0 );
db00: 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
db10: 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
db20: 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65  _CORRUPT );.  re
db30: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
db40: 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50  * Release a MemP
db50: 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  age.  This shoul
db60: 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  d be called once
db70: 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a   for each prior.
db80: 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
db90: 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  GetPage..*/.stat
dba0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
dbb0: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
dbc0: 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  ge){.  if( pPage
dbd0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
dbe0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
dbf0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
dc00: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73  e->pBt );.    as
dc10: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62  sert( pPage->pDb
dc20: 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 61  Page!=0 );.    a
dc30: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
dc40: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
dc50: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
dc60: 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
dc70: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
dc80: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
dc90: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
dca0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
dcb0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
dcc0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
dcd0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
dce0: 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
dcf0: 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
dd00: 6c 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  l(pPage->pDbPage
dd10: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
dd20: 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  During a rollbac
dd30: 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  k, when the page
dd40: 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d  r reloads inform
dd50: 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63  ation into the c
dd60: 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ache.** so that 
dd70: 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73  the cache is res
dd80: 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
dd90: 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74  ginal state at t
dda0: 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
ddb0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
ddc0: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65  for each page re
ddd0: 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74  stored this rout
dde0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
ddf0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
de00: 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74  e needs to reset
de10: 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20   the extra data 
de20: 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65  section at the e
de30: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd of the.** pag
de40: 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  e to agree with 
de50: 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74  the restored dat
de60: 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
de70: 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50  d pageReinit(DbP
de80: 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d  age *pData){.  M
de90: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
dea0: 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
deb0: 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
dec0: 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b  GetExtra(pData);
ded0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
dee0: 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
def0: 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a  unt(pData)>0 );.
df00: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
df10: 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nit ){.    asser
df20: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
df30: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
df40: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
df50: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
df60: 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
df70: 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
df80: 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a  unt(pData)>1 ){.
df90: 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d        /* pPage m
dfa0: 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74  ight not be a bt
dfb0: 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69  ree page;  it mi
dfc0: 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  ght be an overfl
dfd0: 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
dfe0: 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20   or ptrmap page 
dff0: 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20  or a free page. 
e000: 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c   In those cases,
e010: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
e020: 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20       ** call to 
e030: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
e040: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75  will likely retu
e050: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
e060: 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  T..      ** But 
e070: 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20  no harm is done 
e080: 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74  by this.  And it
e090: 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61   is very importa
e0a0: 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  nt that.      **
e0b0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
e0c0: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76   be called on ev
e0d0: 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73  ery btree page s
e0e0: 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20  o we make.      
e0f0: 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20  ** the call for 
e100: 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20  every page that 
e110: 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d  comes in for re-
e120: 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  initing. */.    
e130: 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28    btreeInitPage(
e140: 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
e150: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
e160: 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
e170: 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a  er for a btree..
e180: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
e190: 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
e1a0: 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29  dler(void *pArg)
e1b0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
e1c0: 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70  t = (BtShared*)p
e1d0: 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Arg;.  assert( p
e1e0: 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65  Bt->db );.  asse
e1f0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
e200: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e  x_held(pBt->db->
e210: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
e220: 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  rn sqlite3Invoke
e230: 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74  BusyHandler(&pBt
e240: 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65  ->db->busyHandle
e250: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  r);.}../*.** Ope
e260: 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
e270: 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e  e..** .** zFilen
e280: 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
e290: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
e2a0: 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e  file.  If zFilen
e2b0: 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74  ame is NULL.** t
e2c0: 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  hen an ephemeral
e2d0: 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
e2e0: 61 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d  ated.  The ephem
e2f0: 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69  eral database mi
e300: 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73  ght.** be exclus
e310: 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c  ively in memory,
e320: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65   or it might use
e330: 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65   a disk-based me
e340: 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45  mory cache..** E
e350: 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65  ither way, the e
e360: 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
e370: 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  e will be automa
e380: 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
e390: 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33  .** when sqlite3
e3a0: 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20  BtreeClose() is 
e3b0: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
e3c0: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
e3d0: 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e  memory:" then an
e3e0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
e3f0: 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ase is created.*
e400: 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61  * that is automa
e410: 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65  tically destroye
e420: 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  d when it is clo
e430: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  sed..**.** The "
e440: 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72  flags" parameter
e450: 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68   is a bitmask th
e460: 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  at might contain
e470: 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54   bits like.** BT
e480: 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  REE_OMIT_JOURNAL
e490: 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45   and/or BTREE_ME
e4a0: 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  MORY..**.** If t
e4b0: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
e4c0: 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e  lready opened in
e4d0: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
e4e0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
e4f0: 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73   and we are in s
e500: 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65  hared cache mode
e510: 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20  , then the open 
e520: 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61  will fail with a
e530: 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53  n.** SQLITE_CONS
e540: 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57  TRAINT error.  W
e550: 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74  e cannot allow t
e560: 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61  wo or more BtSha
e570: 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69  red.** objects i
e580: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
e590: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  ase connection s
e5a0: 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69  ince doing so wi
e5b0: 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72  ll lead.** to pr
e5c0: 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b  oblems with lock
e5d0: 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
e5e0: 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20  te3BtreeOpen(.  
e5f0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
e600: 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74  s,      /* VFS t
e610: 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62  o use for this b
e620: 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  -tree */.  const
e630: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
e640: 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
e650: 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  e file containin
e660: 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61  g the BTree data
e670: 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
e680: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
e690: 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20    /* Associated 
e6a0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
e6b0: 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42  */.  Btree **ppB
e6c0: 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  tree,        /* 
e6d0: 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42  Pointer to new B
e6e0: 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74  tree object writ
e6f0: 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ten here */.  in
e700: 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
e710: 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73        /* Options
e720: 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
e730: 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
e740: 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
e750: 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
e760: 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
e770: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
e780: 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Bt = 0;         
e790: 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61      /* Shared pa
e7a0: 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75  rt of btree stru
e7b0: 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65  cture */.  Btree
e7c0: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
e7d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
e7e0: 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  dle to return */
e7f0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
e800: 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b   *mutexOpen = 0;
e810: 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20    /* Prevents a 
e820: 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20  race condition. 
e830: 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a  Ticket #3537 */.
e840: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
e850: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
e860: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
e870: 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
e880: 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65  on */.  u8 nRese
e890: 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rve;            
e8a0: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
e8b0: 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f  f unused space o
e8c0: 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
e8d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
e8e0: 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20  DbHeader[100];  
e8f0: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64  /* Database head
e900: 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  er content */.. 
e910: 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e   /* True if open
e920: 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ing an ephemeral
e930: 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  , temporary data
e940: 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  base */.  const 
e950: 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a  int isTempDb = z
e960: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
e970: 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a  Filename[0]==0;.
e980: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61  .  /* Set the va
e990: 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74  riable isMemdb t
e9a0: 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e  o true for an in
e9b0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
e9c0: 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65  , or .  ** false
e9d0: 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65   for a file-base
e9e0: 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  d database..  */
e9f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
ea00: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63  MIT_MEMORYDB.  c
ea10: 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
ea20: 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f   = 0;.#else.  co
ea30: 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
ea40: 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  = (zFilename && 
ea50: 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
ea60: 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  , ":memory:")==0
ea70: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
ea80: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54           || (isT
ea90: 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33  empDb && sqlite3
eaa0: 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29  TempInMemory(db)
eab0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
eac0: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73           || (vfs
ead0: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
eae0: 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a  PEN_MEMORY)!=0;.
eaf0: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
eb00: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
eb10: 65 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a  ert( pVfs!=0 );.
eb20: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
eb30: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
eb40: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
eb50: 65 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66  ert( (flags&0xff
eb60: 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a  )==flags );   /*
eb70: 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20   flags fit in 8 
eb80: 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e  bits */..  /* On
eb90: 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c  ly a BTREE_SINGL
eba0: 45 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  E database can b
ebb0: 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  e BTREE_UNORDERE
ebc0: 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  D */.  assert( (
ebd0: 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e  flags & BTREE_UN
ebe0: 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28  ORDERED)==0 || (
ebf0: 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49  flags & BTREE_SI
ec00: 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f  NGLE)!=0 );..  /
ec10: 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  * A BTREE_SINGLE
ec20: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77   database is alw
ec30: 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ays a temporary 
ec40: 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c  and/or ephemeral
ec50: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
ec60: 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
ec70: 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d  GLE)==0 || isTem
ec80: 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73  pDb );..  if( is
ec90: 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61  Memdb ){.    fla
eca0: 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f  gs |= BTREE_MEMO
ecb0: 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76  RY;.  }.  if( (v
ecc0: 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
ecd0: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d  _OPEN_MAIN_DB)!=
ece0: 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c  0 && (isMemdb ||
ecf0: 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20   isTempDb) ){.  
ed00: 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66    vfsFlags = (vf
ed10: 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45  sFlags & ~SQLITE
ed20: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c  _OPEN_MAIN_DB) |
ed30: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
ed40: 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  P_DB;.  }.  p = 
ed50: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
ed60: 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29  o(sizeof(Btree))
ed70: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
ed80: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ed90: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e  NOMEM;.  }.  p->
eda0: 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
edb0: 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  NONE;.  p->db = 
edc0: 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
edd0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
ede0: 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70  ACHE.  p->lock.p
edf0: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e  Btree = p;.  p->
ee00: 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b  lock.iTable = 1;
ee10: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
ee20: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
ee30: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
ee40: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
ee50: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
ee60: 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    /*.  ** If thi
ee70: 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e  s Btree is a can
ee80: 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65  didate for share
ee90: 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20  d cache, try to 
eea0: 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69  find an.  ** exi
eeb0: 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f  sting BtShared o
eec0: 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61  bject that we ca
eed0: 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a  n share with.  *
eee0: 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44 62  /.  if( isTempDb
eef0: 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d  ==0 && (isMemdb=
ef00: 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26  =0 || (vfsFlags&
ef10: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
ef20: 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20  !=0) ){.    if( 
ef30: 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
ef40: 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
ef50: 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  HE ){.      int 
ef60: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  nFullPathname = 
ef70: 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
ef80: 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +1;.      char *
ef90: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
efa0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46  sqlite3Malloc(nF
efb0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
efc0: 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28      MUTEX_LOGIC(
efd0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
efe0: 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20  mutexShared; ). 
eff0: 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
f000: 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
f010: 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29  !zFullPathname )
f020: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
f030: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
f040: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f050: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
f060: 20 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64        if( isMemd
f070: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  b ){.        mem
f080: 63 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  cpy(zFullPathnam
f090: 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71  e, zFilename, sq
f0a0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
f0b0: 69 6c 65 6e 61 6d 65 29 2b 31 29 3b 0a 20 20 20  ilename)+1);.   
f0c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f0d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
f0e0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
f0f0: 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  s, zFilename,.  
f100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f120: 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20   nFullPathname, 
f130: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
f140: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
f150: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
f160: 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
f170: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
f180: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
f190: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
f1a0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
f1b0: 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53   }.      }.#if S
f1c0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
f1d0: 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e  .      mutexOpen
f1e0: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
f1f0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
f200: 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a  X_STATIC_OPEN);.
f210: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
f220: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f  tex_enter(mutexO
f230: 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65  pen);.      mute
f240: 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
f250: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
f260: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
f270: 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73  MASTER);.      s
f280: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
f290: 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
f2a0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f  .#endif.      fo
f2b0: 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53  r(pBt=GLOBAL(BtS
f2c0: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
f2d0: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20  aredCacheList); 
f2e0: 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e  pBt; pBt=pBt->pN
f2f0: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ext){.        as
f300: 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e  sert( pBt->nRef>
f310: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
f320: 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c   0==strcmp(zFull
f330: 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65  Pathname, sqlite
f340: 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70  3PagerFilename(p
f350: 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a  Bt->pPager, 0)).
f360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f370: 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
f380: 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Vfs(pBt->pPager)
f390: 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20  ==pVfs ){.      
f3a0: 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
f3b0: 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64         for(iDb=d
f3c0: 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30  b->nDb-1; iDb>=0
f3d0: 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20  ; iDb--){.      
f3e0: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78        Btree *pEx
f3f0: 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62  isting = db->aDb
f400: 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20  [iDb].pBt;.     
f410: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73         if( pExis
f420: 74 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e  ting && pExistin
f430: 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20  g->pBt==pBt ){. 
f440: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
f450: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
f460: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
f470: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
f480: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
f490: 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
f4a0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
f4b0: 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
f4c0: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
f4d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
f4e0: 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ee(p);.         
f4f0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
f500: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
f510: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
f520: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f530: 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
f540: 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e  .          pBt->
f550: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRef++;.        
f560: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
f570: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
f580: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
f590: 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
f5a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f5b0: 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
f5c0: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64  ame);.    }.#ifd
f5d0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
f5e0: 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
f5f0: 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65  /* In debug mode
f600: 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65  , we mark all pe
f610: 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73  rsistent databas
f620: 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20  es as sharable. 
f630: 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65       ** even whe
f640: 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20  n they are not. 
f650: 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20   This exercises 
f660: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65  the locking code
f670: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69   and.      ** gi
f680: 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75  ves more opportu
f690: 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73  nity for asserts
f6a0: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68  (sqlite3_mutex_h
f6b0: 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20  eld()).      ** 
f6c0: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69  statements to fi
f6d0: 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c  nd locking probl
f6e0: 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ems..      */.  
f6f0: 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
f700: 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
f710: 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  f.  }.#endif.  i
f720: 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
f730: 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   /*.    ** The f
f740: 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73  ollowing asserts
f750: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
f760: 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20  structures used 
f770: 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65  by the btree are
f780: 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68  .    ** the righ
f790: 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73  t size.  This is
f7a0: 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73   to guard agains
f7b0: 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74  t size changes t
f7c0: 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  hat result.    *
f7d0: 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * when compiling
f7e0: 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   on a different 
f7f0: 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20  architecture..  
f800: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
f810: 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20   sizeof(i64)==8 
f820: 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d  || sizeof(i64)==
f830: 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
f840: 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20   sizeof(u64)==8 
f850: 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d  || sizeof(u64)==
f860: 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
f870: 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20   sizeof(u32)==4 
f880: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
f890: 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b  izeof(u16)==2 );
f8a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
f8b0: 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a  eof(Pgno)==4 );.
f8c0: 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c    .    pBt = sql
f8d0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
f8e0: 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a  sizeof(*pBt) );.
f8f0: 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29      if( pBt==0 )
f900: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
f910: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
f920: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
f930: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
f940: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
f950: 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74  rOpen(pVfs, &pBt
f960: 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e  ->pPager, zFilen
f970: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
f980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
f990: 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73  XTRA_SIZE, flags
f9a0: 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65  , vfsFlags, page
f9b0: 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28  Reinit);.    if(
f9c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f9d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
f9e0: 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
f9f0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64 62  (pBt->pPager, db
fa00: 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20  ->szMmap);.     
fa10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
fa20: 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
fa30: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a  (pBt->pPager,siz
fa40: 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a  eof(zDbHeader),z
fa50: 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d  DbHeader);.    }
fa60: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
fa70: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
fa80: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
fa90: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
faa0: 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20  Bt->openFlags = 
fab0: 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70  (u8)flags;.    p
fac0: 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20  Bt->db = db;.   
fad0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
fae0: 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d  Busyhandler(pBt-
faf0: 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e  >pPager, btreeIn
fb00: 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c  vokeBusyHandler,
fb10: 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42   pBt);.    p->pB
fb20: 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20  t = pBt;.  .    
fb30: 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30  pBt->pCursor = 0
fb40: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
fb50: 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  1 = 0;.    if( s
fb60: 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
fb70: 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65  donly(pBt->pPage
fb80: 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  r) ) pBt->btsFla
fb90: 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
fba0: 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  NLY;.#ifdef SQLI
fbb0: 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
fbc0: 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
fbd0: 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45  gs |= BTS_SECURE
fbe0: 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a  _DELETE;.#endif.
fbf0: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
fc00: 65 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31  e = (zDbHeader[1
fc10: 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61  6]<<8) | (zDbHea
fc20: 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20  der[17]<<16);.  
fc30: 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
fc40: 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e  ize<512 || pBt->
fc50: 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
fc60: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20  MAX_PAGE_SIZE.  
fc70: 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d         || ((pBt-
fc80: 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74  >pageSize-1)&pBt
fc90: 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29  ->pageSize)!=0 )
fca0: 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  {.      pBt->pag
fcb0: 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64  eSize = 0;.#ifnd
fcc0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
fcd0: 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
fce0: 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20  /* If the magic 
fcf0: 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  name ":memory:" 
fd00: 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69  will create an i
fd10: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
fd20: 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a  e, then.      **
fd30: 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56   leave the autoV
fd40: 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20  acuum mode at 0 
fd50: 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63  (do not auto-vac
fd60: 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20  uum), even if.  
fd70: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45      ** SQLITE_DE
fd80: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
fd90: 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65   is true. On the
fda0: 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a   other hand, if.
fdb0: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
fdc0: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61  OMIT_MEMORYDB ha
fdd0: 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20  s been defined, 
fde0: 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  then ":memory:" 
fdf0: 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20  is just a.      
fe00: 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d  ** regular file-
fe10: 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
fe20: 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  se the auto-vacu
fe30: 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65  um applies as pe
fe40: 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20  r normal..      
fe50: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69  */.      if( zFi
fe60: 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d  lename && !isMem
fe70: 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  db ){.        pB
fe80: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
fe90: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
fea0: 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a  AUTOVACUUM ? 1 :
feb0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74   0);.        pBt
fec0: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
fed0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
fee0: 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31  UTOVACUUM==2 ? 1
fef0: 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23   : 0);.      }.#
ff00: 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73  endif.      nRes
ff10: 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  erve = 0;.    }e
ff20: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65  lse{.      nRese
ff30: 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b  rve = zDbHeader[
ff40: 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  20];.      pBt->
ff50: 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
ff60: 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a  PAGESIZE_FIXED;.
ff70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ff80: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
ff90: 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
ffa0: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
ffb0: 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
ffc0: 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
ffd0: 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
ffe0: 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
fff0: 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37  zDbHeader[36 + 7
10000 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
10010 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  f.    }.    rc =
10020 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
10030 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
10040 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
10050 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b  Size, nReserve);
10060 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
10070 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
10080 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62  t;.    pBt->usab
10090 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
100a0 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76  geSize - nReserv
100b0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  e;.    assert( (
100c0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20  pBt->pageSize & 
100d0 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62  7)==0 );  /* 8-b
100e0 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  yte alignment of
100f0 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20   pageSize */.   
10100 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
10110 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
10120 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
10130 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
10140 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41  DISKIO).    /* A
10150 64 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61  dd the new BtSha
10160 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  red object to th
10170 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68  e linked list sh
10180 61 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73  arable BtShareds
10190 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
101a0 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
101b0 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49        MUTEX_LOGI
101c0 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  C( sqlite3_mutex
101d0 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29   *mutexShared; )
101e0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66  .      pBt->nRef
101f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 4d 55 54 45   = 1;.      MUTE
10200 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68  X_LOGIC( mutexSh
10210 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
10220 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
10230 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
10240 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28  TER);).      if(
10250 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
10260 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f  FE && sqlite3Glo
10270 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
10280 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  utex ){.        
10290 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  pBt->mutex = sql
102a0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
102b0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
102c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
102d0 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  Bt->mutex==0 ){.
102e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
102f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
10300 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f         db->mallo
10310 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20  cFailed = 0;.   
10320 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65         goto btre
10330 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
10340 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
10350 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
10360 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
10370 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  red);.      pBt-
10380 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28  >pNext = GLOBAL(
10390 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
103a0 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
103b0 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  );.      GLOBAL(
103c0 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
103d0 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
103e0 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73  ) = pBt;.      s
103f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
10400 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
10410 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
10420 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
10430 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
10440 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
10450 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
10460 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49  T_DISKIO).  /* I
10470 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20  f the new Btree 
10480 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20  uses a sharable 
10490 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20  pBtShared, then 
104a0 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a  link the new.  *
104b0 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65  * Btree into the
104c0 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61   list of all sha
104d0 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72  rable Btrees for
104e0 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63   the same connec
104f0 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c  tion..  ** The l
10500 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61  ist is kept in a
10510 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62  scending order b
10520 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20  y pBt address.. 
10530 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61   */.  if( p->sha
10540 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  rable ){.    int
10550 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70   i;.    Btree *p
10560 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Sib;.    for(i=0
10570 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
10580 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  ){.      if( (pS
10590 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ib = db->aDb[i].
105a0 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d  pBt)!=0 && pSib-
105b0 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
105c0 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
105d0 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20  ->pPrev ){ pSib 
105e0 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d  = pSib->pPrev; }
105f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
10600 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b  pBt<pSib->pBt ){
10610 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  .          p->pN
10620 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  ext = pSib;.    
10630 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
10640 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53   0;.          pS
10650 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  ib->pPrev = p;. 
10660 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
10670 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
10680 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53  Sib->pNext && pS
10690 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70  ib->pNext->pBt<p
106a0 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
106b0 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62       pSib = pSib
106c0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
106d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
106e0 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e  ->pNext = pSib->
106f0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
10700 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62   p->pPrev = pSib
10710 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
10720 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
10730 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
10740 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
10750 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10760 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d     pSib->pNext =
10770 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   p;.        }.  
10780 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10790 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
107a0 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65  endif.  *ppBtree
107b0 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65   = p;..btree_ope
107c0 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21  n_out:.  if( rc!
107d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
107e0 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74    if( pBt && pBt
107f0 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20  ->pPager ){.    
10800 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
10810 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
10820 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
10830 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
10840 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
10850 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65  p);.    *ppBtree
10860 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
10870 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54     /* If the B-T
10880 72 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ree was successf
10890 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74  ully opened, set
108a0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
108b0 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20   size to the.   
108c0 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75   ** default valu
108d0 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20  e. Except, when 
108e0 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78  opening on an ex
108f0 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61  isting shared pa
10900 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a  ger-cache,.    *
10910 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20  * do not change 
10920 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
10930 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
10940 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
10950 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29  eSchema(p, 0, 0)
10960 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
10970 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
10980 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50  esize(p->pBt->pP
10990 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46  ager, SQLITE_DEF
109a0 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29  AULT_CACHE_SIZE)
109b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
109c0 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20  ( mutexOpen ){. 
109d0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
109e0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75  e3_mutex_held(mu
109f0 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20  texOpen) );.    
10a00 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
10a10 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ave(mutexOpen);.
10a20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
10a30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d  .}../*.** Decrem
10a40 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64  ent the BtShared
10a50 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20  .nRef counter.  
10a60 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20  When it reaches 
10a70 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20  zero,.** remove 
10a80 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72  the BtShared str
10a90 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
10aa0 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52  sharing list.  R
10ab0 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
10ac0 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
10ad0 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68  ef counter reach
10ae0 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  es zero and retu
10af0 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  rn.** false if i
10b00 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74  t is still posit
10b10 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ive..*/.static i
10b20 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  nt removeFromSha
10b30 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65  ringList(BtShare
10b40 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66  d *pBt){.#ifndef
10b50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
10b60 52 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45  RED_CACHE.  MUTE
10b70 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
10b80 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b  _mutex *pMaster;
10b90 20 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70   ).  BtShared *p
10ba0 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f  List;.  int remo
10bb0 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ved = 0;..  asse
10bc0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
10bd0 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d  x_notheld(pBt->m
10be0 75 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58  utex) );.  MUTEX
10bf0 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20  _LOGIC( pMaster 
10c00 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
10c10 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
10c20 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
10c30 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   ).  sqlite3_mut
10c40 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72  ex_enter(pMaster
10c50 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d  );.  pBt->nRef--
10c60 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65  ;.  if( pBt->nRe
10c70 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  f<=0 ){.    if( 
10c80 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
10c90 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
10ca0 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b  cheList)==pBt ){
10cb0 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74  .      GLOBAL(Bt
10cc0 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
10cd0 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20  haredCacheList) 
10ce0 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
10cf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
10d00 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74  List = GLOBAL(Bt
10d10 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
10d20 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
10d30 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c  .      while( AL
10d40 57 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70  WAYS(pList) && p
10d50 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74  List->pNext!=pBt
10d60 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
10d70 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a  t=pList->pNext;.
10d80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
10d90 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
10da0 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
10db0 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
10dc0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
10dd0 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49    }.    if( SQLI
10de0 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b  TE_THREADSAFE ){
10df0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
10e00 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d  utex_free(pBt->m
10e10 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  utex);.    }.   
10e20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20   removed = 1;.  
10e30 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
10e40 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29  x_leave(pMaster)
10e50 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76  ;.  return remov
10e60 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  ed;.#else.  retu
10e70 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
10e80 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
10e90 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70  pBt->pTmpSpace p
10ea0 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f  oints to an allo
10eb0 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58  cation of .** MX
10ec0 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
10ed0 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
10ee0 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65   void allocateTe
10ef0 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64  mpSpace(BtShared
10f00 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70   *pBt){.  if( !p
10f10 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
10f20 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
10f30 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ace = sqlite3Pag
10f40 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61  eMalloc( pBt->pa
10f50 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f  geSize );..    /
10f60 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73 65  * One of the use
10f70 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53 70  s of pBt->pTmpSp
10f80 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61 74  ace is to format
10f90 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20 20   cells before.  
10fa0 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 74    ** inserting t
10fb0 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66 20  hem into a leaf 
10fc0 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20 66  page (function f
10fd0 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49 66  illInCell()). If
10fe0 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20 69  .    ** a cell i
10ff0 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 79  s less than 4 by
11000 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74 20  tes in size, it 
11010 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  is rounded up to
11020 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a 20   4 bytes.    ** 
11030 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 20 72  by the various r
11040 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61 6e  outines that man
11050 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20 63  ipulate binary c
11060 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20 20  ells. Which.    
11070 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61 74  ** can mean that
11080 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e   fillInCell() on
11090 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74  ly initializes t
110a0 68 65 20 66 69 72 73 74 20 32 20 6f 72 20 33 0a  he first 2 or 3.
110b0 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20      ** bytes of 
110c0 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20 74  pTmpSpace, but t
110d0 68 61 74 20 74 68 65 20 66 69 72 73 74 20 34 20  hat the first 4 
110e0 62 79 74 65 73 20 61 72 65 20 63 6f 70 69 65 64  bytes are copied
110f0 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74 20   from.    ** it 
11100 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  into a database 
11110 70 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e 6f  page. This is no
11120 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72 6f  t actually a pro
11130 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20 20  blem, but it.   
11140 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20 61   ** does cause a
11150 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 20   valgrind error 
11160 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32 20  when the 1 or 2 
11170 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61 6c  bytes of unitial
11180 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61 74  ized .    ** dat
11190 61 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 73  a is passed to s
111a0 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74 65  ystem call write
111b0 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64 20  (). So to avoid 
111c0 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20 20  this error,.    
111d0 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73  ** zero the firs
111e0 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 65 6d  t 4 bytes of tem
111f0 70 20 73 70 61 63 65 20 68 65 72 65 2e 20 20 2a  p space here.  *
11200 2f 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  /.    if( pBt->p
11210 54 6d 70 53 70 61 63 65 20 29 20 6d 65 6d 73 65  TmpSpace ) memse
11220 74 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  t(pBt->pTmpSpace
11230 2c 20 30 2c 20 34 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 0, 4);.  }.}..
11240 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70  /*.** Free the p
11250 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c  Bt->pTmpSpace al
11260 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  location.*/.stat
11270 69 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70  ic void freeTemp
11280 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a  Space(BtShared *
11290 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  pBt){.  sqlite3P
112a0 61 67 65 46 72 65 65 28 20 70 42 74 2d 3e 70 54  ageFree( pBt->pT
112b0 6d 70 53 70 61 63 65 29 3b 0a 20 20 70 42 74 2d  mpSpace);.  pBt-
112c0 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a  >pTmpSpace = 0;.
112d0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
112e0 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  n open database 
112f0 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61  and invalidate a
11300 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69  ll cursors..*/.i
11310 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
11320 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  lose(Btree *p){.
11330 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
11340 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75  = p->pBt;.  BtCu
11350 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f  rsor *pCur;..  /
11360 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
11370 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74  ors opened via t
11380 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a  his handle.  */.
11390 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
113a0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
113b0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
113c0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
113d0 72 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70  r(p);.  pCur = p
113e0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77  Bt->pCursor;.  w
113f0 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20  hile( pCur ){.  
11400 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70    BtCursor *pTmp
11410 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75   = pCur;.    pCu
11420 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
11430 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70  .    if( pTmp->p
11440 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20  Btree==p ){.    
11450 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
11460 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b  oseCursor(pTmp);
11470 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
11480 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   Rollback any ac
11490 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
114a0 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61   and free the ha
114b0 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a  ndle structure..
114c0 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f    ** The call to
114d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
114e0 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e  lback() drops an
114f0 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65  y table-locks he
11500 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20  ld by.  ** this 
11510 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73  handle..  */.  s
11520 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
11530 61 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b  ack(p, SQLITE_OK
11540 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
11550 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a  eLeave(p);..  /*
11560 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74   If there are st
11570 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61  ill other outsta
11580 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
11590 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62   to the shared-b
115a0 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74  tree.  ** struct
115b0 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e  ure, return now.
115c0 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   The remainder o
115d0 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  f this procedure
115e0 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70   cleans .  ** up
115f0 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
11600 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
11610 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
11620 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d  =0 && p->locked=
11630 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e  =0 );.  if( !p->
11640 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f  sharable || remo
11650 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
11660 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a  t(pBt) ){.    /*
11670 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c   The pBt is no l
11680 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61  onger on the sha
11690 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65  ring list, so we
116a0 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20   can access.    
116b0 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61  ** it without ha
116c0 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65  ving to hold the
116d0 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20   mutex..    **. 
116e0 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20     ** Clean out 
116f0 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42  and delete the B
11700 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a  tShared object..
11710 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
11720 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  t( !pBt->pCursor
11730 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
11740 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
11750 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
11760 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
11770 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61   && pBt->pSchema
11780 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78   ){.      pBt->x
11790 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e  FreeSchema(pBt->
117a0 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
117b0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
117c0 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d  e(0, pBt->pSchem
117d0 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70  a);.    freeTemp
117e0 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
117f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
11800 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
11810 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
11820 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72  ED_CACHE.  asser
11830 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
11840 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
11850 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
11860 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
11870 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ) p->pPrev->pNex
11880 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
11890 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70  if( p->pNext ) p
118a0 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
118b0 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69   p->pPrev;.#endi
118c0 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  f..  sqlite3_fre
118d0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
118e0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
118f0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69  ** Change the li
11900 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65  mit on the numbe
11910 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f 77  r of pages allow
11920 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  ed in the cache.
11930 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  .**.** The maxim
11940 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63  um number of cac
11950 68 65 20 70 61 67 65 73 20 69 73 20 73 65 74 20  he pages is set 
11960 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65 0a  to the absolute.
11970 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61  ** value of mxPa
11980 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20 69  ge.  If mxPage i
11990 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20  s negative, the 
119a0 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70  pager will.** op
119b0 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f  erate asynchrono
119c0 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e  usly - it will n
119d0 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66 73  ot stop to do fs
119e0 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73  ync()s.** to ins
119f0 75 72 65 20 64 61 74 61 20 69 73 20 77 72 69 74  ure data is writ
11a00 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ten to the disk 
11a10 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a 2a  surface before.*
11a20 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54  * continuing.  T
11a30 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c  ransactions stil
11a40 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68 72  l work if synchr
11a50 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a  onous is off,.**
11a60 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
11a70 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72  e cannot be corr
11a80 75 70 74 65 64 20 69 66 20 74 68 69 73 20 70 72  upted if this pr
11a90 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73  ogram.** crashes
11aa0 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f 70  .  But if the op
11ab0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
11ac0 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20  rashes or there 
11ad0 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74 20  is.** an abrupt 
11ae0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 68  power failure wh
11af0 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  en synchronous i
11b00 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61 62  s off, the datab
11b10 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20  ase.** could be 
11b20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
11b30 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72 65  sistent and unre
11b40 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65 2e  coverable state.
11b50 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20  .** Synchronous 
11b60 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74  is on by default
11b70 20 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   so database cor
11b80 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a  ruption is not.*
11b90 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72  * normally a wor
11ba0 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ry..*/.int sqlit
11bb0 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53  e3BtreeSetCacheS
11bc0 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
11bd0 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53  t mxPage){.  BtS
11be0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
11bf0 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
11c00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
11c10 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
11c20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
11c30 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
11c40 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
11c50 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
11c60 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71  r, mxPage);.  sq
11c70 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
11c80 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
11c90 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  ITE_OK;.}..#if S
11ca0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
11cb0 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  IZE>0./*.** Chan
11cc0 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20  ge the limit on 
11cd0 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68  the amount of th
11ce0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
11cf0 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6d  that may be.** m
11d00 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a 2a 2f  emory mapped..*/
11d10 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
11d20 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42 74  eSetMmapLimit(Bt
11d30 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  ree *p, sqlite3_
11d40 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20  int64 szMmap){. 
11d50 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
11d60 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
11d70 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11d80 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
11d90 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
11da0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
11db0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
11dc0 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70  MmapLimit(pBt->p
11dd0 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a  Pager, szMmap);.
11de0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
11df0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
11e00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
11e10 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
11e20 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a  AX_MMAP_SIZE>0 *
11e30 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  /../*.** Change 
11e40 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20  the way data is 
11e50 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69  synced to disk i
11e60 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65  n order to incre
11e70 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a  ase or decrease.
11e80 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20  ** how well the 
11e90 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73  database resists
11ea0 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
11eb0 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f  S crashes and po
11ec0 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e  wer.** failures.
11ed0 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65    Level 1 is the
11ee0 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72   same as asynchr
11ef0 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28  onous (no syncs(
11f00 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74  ) occur and.** t
11f10 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70  here is a high p
11f20 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
11f30 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69  mage)  Level 2 i
11f40 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20  s the default.  
11f50 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65  There.** is a ve
11f60 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a  ry low but non-z
11f70 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20  ero probability 
11f80 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65  of damage.  Leve
11f90 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a  l 3 reduces the.
11fa0 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ** probability o
11fb0 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72  f damage to near
11fc0 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61   zero but with a
11fd0 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e   write performan
11fe0 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f  ce reduction..*/
11ff0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12000 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
12010 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  AS.int sqlite3Bt
12020 72 65 65 53 65 74 50 61 67 65 72 46 6c 61 67 73  reeSetPagerFlags
12030 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
12040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
12050 65 20 62 74 72 65 65 20 74 6f 20 73 65 74 20 74  e btree to set t
12060 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  he safety level 
12070 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  on */.  unsigned
12080 20 70 67 46 6c 61 67 73 20 20 20 20 20 20 20 2f   pgFlags       /
12090 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45 52 5f  * Various PAGER_
120a0 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  * flags */.){.  
120b0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
120c0 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
120d0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
120e0 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
120f0 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
12100 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
12110 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46  sqlite3PagerSetF
12120 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72  lags(pBt->pPager
12130 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20 73 71  , pgFlags);.  sq
12140 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
12150 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
12160 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
12170 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
12180 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
12190 20 62 74 72 65 65 20 69 73 20 73 65 74 20 74 6f   btree is set to
121a0 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e   safety level 1.
121b0 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f    In other.** wo
121c0 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
121d0 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63   if no sync() oc
121e0 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b  curs on the disk
121f0 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
12200 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44  qlite3BtreeSyncD
12210 69 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70  isabled(Btree *p
12220 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
12230 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
12240 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
12250 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
12260 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
12270 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33  ) );  .  sqlite3
12280 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
12290 20 61 73 73 65 72 74 28 20 70 42 74 20 26 26 20   assert( pBt && 
122a0 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20  pBt->pPager );. 
122b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
122c0 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50  erNosync(pBt->pP
122d0 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ager);.  sqlite3
122e0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
122f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12300 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
12310 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69  default pages si
12320 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ze and the numbe
12330 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
12340 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a  tes per page..**
12350 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65   Or, if the page
12360 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64   size has alread
12370 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65  y been fixed, re
12380 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
12390 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74  ONLY .** without
123a0 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69   changing anythi
123b0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ng..**.** The pa
123c0 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
123d0 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74  a power of 2 bet
123e0 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
123f0 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  36.  If the page
12400 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65  .** size supplie
12410 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20  d does not meet 
12420 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
12430 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69  then the page si
12440 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61  ze is not.** cha
12450 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  nged..**.** Page
12460 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74   sizes are const
12470 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  rained to be a p
12480 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74  ower of two so t
12490 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a  hat the region.*
124a0 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
124b0 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
124c0 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69  locking (beginni
124d0 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59  ng at PENDING_BY
124e0 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  TE,.** the first
124f0 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31   byte past the 1
12500 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34  GB boundary, 0x4
12510 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74  0000000) needs t
12520 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68  o occur.** at th
12530 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
12540 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
12550 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72  parameter nReser
12560 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ve is less than 
12570 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e  zero, then the n
12580 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
12590 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70  d.** bytes per p
125a0 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
125b0 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
125c0 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e  the iFix!=0 then
125d0 20 74 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a   the BTS_PAGESIZ
125e0 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73 20  E_FIXED flag is 
125f0 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  set so that the 
12600 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64  page size.** and
12610 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65   autovacuum mode
12620 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62   can no longer b
12630 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  e changed..*/.in
12640 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
12650 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
12660 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  *p, int pageSize
12670 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20  , int nReserve, 
12680 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74  int iFix){.  int
12690 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
126a0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
126b0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
126c0 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d  ert( nReserve>=-
126d0 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  1 && nReserve<=2
126e0 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  55 );.  sqlite3B
126f0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
12700 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
12710 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45  s & BTS_PAGESIZE
12720 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71  _FIXED ){.    sq
12730 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
12740 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
12750 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
12760 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72    }.  if( nReser
12770 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73  ve<0 ){.    nRes
12780 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  erve = pBt->page
12790 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
127a0 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73  leSize;.  }.  as
127b0 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
127c0 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  0 && nReserve<=2
127d0 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65  55 );.  if( page
127e0 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
127f0 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
12800 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20  X_PAGE_SIZE &&. 
12810 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a         ((pageSiz
12820 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d  e-1)&pageSize)==
12830 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
12840 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
12850 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
12860 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26  ( !pBt->pPage1 &
12870 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  & !pBt->pCursor 
12880 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
12890 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65  Size = (u32)page
128a0 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65  Size;.    freeTe
128b0 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
128c0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
128d0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
128e0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
128f0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52  Bt->pageSize, nR
12900 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e  eserve);.  pBt->
12910 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
12920 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31  ->pageSize - (u1
12930 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66  6)nReserve;.  if
12940 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74  ( iFix ) pBt->bt
12950 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
12960 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20  GESIZE_FIXED;.  
12970 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
12980 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
12990 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
129a0 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  rn the currently
129b0 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69   defined page si
129c0 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ze.*/.int sqlite
129d0 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a  3BtreeGetPageSiz
129e0 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  e(Btree *p){.  r
129f0 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
12a00 67 65 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 20 64  geSize;.}..#if d
12a10 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41  efined(SQLITE_HA
12a20 53 5f 43 4f 44 45 43 29 20 7c 7c 20 64 65 66 69  S_CODEC) || defi
12a30 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
12a40 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  )./*.** This fun
12a50 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72  ction is similar
12a60 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
12a70 47 65 74 52 65 73 65 72 76 65 28 29 2c 20 65 78  GetReserve(), ex
12a80 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20  cept that it.** 
12a90 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  may only be call
12aa0 65 64 20 69 66 20 69 74 20 69 73 20 67 75 61 72  ed if it is guar
12ab0 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
12ac0 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20  b-tree mutex is 
12ad0 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e  already.** held.
12ae0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75  .**.** This is u
12af0 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65  seful in one spe
12b00 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65  cial case in the
12b10 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65   backup API code
12b20 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20   where it is.** 
12b30 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73  known that the s
12b40 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74  hared b-tree mut
12b50 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20  ex is held, but 
12b60 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  the mutex on the
12b70 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61   .** database ha
12b80 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a  ndle that owns *
12b90 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69  p is not. In thi
12ba0 73 20 63 61 73 65 20 69 66 20 73 71 6c 69 74 65  s case if sqlite
12bb0 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a  3BtreeEnter().**
12bc0 20 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c   were to be call
12bd0 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c  ed, it might col
12be0 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f  lide with some o
12bf0 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f  ther operation o
12c00 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  n the.** databas
12c10 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77  e handle that ow
12c20 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75  ns *p, causing u
12c30 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f  ndefined behavio
12c40 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
12c50 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
12c60 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70  NoMutex(Btree *p
12c70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
12c80 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
12c90 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  p->pBt->mutex) )
12ca0 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  ;.  return p->pB
12cb0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d  t->pageSize - p-
12cc0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
12cd0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
12ce0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 20 7c  LITE_HAS_CODEC |
12cf0 7c 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  | SQLITE_DEBUG *
12d00 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
12d10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
12d20 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64  R_PRAGMAS) || !d
12d30 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
12d40 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a  IT_VACUUM)./*.**
12d50 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
12d60 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
12d70 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
12d80 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68  of every page th
12d90 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74  at.** are intent
12da0 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65  ually left unuse
12db0 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
12dc0 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65  "reserved" space
12dd0 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65   that is.** some
12de0 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78  times used by ex
12df0 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74  tensions..*/.int
12e00 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
12e10 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70  Reserve(Btree *p
12e20 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
12e30 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
12e40 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74  p);.  n = p->pBt
12e50 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e  ->pageSize - p->
12e60 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
12e70 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
12e80 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
12e90 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n n;.}../*.** Se
12ea0 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  t the maximum pa
12eb0 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64  ge count for a d
12ec0 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67  atabase if mxPag
12ed0 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a  e is positive..*
12ee0 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  * No changes are
12ef0 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20   made if mxPage 
12f00 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65  is 0 or negative
12f10 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  ..** Regardless 
12f20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  of the value of 
12f30 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
12f40 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
12f50 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
12f60 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67  lite3BtreeMaxPag
12f70 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c  eCount(Btree *p,
12f80 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
12f90 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
12fa0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
12fb0 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65   n = sqlite3Page
12fc0 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d  rMaxPageCount(p-
12fd0 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  >pBt->pPager, mx
12fe0 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
12ff0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
13000 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
13010 0a 2a 2a 20 53 65 74 20 74 68 65 20 42 54 53 5f  .** Set the BTS_
13020 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 66 6c  SECURE_DELETE fl
13030 61 67 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73  ag if newFlag is
13040 20 30 20 6f 72 20 31 2e 20 20 49 66 20 6e 65 77   0 or 1.  If new
13050 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20 74  Flag is -1,.** t
13060 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e  hen make no chan
13070 67 65 73 2e 20 20 41 6c 77 61 79 73 20 72 65 74  ges.  Always ret
13080 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
13090 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f   the BTS_SECURE_
130a0 44 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69 6e  DELETE.** settin
130b0 67 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e  g after the chan
130c0 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ge..*/.int sqlit
130d0 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65 6c  e3BtreeSecureDel
130e0 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ete(Btree *p, in
130f0 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e  t newFlag){.  in
13100 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t b;.  if( p==0 
13110 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71  ) return 0;.  sq
13120 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
13130 70 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61  p);.  if( newFla
13140 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70  g>=0 ){.    p->p
13150 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
13160 7e 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45  ~BTS_SECURE_DELE
13170 54 45 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 46  TE;.    if( newF
13180 6c 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62 74  lag ) p->pBt->bt
13190 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45  sFlags |= BTS_SE
131a0 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d  CURE_DELETE;.  }
131b0 20 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d   .  b = (p->pBt-
131c0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
131d0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 21 3d  SECURE_DELETE)!=
131e0 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  0;.  sqlite3Btre
131f0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
13200 75 72 6e 20 62 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn b;.}.#endif 
13210 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
13220 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
13230 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e  AGMAS) || !defin
13240 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
13250 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ACUUM) */../*.**
13260 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74   Change the 'aut
13270 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
13280 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ty of the databa
13290 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f  se. If the 'auto
132a0 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d  Vacuum'.** param
132b0 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
132c0 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75  , then auto-vacu
132d0 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c  um mode is enabl
132e0 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a  ed. If zero, it.
132f0 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20  ** is disabled. 
13300 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  The default valu
13310 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76  e for the auto-v
13320 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69  acuum property i
13330 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  s .** determined
13340 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44   by the SQLITE_D
13350 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
13360 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20  M macro..*/.int 
13370 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41  sqlite3BtreeSetA
13380 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
13390 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75  *p, int autoVacu
133a0 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  um){.#ifdef SQLI
133b0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
133c0 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  UM.  return SQLI
133d0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c  TE_READONLY;.#el
133e0 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  se.  BtShared *p
133f0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
13400 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
13410 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38  K;.  u8 av = (u8
13420 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20  )autoVacuum;..  
13430 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
13440 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74  r(p);.  if( (pBt
13450 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
13460 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29  _PAGESIZE_FIXED)
13470 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29  !=0 && (av ?1:0)
13480 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  !=pBt->autoVacuu
13490 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
134a0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
134b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
134c0 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76  >autoVacuum = av
134d0 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e   ?1:0;.    pBt->
134e0 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d  incrVacuum = av=
134f0 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73  =2 ?1:0;.  }.  s
13500 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
13510 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
13520 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
13530 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
13540 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d  ue of the 'auto-
13550 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
13560 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d  . If auto-vacuum
13570 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20   is .** enabled 
13580 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  1 is returned. O
13590 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69  therwise 0..*/.i
135a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
135b0 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
135c0 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53  ee *p){.#ifdef S
135d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
135e0 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42  ACUUM.  return B
135f0 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
13600 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  NONE;.#else.  in
13610 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
13620 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
13630 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e  rc = (.    (!p->
13640 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
13650 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
13660 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d  M_NONE:.    (!p-
13670 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  >pBt->incrVacuum
13680 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
13690 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52  UM_FULL:.    BTR
136a0 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e  EE_AUTOVACUUM_IN
136b0 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65  CR.  );.  sqlite
136c0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
136d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
136e0 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  dif.}.../*.** Ge
136f0 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  t a reference to
13700 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64   pPage1 of the d
13710 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
13720 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f  his will.** also
13730 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c   acquire a readl
13740 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  ock on that file
13750 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
13760 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
13770 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
13780 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a  e file is not a.
13790 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  ** well-formed d
137a0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
137b0 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  en SQLITE_CORRUP
137c0 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  T is returned..*
137d0 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
137e0 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
137f0 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63   database is loc
13800 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  ked.  SQLITE_NOM
13810 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  EM.** is returne
13820 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20  d if we run out 
13830 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73  of memory. .*/.s
13840 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74  tatic int lockBt
13850 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ree(BtShared *pB
13860 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  t){.  int rc;   
13870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
13880 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73  sult code from s
13890 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  ubfunctions */. 
138a0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
138b0 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20  ;     /* Page 1 
138c0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
138d0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
138e0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
138f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
13900 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
13910 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
13920 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  File = 0;   /* N
13930 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
13940 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
13950 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
13960 67 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a  geHeader;     /*
13970 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
13980 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
13990 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64   according to hd
139a0 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
139b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
139c0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
139d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
139e0 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20  >pPage1==0 );.  
139f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
13a00 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d  rSharedLock(pBt-
13a10 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  >pPager);.  if( 
13a20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
13a30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
13a40 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
13a50 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
13a60 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
13a70 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
13a80 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f   rc;..  /* Do so
13a90 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68  me checking to h
13aa0 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66  elp insure the f
13ab0 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65  ile we opened re
13ac0 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76  ally is.  ** a v
13ad0 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69  alid database fi
13ae0 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67  le. .  */.  nPag
13af0 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20  e = nPageHeader 
13b00 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
13b10 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
13b20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
13b30 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
13b40 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69  pPager, &nPageFi
13b50 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65  le);.  if( nPage
13b60 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34  ==0 || memcmp(24
13b70 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
13b80 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61  ata, 92+(u8*)pPa
13b90 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30  ge1->aData,4)!=0
13ba0 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20   ){.    nPage = 
13bb0 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20  nPageFile;.  }. 
13bc0 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a   if( nPage>0 ){.
13bd0 20 20 20 20 75 33 32 20 70 61 67 65 53 69 7a 65      u32 pageSize
13be0 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c 65  ;.    u32 usable
13bf0 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61  Size;.    u8 *pa
13c00 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44  ge1 = pPage1->aD
13c10 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ata;.    rc = SQ
13c20 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20  LITE_NOTADB;.   
13c30 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65   if( memcmp(page
13c40 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  1, zMagicHeader,
13c50 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   16)!=0 ){.     
13c60 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
13c70 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
13c80 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
13c90 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70  IT_WAL.    if( p
13ca0 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20  age1[18]>1 ){.  
13cb0 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
13cc0 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
13cd0 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LY;.    }.    if
13ce0 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b  ( page1[19]>1 ){
13cf0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
13d00 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
13d10 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69     }.#else.    i
13d20 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29  f( page1[18]>2 )
13d30 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  {.      pBt->bts
13d40 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41  Flags |= BTS_REA
13d50 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  D_ONLY;.    }.  
13d60 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e    if( page1[19]>
13d70 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  2 ){.      goto 
13d80 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
13d90 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  d;.    }..    /*
13da0 20 49 66 20 74 68 65 20 77 72 69 74 65 20 76 65   If the write ve
13db0 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20  rsion is set to 
13dc0 32 2c 20 74 68 69 73 20 64 61 74 61 62 61 73 65  2, this database
13dd0 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73   should be acces
13de0 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41  sed.    ** in WA
13df0 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c  L mode. If the l
13e00 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  og is not alread
13e10 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20  y open, open it 
13e20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a  now. Then .    *
13e30 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
13e40 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69  OK and return wi
13e50 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67  thout populating
13e60 20 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31   BtShared.pPage1
13e70 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c  ..    ** The cal
13e80 6c 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73  ler detects this
13e90 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20   and calls this 
13ea0 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20  function again. 
13eb0 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72  This is.    ** r
13ec0 65 71 75 69 72 65 64 20 61 73 20 74 68 65 20 76  equired as the v
13ed0 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31  ersion of page 1
13ee0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
13ef0 65 20 70 61 67 65 31 20 62 75 66 66 65 72 0a 20  e page1 buffer. 
13f00 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65     ** may not be
13f10 20 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73   the latest vers
13f20 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20  ion - there may 
13f30 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69  be a newer one i
13f40 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a  n the log.    **
13f50 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
13f60 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d    if( page1[19]=
13f70 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  =2 && (pBt->btsF
13f80 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41  lags & BTS_NO_WA
13f90 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  L)==0 ){.      i
13fa0 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20  nt isOpen = 0;. 
13fb0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13fc0 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42  3PagerOpenWal(pB
13fd0 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70  t->pPager, &isOp
13fe0 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  en);.      if( r
13ff0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
14000 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
14010 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
14020 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
14030 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 23 69 66  isOpen==0 ){.#if
14040 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  def SQLITE_DEFAU
14050 4c 54 5f 57 41 4c 5f 53 41 46 45 54 59 4c 45 56  LT_WAL_SAFETYLEV
14060 45 4c 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 65  EL.        /* De
14070 66 61 75 6c 74 20 74 6f 20 73 70 65 63 69 66 69  fault to specifi
14080 65 64 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  ed safety_level 
14090 66 6f 72 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a  for WAL mode */.
140a0 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d          if( pBt-
140b0 3e 64 62 21 3d 30 20 26 26 20 70 42 74 2d 3e 64  >db!=0 && pBt->d
140c0 62 2d 3e 61 44 62 21 3d 30 20 29 7b 0a 20 20 20  b->aDb!=0 ){.   
140d0 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a         int iDb;.
140e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
140f0 33 20 2a 64 62 20 3d 20 70 42 74 2d 3e 64 62 3b  3 *db = pBt->db;
14100 0a 20 20 20 20 20 20 20 20 20 20 44 62 20 2a 61  .          Db *a
14110 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20  Db = db->aDb;.  
14120 20 20 20 20 20 20 20 20 75 38 20 6c 65 76 65 6c          u8 level
14130 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
14140 66 6f 72 28 69 44 62 3d 30 3b 20 69 44 62 3c 64  for(iDb=0; iDb<d
14150 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a  b->nDb; iDb++){.
14160 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
14170 61 44 62 5b 69 44 62 5d 2e 70 42 74 20 26 26 20  aDb[iDb].pBt && 
14180 61 44 62 5b 69 44 62 5d 2e 70 42 74 2d 3e 70 42  aDb[iDb].pBt->pB
14190 74 3d 3d 70 42 74 20 29 20 62 72 65 61 6b 3b 0a  t==pBt ) break;.
141a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
141b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 44        assert( iD
141c0 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20  b<db->nDb );.   
141d0 20 20 20 20 20 20 20 6c 65 76 65 6c 20 3d 20 64         level = d
141e0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 61 66 65  b->aDb[iDb].safe
141f0 74 79 5f 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20  ty_level;.      
14200 20 20 20 20 69 66 28 20 21 53 51 4c 49 54 45 5f      if( !SQLITE_
14210 44 62 53 61 66 65 74 79 4c 65 76 65 6c 49 73 46  DbSafetyLevelIsF
14220 69 78 65 64 28 6c 65 76 65 6c 29 20 26 26 20 0a  ixed(level) && .
14230 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51               (SQ
14240 4c 49 54 45 5f 44 62 53 61 66 65 74 79 4c 65 76  LITE_DbSafetyLev
14250 65 6c 56 61 6c 75 65 28 6c 65 76 65 6c 29 20 21  elValue(level) !
14260 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
14270 5f 57 41 4c 5f 53 41 46 45 54 59 4c 45 56 45 4c  _WAL_SAFETYLEVEL
14280 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
14290 20 61 44 62 5b 69 44 62 5d 2e 73 61 66 65 74 79   aDb[iDb].safety
142a0 5f 6c 65 76 65 6c 20 3d 20 53 51 4c 49 54 45 5f  _level = SQLITE_
142b0 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 41 46 45  DEFAULT_WAL_SAFE
142c0 54 59 4c 45 56 45 4c 3b 0a 20 20 20 20 20 20 20  TYLEVEL;.       
142d0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
142e0 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  rSetSafetyLevel(
142f0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c  pBt->pPager, SQL
14300 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f  ITE_DEFAULT_WAL_
14310 53 41 46 45 54 59 4c 45 56 45 4c 2c 20 0a 20 20  SAFETYLEVEL, .  
14320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14340 20 20 20 20 20 28 64 62 2d 3e 66 6c 61 67 73 26       (db->flags&
14350 53 51 4c 49 54 45 5f 46 75 6c 6c 46 53 79 6e 63  SQLITE_FullFSync
14360 29 21 3d 30 2c 0a 20 20 20 20 20 20 20 20 20 20  )!=0,.          
14370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14380 20 20 20 20 20 20 20 20 20 20 20 20 20 28 64 62               (db
14390 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 43  ->flags&SQLITE_C
143a0 6b 70 74 46 75 6c 6c 46 53 79 6e 63 29 21 3d 30  kptFullFSync)!=0
143b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
143c0 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
143d0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
143e0 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
143f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
14400 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
14410 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
14420 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23  _NOTADB;.    }.#
14430 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68  endif..    /* Th
14440 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64  e maximum embedd
14450 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74  ed fraction must
14460 20 62 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e   be exactly 25%.
14470 20 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75    And the minimu
14480 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65  m.    ** embedde
14490 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20  d fraction must 
144a0 62 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74  be 12.5% for bot
144b0 68 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20  h leaf-data and 
144c0 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20  non-leaf-data.. 
144d0 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e     ** The origin
144e0 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65  al design allowe
144f0 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20  d these amounts 
14500 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20  to vary, but as 
14510 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f  of.    ** versio
14520 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75  n 3.6.0, we requ
14530 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66  ire them to be f
14540 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ixed..    */.   
14550 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67   if( memcmp(&pag
14560 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34  e1[21], "\100\04
14570 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a  0\040",3)!=0 ){.
14580 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
14590 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
145a0 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65    }.    pageSize
145b0 20 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38   = (page1[16]<<8
145c0 29 20 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c  ) | (page1[17]<<
145d0 31 36 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70  16);.    if( ((p
145e0 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
145f0 69 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20  ize)!=0.     || 
14600 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
14610 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20  MAX_PAGE_SIZE . 
14620 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c      || pageSize<
14630 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20  =256 .    ){.   
14640 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
14650 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
14660 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
14670 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
14680 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65  ;.    usableSize
14690 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61   = pageSize - pa
146a0 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28  ge1[20];.    if(
146b0 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d   (u32)pageSize!=
146c0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  pBt->pageSize ){
146d0 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20  .      /* After 
146e0 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73  reading the firs
146f0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
14700 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20  tabase assuming 
14710 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20  a page size.    
14720 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64    ** of BtShared
14730 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61  .pageSize, we ha
14740 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  ve discovered th
14750 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
14760 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74   is.      ** act
14770 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20  ually pageSize. 
14780 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
14790 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e  ase, leave pBt->
147a0 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20  pPage1 at.      
147b0 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  ** zero and retu
147c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68  rn SQLITE_OK. Th
147d0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61  e caller will ca
147e0 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
147f0 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20  .      ** again 
14800 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
14810 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20   page-size..    
14820 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61    */.      relea
14830 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
14840 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c        pBt->usabl
14850 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69  eSize = usableSi
14860 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  ze;.      pBt->p
14870 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
14880 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65  ze;.      freeTe
14890 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
148a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
148b0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
148c0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
148d0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  Bt->pageSize,.  
148e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14900 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65   pageSize-usable
14910 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Size);.      ret
14920 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
14930 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e    if( (pBt->db->
14940 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
14950 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20  ecoveryMode)==0 
14960 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69  && nPage>nPageFi
14970 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  le ){.      rc =
14980 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
14990 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
149a0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
149b0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ed;.    }.    if
149c0 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30  ( usableSize<480
149d0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
149e0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
149f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
14a00 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
14a10 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75  Size;.    pBt->u
14a20 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62  sableSize = usab
14a30 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20  leSize;.#ifndef 
14a40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
14a50 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e  VACUUM.    pBt->
14a60 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
14a70 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
14a80 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
14a90 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
14aa0 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
14ab0 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29  page1[36 + 7*4])
14ac0 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
14ad0 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c  }..  /* maxLocal
14ae0 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
14af0 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
14b00 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  d to store local
14b10 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65  ly for.  ** a ce
14b20 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69  ll.  Make sure i
14b30 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
14b40 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61  h so that at lea
14b50 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a  st minFanout.  *
14b60 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c  * cells can will
14b70 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65   fit on one page
14b80 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31  .  We assume a 1
14b90 30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64  0-byte page head
14ba0 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73  er..  ** Besides
14bb0 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68   the payload, th
14bc0 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72  e cell must stor
14bd0 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79  e:.  **     2-by
14be0 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  te pointer to th
14bf0 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  e cell.  **     
14c00 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
14c10 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d  nter.  **     9-
14c20 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a  byte nKey value.
14c30 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
14c40 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a  nData value.  **
14c50 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72       4-byte over
14c60 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
14c70 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c  r.  ** So a cell
14c80 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32   consists of a 2
14c90 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61  -byte pointer, a
14ca0 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73   header which is
14cb0 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a   as much as.  **
14cc0 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20   17 bytes long, 
14cd0 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20  0 to N bytes of 
14ce0 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20  payload, and an 
14cf0 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20  optional 4 byte 
14d00 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61  overflow.  ** pa
14d10 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f  ge pointer..  */
14d20 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  .  pBt->maxLocal
14d30 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75   = (u16)((pBt->u
14d40 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34  sableSize-12)*64
14d50 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42  /255 - 23);.  pB
14d60 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75  t->minLocal = (u
14d70 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
14d80 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
14d90 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61  - 23);.  pBt->ma
14da0 78 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42  xLeaf = (u16)(pB
14db0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
14dc0 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c  35);.  pBt->minL
14dd0 65 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74  eaf = (u16)((pBt
14de0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
14df0 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *32/255 - 23);. 
14e00 20 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63   if( pBt->maxLoc
14e10 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42  al>127 ){.    pB
14e20 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
14e30 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73  ad = 127;.  }els
14e40 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31  e{.    pBt->max1
14e50 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75  bytePayload = (u
14e60 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  8)pBt->maxLocal;
14e70 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
14e80 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33  Bt->maxLeaf + 23
14e90 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45   <= MX_CELL_SIZE
14ea0 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e  (pBt) );.  pBt->
14eb0 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b  pPage1 = pPage1;
14ec0 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  .  pBt->nPage = 
14ed0 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  nPage;.  return 
14ee0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
14ef0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20  1_init_failed:. 
14f00 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
14f10 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  ge1);.  pBt->pPa
14f20 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ge1 = 0;.  retur
14f30 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
14f40 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65   NDEBUG./*.** Re
14f50 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
14f60 6f 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  of cursors open 
14f70 6f 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73 20  on pBt. This is 
14f80 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73  for use.** in as
14f90 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f  sert() expressio
14fa0 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c  ns, so it is onl
14fb0 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44  y compiled if ND
14fc0 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64  EBUG is not.** d
14fd0 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  efined..**.** On
14fe0 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ly write cursors
14ff0 20 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20   are counted if 
15000 77 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20  wrOnly is true. 
15010 20 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a   If wrOnly is.**
15020 20 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20   false then all 
15030 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e  cursors are coun
15040 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  ted..**.** For t
15050 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
15060 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63  his routine, a c
15070 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72  ursor is any cur
15080 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63  sor that.** is c
15090 61 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e  apable of readin
150a0 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20  g or writing to 
150b0 74 68 65 20 64 61 74 61 62 73 65 2e 20 20 43 75  the databse.  Cu
150c0 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61  rsors that.** ha
150d0 76 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20  ve been tripped 
150e0 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f  into the CURSOR_
150f0 46 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20  FAULT state are 
15100 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a  not counted..*/.
15110 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
15120 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53  ValidCursors(BtS
15130 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20  hared *pBt, int 
15140 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72  wrOnly){.  BtCur
15150 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
15160 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   r = 0;.  for(pC
15170 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
15180 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
15190 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
151a0 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20  ( (wrOnly==0 || 
151b0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
151c0 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
151d0 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43  )!=0).     && pC
151e0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
151f0 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20  OR_FAULT ) r++; 
15200 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b  .  }.  return r;
15210 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
15220 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
15230 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
15240 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20  sors and we are 
15250 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  not in the middl
15260 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61  e.** of a transa
15270 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20  ction but there 
15280 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  is a read lock o
15290 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
152a0 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
152b0 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20  tine unrefs the 
152c0 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
152d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
152e0 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68  which .** has th
152f0 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65  e effect of rele
15300 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c  asing the read l
15310 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
15320 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63  ere is a transac
15330 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
15340 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
15350 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
15360 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b  atic void unlock
15370 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74  BtreeIfUnused(Bt
15380 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
15390 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
153a0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
153b0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
153c0 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  rt( countValidCu
153d0 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20  rsors(pBt,0)==0 
153e0 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  || pBt->inTransa
153f0 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45  ction>TRANS_NONE
15400 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
15410 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
15420 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d  ANS_NONE && pBt-
15430 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20  >pPage1!=0 ){.  
15440 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
15450 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a  Page1->aData );.
15460 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
15470 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
15480 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31  (pBt->pPager)==1
15490 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
154a0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
154b0 74 61 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ta );.    releas
154c0 65 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65  ePage(pBt->pPage
154d0 31 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61  1);.    pBt->pPa
154e0 67 65 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ge1 = 0;.  }.}..
154f0 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69  /*.** If pBt poi
15500 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20  nts to an empty 
15510 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72  file then conver
15520 74 20 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c  t that empty fil
15530 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20  e.** into a new 
15540 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 20 62  empty database b
15550 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
15560 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
15570 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
15580 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15590 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68  newDatabase(BtSh
155a0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
155b0 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e  mPage *pP1;.  un
155c0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
155d0 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  a;.  int rc;..  
155e0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
155f0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
15600 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
15610 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a  pBt->nPage>0 ){.
15620 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15630 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20  E_OK;.  }.  pP1 
15640 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
15650 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20   assert( pP1!=0 
15660 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d  );.  data = pP1-
15670 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73  >aData;.  rc = s
15680 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
15690 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pP1->pDbPage);.
156a0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
156b0 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64  n rc;.  memcpy(d
156c0 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ata, zMagicHeade
156d0 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  r, sizeof(zMagic
156e0 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65  Header));.  asse
156f0 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  rt( sizeof(zMagi
15700 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a  cHeader)==16 );.
15710 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38    data[16] = (u8
15720 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )((pBt->pageSize
15730 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61  >>8)&0xff);.  da
15740 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70  ta[17] = (u8)((p
15750 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36  Bt->pageSize>>16
15760 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b  )&0xff);.  data[
15770 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  18] = 1;.  data[
15780 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72  19] = 1;.  asser
15790 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
157a0 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ze<=pBt->pageSiz
157b0 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65  e && pBt->usable
157c0 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70  Size+255>=pBt->p
157d0 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  ageSize);.  data
157e0 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d  [20] = (u8)(pBt-
157f0 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
15800 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
15810 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20  data[21] = 64;. 
15820 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a   data[22] = 32;.
15830 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b    data[23] = 32;
15840 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
15850 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b  24], 0, 100-24);
15860 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c  .  zeroPage(pP1,
15870 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f   PTF_INTKEY|PTF_
15880 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54  LEAF|PTF_LEAFDAT
15890 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46  A );.  pBt->btsF
158a0 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45  lags |= BTS_PAGE
158b0 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e  SIZE_FIXED;.#ifn
158c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
158d0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73  AUTOVACUUM.  ass
158e0 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
158f0 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
15900 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b  autoVacuum==0 );
15910 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
15920 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c  incrVacuum==1 ||
15930 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
15940 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74  ==0 );.  put4byt
15950 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34  e(&data[36 + 4*4
15960 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ], pBt->autoVacu
15970 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  um);.  put4byte(
15980 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c  &data[36 + 7*4],
15990 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
159a0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d  );.#endif.  pBt-
159b0 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61  >nPage = 1;.  da
159c0 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65  ta[31] = 1;.  re
159d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
159e0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
159f0 69 7a 65 20 74 68 65 20 66 69 72 73 74 20 70 61  ize the first pa
15a00 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
15a10 73 65 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e  se file (creatin
15a20 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  g a database.** 
15a30 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20  consisting of a 
15a40 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20  single page and 
15a50 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  no schema object
15a60 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s). Return SQLIT
15a70 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65  E_OK.** if succe
15a80 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c  ssful, or an SQL
15a90 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  ite error code o
15aa0 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74  therwise..*/.int
15ab0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77   sqlite3BtreeNew
15ac0 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  Db(Btree *p){.  
15ad0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
15ae0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
15af0 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20    p->pBt->nPage 
15b00 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44  = 0;.  rc = newD
15b10 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b  atabase(p->pBt);
15b20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
15b30 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
15b40 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
15b50 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20  ttempt to start 
15b60 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
15b70 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  n. A write-trans
15b80 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61  action.** is sta
15b90 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f  rted if the seco
15ba0 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  nd argument is n
15bb0 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73  onzero, otherwis
15bc0 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61  e a read-.** tra
15bd0 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68  nsaction.  If th
15be0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
15bf0 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61  t is 2 or more a
15c00 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  nd exclusive.** 
15c10 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
15c20 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20  tarted, meaning 
15c30 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72  that no other pr
15c40 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64  ocess is allowed
15c50 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68  .** to access th
15c60 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70  e database.  A p
15c70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73  reexisting trans
15c80 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62  action may not b
15c90 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f  e.** upgraded to
15ca0 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61   exclusive by ca
15cb0 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
15cc0 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65  ne a second time
15cd0 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73   - the.** exclus
15ce0 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20  ivity flag only 
15cf0 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20  works for a new 
15d00 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
15d10 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
15d20 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73  action must be s
15d30 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74  tarted before at
15d40 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a  tempting any .**
15d50 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
15d60 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20  database.  None 
15d70 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
15d80 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69   routines .** wi
15d90 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61  ll work unless a
15da0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
15db0 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a  started first:.*
15dc0 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  *.**      sqlite
15dd0 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
15de0 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
15df0 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e  te3BtreeCreateIn
15e00 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  dex().**      sq
15e10 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
15e20 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
15e30 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
15e40 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
15e50 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
15e60 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  t().**      sqli
15e70 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29  te3BtreeDelete()
15e80 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
15e90 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28  BtreeUpdateMeta(
15ea0 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  ).**.** If an in
15eb0 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f  itial attempt to
15ec0 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63   acquire the loc
15ed0 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20  k fails because 
15ee0 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  of lock contenti
15ef0 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  on.** and the da
15f00 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69  tabase was previ
15f10 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20  ously unlocked, 
15f20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20  then invoke the 
15f30 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20  busy handler.** 
15f40 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
15f50 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77    But if there w
15f60 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20  as previously a 
15f70 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f  read-lock, do no
15f80 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  t.** invoke the 
15f90 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a  busy handler - j
15fa0 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
15fb0 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f  E_BUSY.  SQLITE_
15fc0 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75  BUSY is .** retu
15fd0 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  rned when there 
15fe0 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  is already a rea
15ff0 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20  d-lock in order 
16000 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c  to avoid a deadl
16010 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  ock..**.** Suppo
16020 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  se there are two
16030 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64   processes A and
16040 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61   B.  A has a rea
16050 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73  d lock and B has
16060 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c  .** a reserved l
16070 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f  ock.  B tries to
16080 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c   promote to excl
16090 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f  usive but is blo
160a0 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20  cked because.** 
160b0 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b  of A's read lock
160c0 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72  .  A tries to pr
160d0 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65  omote to reserve
160e0 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  d but is blocked
160f0 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72   by B..** One or
16100 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
16110 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
16120 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72  must give way or
16130 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
16140 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42   no progress.  B
16150 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49  y returning SQLI
16160 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20  TE_BUSY and not 
16170 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73  invoking the bus
16180 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68  y callback.** wh
16190 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73  en A already has
161a0 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65   a read lock, we
161b0 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20   encourage A to 
161c0 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20  give up and let 
161d0 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f  B.** proceed..*/
161e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
161f0 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65  eBeginTrans(Btre
16200 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67  e *p, int wrflag
16210 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 42  ){.  sqlite3 *pB
16220 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68  lock = 0;.  BtSh
16230 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
16240 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
16250 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c  QLITE_OK;..  sql
16260 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
16270 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
16280 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
16290 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c   the btree is al
162a0 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65  ready in a write
162b0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72  -transaction, or
162c0 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65   it.  ** is alre
162d0 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72  ady in a read-tr
162e0 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20  ansaction and a 
162f0 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
16300 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74  .  ** is request
16310 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ed, this is a no
16320 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
16330 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
16340 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69  S_WRITE || (p->i
16350 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45  nTrans==TRANS_RE
16360 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29  AD && !wrflag) )
16370 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  {.    goto trans
16380 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73  _begun;.  }.  as
16390 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
163a0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
163b0 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d  WRITE || IfNotOm
163c0 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75  itAV(pBt->bDoTru
163d0 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20  ncate)==0 );..  
163e0 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63  /* Write transac
163f0 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f  tions are not po
16400 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64  ssible on a read
16410 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
16420 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74  /.  if( (pBt->bt
16430 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
16440 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72  D_ONLY)!=0 && wr
16450 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d  flag ){.    rc =
16460 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
16470 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
16480 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66  _begun;.  }..#if
16490 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
164a0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
164b0 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61  /* If another da
164c0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61  tabase handle ha
164d0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
164e0 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   a write transac
164f0 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68  tion .  ** on th
16500 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  is shared-btree 
16510 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
16520 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61  second write tra
16530 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  nsaction is.  **
16540 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75   requested, retu
16550 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
16560 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72  ..  */.  if( (wr
16570 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54  flag && pBt->inT
16580 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
16590 53 5f 57 52 49 54 45 29 0a 20 20 20 7c 7c 20 28  S_WRITE).   || (
165a0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
165b0 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a  BTS_PENDING)!=0.
165c0 20 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20    ){.    pBlock 
165d0 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  = pBt->pWriter->
165e0 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  db;.  }else if( 
165f0 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20  wrflag>1 ){.    
16600 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20  BtLock *pIter;. 
16610 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74     for(pIter=pBt
16620 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
16630 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
16640 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  xt){.      if( p
16650 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20  Iter->pBtree!=p 
16660 29 7b 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63  ){.        pBloc
16670 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65  k = pIter->pBtre
16680 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62  e->db;.        b
16690 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
166a0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42    }.  }.  if( pB
166b0 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  lock ){.    sqli
166c0 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f  te3ConnectionBlo
166d0 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f  cked(p->db, pBlo
166e0 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ck);.    rc = SQ
166f0 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
16700 45 44 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74  EDCACHE;.    got
16710 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
16720 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
16730 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72  Any read-only or
16740 20 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e   read-write tran
16750 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20  saction implies 
16760 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a  a read-lock on .
16770 20 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20    ** page 1. So 
16780 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68  if some other sh
16790 61 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e  ared-cache clien
167a0 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  t already has a 
167b0 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a  write-lock .  **
167c0 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20   on page 1, the 
167d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e  transaction cann
167e0 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f  ot be opened. */
167f0 0a 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61  .  rc = querySha
16800 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
16810 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  k(p, MASTER_ROOT
16820 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  , READ_LOCK);.  
16830 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
16840 63 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62  c ) goto trans_b
16850 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74  egun;..  pBt->bt
16860 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49  sFlags &= ~BTS_I
16870 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a  NITIALLY_EMPTY;.
16880 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
16890 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  ==0 ) pBt->btsFl
168a0 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49  ags |= BTS_INITI
168b0 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f  ALLY_EMPTY;.  do
168c0 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c   {.    /* Call l
168d0 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c  ockBtree() until
168e0 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61   either pBt->pPa
168f0 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64  ge1 is populated
16900 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42   or.    ** lockB
16910 74 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73  tree() returns s
16920 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74  omething other t
16930 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c  han SQLITE_OK. l
16940 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a  ockBtree().    *
16950 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  * may return SQL
16960 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65  ITE_OK but leave
16970 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74   pBt->pPage1 set
16980 20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20   to 0 if after. 
16990 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61     ** reading pa
169a0 67 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72  ge 1 it discover
169b0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  s that the page-
169c0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
169d0 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c  base .    ** fil
169e0 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61  e is not pBt->pa
169f0 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20  geSize. In this 
16a00 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29  case lockBtree()
16a10 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20   will update.   
16a20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   ** pBt->pageSiz
16a30 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69  e to the page-si
16a40 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f  ze of the file o
16a50 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20  n disk..    */. 
16a60 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70     while( pBt->p
16a70 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49  Page1==0 && SQLI
16a80 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63  TE_OK==(rc = loc
16a90 6b 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a  kBtree(pBt)) );.
16aa0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
16ab0 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
16ac0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70   ){.      if( (p
16ad0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
16ae0 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30  TS_READ_ONLY)!=0
16af0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
16b00 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
16b10 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
16b20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
16b30 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42  te3PagerBegin(pB
16b40 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67  t->pPager,wrflag
16b50 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  >1,sqlite3TempIn
16b60 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a  Memory(p->db));.
16b70 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
16b80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16b90 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44         rc = newD
16ba0 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
16bb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
16bc0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
16bd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16be0 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74  {.      unlockBt
16bf0 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
16c00 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
16c10 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c  ( (rc&0xFF)==SQL
16c20 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d  ITE_BUSY && pBt-
16c30 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
16c40 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20  TRANS_NONE &&.  
16c50 20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76          btreeInv
16c60 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
16c70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  Bt) );..  if( rc
16c80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16c90 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
16ca0 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
16cb0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
16cc0 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e  nsaction++;.#ifn
16cd0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16ce0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
16cf0 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
16d00 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  le ){.        as
16d10 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42  sert( p->lock.pB
16d20 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f  tree==p && p->lo
16d30 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a  ck.iTable==1 );.
16d40 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e          p->lock.
16d50 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43  eLock = READ_LOC
16d60 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  K;.        p->lo
16d70 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  ck.pNext = pBt->
16d80 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70  pLock;.        p
16d90 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e  Bt->pLock = &p->
16da0 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65  lock;.      }.#e
16db0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
16dc0 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66  ->inTrans = (wrf
16dd0 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a  lag?TRANS_WRITE:
16de0 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20  TRANS_READ);.   
16df0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
16e00 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
16e10 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  on ){.      pBt-
16e20 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
16e30 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20   p->inTrans;.   
16e40 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61   }.    if( wrfla
16e50 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61  g ){.      MemPa
16e60 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
16e70 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65  ->pPage1;.#ifnde
16e80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
16e90 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20  ARED_CACHE.     
16ea0 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
16eb0 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20  Writer );.      
16ec0 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70  pBt->pWriter = p
16ed0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  ;.      pBt->bts
16ee0 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58  Flags &= ~BTS_EX
16ef0 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69  CLUSIVE;.      i
16f00 66 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42  f( wrflag>1 ) pB
16f10 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
16f20 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65  TS_EXCLUSIVE;.#e
16f30 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ndif..      /* I
16f40 66 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65  f the db-size he
16f50 61 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e  ader field is in
16f60 63 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d  correct (as it m
16f70 61 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a  ay be if an old.
16f80 20 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20        ** client 
16f90 68 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67  has been writing
16fa0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16fb0 6c 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e  le), update it n
16fc0 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20  ow. Doing.      
16fd0 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72  ** this sooner r
16fe0 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72  ather than later
16ff0 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
17000 61 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66  ase size can saf
17010 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65  ely .      ** re
17020 2d 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61  -read the databa
17030 73 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67  se size from pag
17040 65 20 31 20 69 66 20 61 20 73 61 76 65 70 6f 69  e 1 if a savepoi
17050 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  nt or transactio
17060 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  n.      ** rollb
17070 61 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69  ack occurs withi
17080 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
17090 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
170a0 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
170b0 21 3d 67 65 74 34 62 79 74 65 28 26 70 50 61 67  !=get4byte(&pPag
170c0 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29  e1->aData[28]) )
170d0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
170e0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
170f0 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
17100 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
17110 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17120 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
17130 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
17140 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67  a[28], pBt->nPag
17150 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
17160 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
17170 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20  ..trans_begun:. 
17180 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17190 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  OK && wrflag ){.
171a0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
171b0 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74   makes sure that
171c0 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74   the pager has t
171d0 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65  he correct numbe
171e0 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  r of.    ** open
171f0 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20   savepoints. If 
17200 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
17210 65 74 65 72 20 69 73 20 67 72 65 61 74 65 72 20  eter is greater 
17220 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a  than 0 and.    *
17230 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
17240 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  l is not already
17250 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77   open, then it w
17260 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65  ill be opened he
17270 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  re..    */.    r
17280 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
17290 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42  OpenSavepoint(pB
172a0 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62  t->pPager, p->db
172b0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  ->nSavepoint);. 
172c0 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67   }..  btreeInteg
172d0 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74  rity(p);.  sqlit
172e0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
172f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17300 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17310 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
17320 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
17330 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
17340 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64  es for all child
17350 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67  ren of page pPag
17360 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70  e. Also, if.** p
17370 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65  Page contains ce
17380 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  lls that point t
17390 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
173a0 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65  , set the pointe
173b0 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73  r.** map entries
173c0 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
173d0 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e  w pages as well.
173e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
173f0 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d  etChildPtrmaps(M
17400 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
17410 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
17420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17430 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20       /* Counter 
17440 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  variable */.  in
17450 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
17460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17470 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
17480 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67  lls in page pPag
17490 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
174a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
174c0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74  urn code */.  Bt
174d0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
174e0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69  age->pBt;.  u8 i
174f0 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
17500 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e  e->isInit;.  Pgn
17510 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e  o pgno = pPage->
17520 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  pgno;..  assert(
17530 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
17540 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
17550 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
17560 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
17570 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
17580 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17590 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
175a0 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
175b0 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  }.  nCell = pPag
175c0 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72  e->nCell;..  for
175d0 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
175e0 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
175f0 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
17600 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74  age, i);..    pt
17610 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
17620 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63  Page, pCell, &rc
17630 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61  );..    if( !pPa
17640 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
17650 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
17660 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c   = get4byte(pCel
17670 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70  l);.      ptrmap
17680 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
17690 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
176a0 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
176b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21    }.  }..  if( !
176c0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
176d0 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
176e0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
176f0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
17700 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
17710 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70  .    ptrmapPut(p
17720 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
17730 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
17740 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65  o, &rc);.  }..se
17750 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
17760 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73  out:.  pPage->is
17770 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69  Init = isInitOri
17780 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  g;.  return rc;.
17790 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65  }../*.** Somewhe
177a0 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61  re on pPage is a
177b0 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   pointer to page
177c0 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20   iFrom.  Modify 
177d0 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a  this pointer so.
177e0 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
177f0 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65  s to iTo. Parame
17800 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69  ter eType descri
17810 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  bes the type of 
17820 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65  pointer to.** be
17830 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66   modified, as  f
17840 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54  ollows:.**.** PT
17850 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20  RMAP_BTREE:     
17860 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
17870 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
17880 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63  er points at a c
17890 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20  hild .**        
178a0 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
178b0 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  of pPage..**.** 
178c0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
178d0 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72  : pPage is a btr
178e0 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
178f0 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
17900 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20  n overflow.**   
17910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17920 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  page pointed to 
17930 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65  by one of the ce
17940 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a  lls on pPage..**
17950 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
17960 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61  LOW2: pPage is a
17970 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e  n overflow-page.
17980 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
17990 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a  nts at the next.
179a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
179b0 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61       overflow pa
179c0 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ge in the list..
179d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
179e0 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
179f0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
17a00 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f  Pgno iFrom, Pgno
17a10 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b   iTo, u8 eType){
17a20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17a30 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
17a40 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
17a50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
17a60 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
17a70 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
17a80 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65  Page) );.  if( e
17a90 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
17aa0 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a  RFLOW2 ){.    /*
17ab0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
17ac0 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74  always the first
17ad0 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   4 bytes of the 
17ae0 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
17af0 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67  e.  */.    if( g
17b00 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
17b10 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  Data)!=iFrom ){.
17b20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
17b30 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
17b40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34  ;.    }.    put4
17b50 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
17b60 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65  a, iTo);.  }else
17b70 7b 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f  {.    u8 isInitO
17b80 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49  rig = pPage->isI
17b90 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  nit;.    int i;.
17ba0 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a      int nCell;..
17bb0 20 20 20 20 62 74 72 65 65 49 6e 69 74 50 61 67      btreeInitPag
17bc0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 6e 43  e(pPage);.    nC
17bd0 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
17be0 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  ll;..    for(i=0
17bf0 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
17c00 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
17c10 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
17c20 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  e, i);.      if(
17c30 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
17c40 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20  VERFLOW1 ){.    
17c50 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
17c60 6f 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65 65  o;.        btree
17c70 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
17c80 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
17c90 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
17ca0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 0a 20 20  nfo.iOverflow.  
17cb0 20 20 20 20 20 20 20 26 26 20 70 43 65 6c 6c 2b         && pCell+
17cc0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33  info.iOverflow+3
17cd0 3c 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70  <=pPage->aData+p
17ce0 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20  Page->maskPage. 
17cf0 20 20 20 20 20 20 20 20 26 26 20 69 46 72 6f 6d          && iFrom
17d00 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  ==get4byte(&pCel
17d10 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
17d20 5d 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  ]).        ){.  
17d30 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
17d40 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
17d50 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20  erflow], iTo);. 
17d60 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
17d70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17d80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
17d90 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c  f( get4byte(pCel
17da0 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  l)==iFrom ){.   
17db0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
17dc0 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20  pCell, iTo);.   
17dd0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
17de0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
17df0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
17e00 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20   i==nCell ){.   
17e10 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54     if( eType!=PT
17e20 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20  RMAP_BTREE || . 
17e30 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74           get4byt
17e40 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
17e50 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
17e60 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  +8])!=iFrom ){. 
17e70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
17e80 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
17e90 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
17ea0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
17eb0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
17ec0 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f  drOffset+8], iTo
17ed0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  );.    }..    pP
17ee0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
17ef0 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20  InitOrig;.  }.  
17f00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17f10 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
17f20 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
17f30 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20  se page pDbPage 
17f40 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65  to location iFre
17f50 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a  ePage in the .**
17f60 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70   database. The p
17f70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65  DbPage reference
17f80 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a   remains valid..
17f90 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d  **.** The isComm
17fa0 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65  it flag indicate
17fb0 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
17fc0 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d  no need to remem
17fd0 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  ber that.** the 
17fe0 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
17ff0 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
18000 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67  ore database pag
18010 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20  e pDbPage->pgno 
18020 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74  .** can be writt
18030 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65  en to. The calle
18040 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72  r has already pr
18050 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72  omised not to wr
18060 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70  ite to that.** p
18070 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
18080 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28  nt relocatePage(
18090 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
180a0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
180b0 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
180c0 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20  e *pDbPage,     
180d0 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
180e0 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20  to move */.  u8 
180f0 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  eType,          
18100 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
18110 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72   map 'type' entr
18120 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
18130 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65  .  Pgno iPtrPage
18140 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
18150 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65  ointer map 'page
18160 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70  -no' entry for p
18170 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
18180 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20   iFreePage,     
18190 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61       /* The loca
181a0 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62  tion to move pDb
181b0 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  Page to */.  int
181c0 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20   isCommit       
181d0 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69        /* isCommi
181e0 74 20 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f  t flag passed to
181f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
18200 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65  epage */.){.  Me
18210 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b  mPage *pPtrPage;
18220 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
18230 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  hat contains a p
18240 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67  ointer to pDbPag
18250 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50  e */.  Pgno iDbP
18260 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70  age = pDbPage->p
18270 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  gno;.  Pager *pP
18280 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
18290 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
182a0 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
182b0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
182c0 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
182d0 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a  P_OVERFLOW1 || .
182e0 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52        eType==PTR
182f0 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
18300 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
18310 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  AGE );.  assert(
18320 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
18330 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
18340 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  );.  assert( pDb
18350 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29  Page->pBt==pBt )
18360 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67  ;..  /* Move pag
18370 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69  e iDbPage from i
18380 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ts current locat
18390 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  ion to page numb
183a0 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a  er iFreePage */.
183b0 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41    TRACE(("AUTOVA
183c0 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20  CUUM: Moving %d 
183d0 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20  to free page %d 
183e0 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70  (ptr page %d typ
183f0 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20  e %d)\n", .     
18400 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
18410 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65  age, iPtrPage, e
18420 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73  Type));.  rc = s
18430 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
18440 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50  age(pPager, pDbP
18450 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46  age->pDbPage, iF
18460 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69  reePage, isCommi
18470 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
18480 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
18490 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
184a0 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20  pDbPage->pgno = 
184b0 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a  iFreePage;..  /*
184c0 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20   If pDbPage was 
184d0 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68  a btree-page, th
184e0 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63  en it may have c
184f0 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f  hild pages and/o
18500 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61  r cells.  ** tha
18510 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
18520 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70  low pages. The p
18530 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
18540 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65  es for all these
18550 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64  .  ** pages need
18560 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a   to be changed..
18570 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62    **.  ** If pDb
18580 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66  Page is an overf
18590 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74  low page, then t
185a0 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
185b0 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a   may store a.  *
185c0 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  * pointer to a s
185d0 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
185e0 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73  ow page. If this
185f0 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
18600 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e  en.  ** the poin
18610 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f  ter map needs to
18620 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20   be updated for 
18630 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f  the subsequent o
18640 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20  verflow page..  
18650 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
18660 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
18670 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
18680 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
18690 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61   = setChildPtrma
186a0 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ps(pDbPage);.   
186b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
186c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
186d0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
186e0 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
186f0 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79  extOvfl = get4by
18700 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74  te(pDbPage->aDat
18710 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74  a);.    if( next
18720 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20  Ovfl!=0 ){.     
18730 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
18740 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50  nextOvfl, PTRMAP
18750 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65  _OVERFLOW2, iFre
18760 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  ePage, &rc);.   
18770 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18780 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18790 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
187a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
187b0 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62  /* Fix the datab
187c0 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70  ase pointer on p
187d0 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61  age iPtrPage tha
187e0 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62  t pointed at iDb
187f0 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61  Page so.  ** tha
18800 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69  t it points at i
18810 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66  FreePage. Also f
18820 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ix the pointer m
18830 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a  ap entry for.  *
18840 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f  * iPtrPage..  */
18850 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54  .  if( eType!=PT
18860 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
18870 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
18880 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72  etPage(pBt, iPtr
18890 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c  Page, &pPtrPage,
188a0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
188b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
188c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
188d0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
188e0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
188f0 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67  pPtrPage->pDbPag
18900 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
18910 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18920 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
18930 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20  PtrPage);.      
18940 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
18950 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79  .    rc = modify
18960 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72  PagePointer(pPtr
18970 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69  Page, iDbPage, i
18980 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29  FreePage, eType)
18990 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
189a0 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
189b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
189c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  OK ){.      ptrm
189d0 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65  apPut(pBt, iFree
189e0 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74  Page, eType, iPt
189f0 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  rPage, &rc);.   
18a00 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
18a10 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
18a20 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65  d declaration re
18a30 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61  quired by incrVa
18a40 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73  cuumStep(). */.s
18a50 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
18a60 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68  teBtreePage(BtSh
18a70 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20  ared *, MemPage 
18a80 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f  **, Pgno *, Pgno
18a90 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65  , u8);../*.** Pe
18aa0 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73  rform a single s
18ab0 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d  tep of an increm
18ac0 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66  ental-vacuum. If
18ad0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
18ae0 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  urn.** SQLITE_OK
18af0 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
18b00 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64   work to do (and
18b10 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f   therefore no po
18b20 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69  int in .** calli
18b30 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
18b40 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20   again), return 
18b50 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c  SQLITE_DONE. Or,
18b60 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a   if an error .**
18b70 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
18b80 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
18b90 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72   code..**.** Mor
18ba0 65 20 73 70 65 63 69 66 69 63 6c 79 2c 20 74 68  e specificly, th
18bb0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  is function atte
18bc0 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e  mpts to re-organ
18bd0 69 7a 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ize the database
18be0 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68 65   so .** that the
18bf0 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68   last page of th
18c00 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79  e file currently
18c10 20 69 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f   in use is no lo
18c20 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a  nger in use..**.
18c30 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 46 69  ** Parameter nFi
18c40 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
18c50 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68  of pages that th
18c60 69 73 20 64 61 74 61 62 61 73 65 20 77 6f 75 6c  is database woul
18c70 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72  d contain.** wer
18c80 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
18c90 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74 20  called until it 
18ca0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
18cb0 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ONE..**.** If th
18cc0 65 20 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65  e bCommit parame
18cd0 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
18ce0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
18cf0 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20  ssumes that the 
18d00 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  .** caller will 
18d10 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63  keep calling inc
18d20 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e  rVacuumStep() un
18d30 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53  til it returns S
18d40 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f  QLITE_DONE .** o
18d50 72 20 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d  r an error. bCom
18d60 6d 69 74 20 69 73 20 70 61 73 73 65 64 20 74 72  mit is passed tr
18d70 75 65 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76  ue for an auto-v
18d80 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 6d 69 74  acuum-on-commmit
18d90 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20   .** operation, 
18da0 6f 72 20 66 61 6c 73 65 20 66 6f 72 20 61 6e 20  or false for an 
18db0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
18dc0 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  um..*/.static in
18dd0 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  t incrVacuumStep
18de0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
18df0 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20  Pgno nFin, Pgno 
18e00 69 4c 61 73 74 50 67 2c 20 69 6e 74 20 62 43 6f  iLastPg, int bCo
18e10 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46  mmit){.  Pgno nF
18e20 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20  reeList;        
18e30 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18e40 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74  pages still on t
18e50 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  he free-list */.
18e60 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
18e70 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
18e80 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
18e90 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
18ea0 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b   iLastPg>nFin );
18eb0 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f  ..  if( !PTRMAP_
18ec0 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
18ed0 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21  tPg) && iLastPg!
18ee0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
18ef0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 75  GE(pBt) ){.    u
18f00 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e  8 eType;.    Pgn
18f10 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20  o iPtrPage;..   
18f20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74   nFreeList = get
18f30 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
18f40 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
18f50 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73      if( nFreeLis
18f60 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  t==0 ){.      re
18f70 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
18f80 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  ;.    }..    rc 
18f90 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
18fa0 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65   iLastPg, &eType
18fb0 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20  , &iPtrPage);.  
18fc0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18fd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
18fe0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
18ff0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
19000 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
19010 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
19020 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
19030 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
19040 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
19050 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
19060 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20   if( bCommit==0 
19070 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ){.        /* Re
19080 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66 72  move the page fr
19090 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72 65  om the files fre
190a0 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20  e-list. This is 
190b0 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20 20  not required.   
190c0 20 20 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d       ** if bComm
190d0 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  it is non-zero. 
190e0 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
190f0 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c  e free-list will
19100 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   be.        ** t
19110 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
19120 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
19130 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f  tion returns, so
19140 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20   it doesn't .   
19150 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69       ** matter i
19160 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61  f it still conta
19170 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ins some garbage
19180 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20   entries..      
19190 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e    */.        Pgn
191a0 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20  o iFreePg;.     
191b0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
191c0 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
191d0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
191e0 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
191f0 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61  g, &iFreePg, iLa
19200 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58  stPg, BTALLOC_EX
19210 41 43 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ACT);.        if
19220 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19230 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
19240 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
19250 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
19260 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74  ( iFreePg==iLast
19270 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Pg );.        re
19280 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
19290 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
192a0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50  } else {.      P
192b0 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20  gno iFreePg;    
192c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
192d0 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74  x of free page t
192e0 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74  o move pLastPg t
192f0 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61  o */.      MemPa
19300 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20  ge *pLastPg;.   
19310 20 20 20 75 38 20 65 4d 6f 64 65 20 3d 20 42 54     u8 eMode = BT
19320 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20  ALLOC_ANY;   /* 
19330 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 66  Mode parameter f
19340 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  or allocateBtree
19350 50 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 20 20  Page() */.      
19360 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20  Pgno iNear = 0; 
19370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65 61            /* nea
19380 72 62 79 20 70 61 72 61 6d 65 74 65 72 20 66 6f  rby parameter fo
19390 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  r allocateBtreeP
193a0 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20  age() */..      
193b0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
193c0 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  e(pBt, iLastPg, 
193d0 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20  &pLastPg, 0);.  
193e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
193f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19400 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
19410 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
19420 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f   bCommit is zero
19430 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73  , this loop runs
19440 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e   exactly once an
19450 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20  d page pLastPg. 
19460 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70       ** is swapp
19470 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ed with the firs
19480 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c  t free page pull
19490 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20  ed off the free 
194a0 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  list..      **. 
194b0 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f       ** On the o
194c0 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 62 43  ther hand, if bC
194d0 6f 6d 6d 69 74 20 69 73 20 67 72 65 61 74 65 72  ommit is greater
194e0 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
194f0 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c   keep.      ** l
19500 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66  ooping until a f
19510 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64  ree-page located
19520 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
19530 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20  t nFin pages.   
19540 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c     ** of the fil
19550 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20  e is found..    
19560 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62    */.      if( b
19570 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
19580 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 42 54 41       eMode = BTA
19590 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20  LLOC_LE;.       
195a0 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20   iNear = nFin;. 
195b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 20       }.      do 
195c0 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  {.        MemPag
195d0 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
195e0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
195f0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
19600 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
19610 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65  Pg, iNear, eMode
19620 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
19630 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19640 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
19650 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
19660 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
19670 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
19680 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
19690 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20  ge(pFreePg);.   
196a0 20 20 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d     }while( bComm
196b0 69 74 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46  it && iFreePg>nF
196c0 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  in );.      asse
196d0 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73  rt( iFreePg<iLas
196e0 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20  tPg );.      .  
196f0 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
19700 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74  ePage(pBt, pLast
19710 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  Pg, eType, iPtrP
19720 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20 62 43  age, iFreePg, bC
19730 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 72 65  ommit);.      re
19740 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
19750 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
19760 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
19770 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
19780 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19790 20 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d    }..  if( bComm
197a0 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20  it==0 ){.    do 
197b0 7b 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d  {.      iLastPg-
197c0 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69  -;.    }while( i
197d0 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f  LastPg==PENDING_
197e0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 7c  BYTE_PAGE(pBt) |
197f0 7c 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  | PTRMAP_ISPAGE(
19800 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 3b  pBt, iLastPg) );
19810 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75  .    pBt->bDoTru
19820 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 70  ncate = 1;.    p
19830 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73  Bt->nPage = iLas
19840 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  tPg;.  }.  retur
19850 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
19860 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 62 61  /*.** The databa
19870 73 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  se opened by the
19880 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
19890 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
198a0 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f  m database.** nO
198b0 72 69 67 20 70 61 67 65 73 20 69 6e 20 73 69 7a  rig pages in siz
198c0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72  e containing nFr
198d0 65 65 20 66 72 65 65 20 70 61 67 65 73 2e 20 52  ee free pages. R
198e0 65 74 75 72 6e 20 74 68 65 20 65 78 70 65 63 74  eturn the expect
198f0 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74  ed .** size of t
19900 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70  he database in p
19910 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  ages following a
19920 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70  n auto-vacuum op
19930 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  eration..*/.stat
19940 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53  ic Pgno finalDbS
19950 69 7a 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ize(BtShared *pB
19960 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50  t, Pgno nOrig, P
19970 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e  gno nFree){.  in
19980 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20  t nEntry;       
19990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
199a0 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
199b0 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70  es on one ptrmap
199c0 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
199d0 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 20  nPtrmap;        
199e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
199f0 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20 70  mber of PtrMap p
19a00 61 67 65 73 20 74 6f 20 62 65 20 66 72 65 65 64  ages to be freed
19a10 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b   */.  Pgno nFin;
19a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a30 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
19a40 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74  value */..  nEnt
19a50 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ry = pBt->usable
19a60 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61  Size/5;.  nPtrma
19a70 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67  p = (nFree-nOrig
19a80 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  +PTRMAP_PAGENO(p
19a90 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72  Bt, nOrig)+nEntr
19aa0 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69  y)/nEntry;.  nFi
19ab0 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65  n = nOrig - nFre
19ac0 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69  e - nPtrmap;.  i
19ad0 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47  f( nOrig>PENDING
19ae0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
19af0 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f  && nFin<PENDING_
19b00 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
19b10 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20  {.    nFin--;.  
19b20 7d 0a 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41  }.  while( PTRMA
19b30 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46  P_ISPAGE(pBt, nF
19b40 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e  in) || nFin==PEN
19b50 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
19b60 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d  Bt) ){.    nFin-
19b70 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  -;.  }..  return
19b80 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   nFin;.}../*.** 
19b90 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
19ba0 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ion must be open
19bb0 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  ed before callin
19bc0 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  g this function.
19bd0 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20  .** It performs 
19be0 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66  a single unit of
19bf0 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e   work towards an
19c00 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
19c10 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  uum..**.** If th
19c20 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  e incremental va
19c30 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64  cuum is finished
19c40 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
19c50 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a  tion has run,.**
19c60 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
19c70 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20  returned. If it 
19c80 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c  is not finished,
19c90 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
19ca0 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54  curred,.** SQLIT
19cb0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
19cc0 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53  . Otherwise an S
19cd0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
19ce0 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  . .*/.int sqlite
19cf0 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d  3BtreeIncrVacuum
19d00 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
19d10 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
19d20 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
19d30 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
19d40 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
19d50 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
19d60 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
19d70 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73  TE && p->inTrans
19d80 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
19d90 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74  .  if( !pBt->aut
19da0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
19db0 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
19dc0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67  .  }else{.    Pg
19dd0 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65  no nOrig = btree
19de0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
19df0 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d      Pgno nFree =
19e00 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
19e10 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
19e20 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69  ]);.    Pgno nFi
19e30 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  n = finalDbSize(
19e40 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65  pBt, nOrig, nFre
19e50 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72  e);..    if( nOr
19e60 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20  ig<nFin ){.     
19e70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
19e80 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
19e90 65 6c 73 65 20 69 66 28 20 6e 46 72 65 65 3e 30  else if( nFree>0
19ea0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
19eb0 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
19ec0 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
19ed0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19ee0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76  K ){.        inv
19ef0 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
19f00 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
19f10 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56        rc = incrV
19f20 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e  acuumStep(pBt, n
19f30 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a  Fin, nOrig, 0);.
19f40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
19f50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19f60 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
19f70 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
19f80 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
19f90 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
19fa0 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
19fb0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
19fc0 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  ], pBt->nPage);.
19fd0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
19fe0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
19ff0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
1a000 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
1a010 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1a020 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1a030 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1a040 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20  is called prior 
1a050 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
1a060 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61  ommit when a tra
1a070 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  nsaction.** is c
1a080 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20 61 6e 20  ommitted for an 
1a090 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
1a0a0 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  base..**.** If S
1a0b0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1a0c0 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72  rned, then *pnTr
1a0d0 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  unc is set to th
1a0e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1a0f0 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
1a100 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  e file should be
1a110 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75   truncated to du
1a120 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20  ring the commit 
1a130 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65  process. .** i.e
1a140 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  . the database h
1a150 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69  as been reorgani
1a160 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79  zed so that only
1a170 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72   the first *pnTr
1a180 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65  unc.** pages are
1a190 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   in use..*/.stat
1a1a0 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  ic int autoVacuu
1a1b0 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64  mCommit(BtShared
1a1c0 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63   *pBt){.  int rc
1a1d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1a1e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1a1f0 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56  pBt->pPager;.  V
1a200 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65  VA_ONLY( int nRe
1a210 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  f = sqlite3Pager
1a220 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
1a230 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   );..  assert( s
1a240 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1a250 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1a260 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c  .  invalidateAll
1a270 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
1a280 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74  t);.  assert(pBt
1a290 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20  ->autoVacuum);. 
1a2a0 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56   if( !pBt->incrV
1a2b0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
1a2c0 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20  o nFin;         
1a2d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1a2e0 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 61  es in database a
1a2f0 66 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69  fter autovacuumi
1a300 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ng */.    Pgno n
1a310 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  Free;        /* 
1a320 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1a330 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
1a340 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20  initially */.   
1a350 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20   Pgno iFree;    
1a360 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20      /* The next 
1a370 70 61 67 65 20 74 6f 20 62 65 20 66 72 65 65 64  page to be freed
1a380 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72   */.    Pgno nOr
1a390 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ig;        /* Da
1a3a0 74 61 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f  tabase size befo
1a3b0 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20  re freeing */.. 
1a3c0 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65     nOrig = btree
1a3d0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
1a3e0 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49      if( PTRMAP_I
1a3f0 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67  SPAGE(pBt, nOrig
1a400 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44  ) || nOrig==PEND
1a410 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1a420 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  t) ){.      /* I
1a430 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
1a440 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 61  e to create a da
1a450 74 61 62 61 73 65 20 66 6f 72 20 77 68 69 63 68  tabase for which
1a460 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a   the final page.
1a470 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68        ** is eith
1a480 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  er a pointer-map
1a490 20 70 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e   page or the pen
1a4a0 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20  ding-byte page. 
1a4b0 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20  If one.      ** 
1a4c0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
1a4d0 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 63  this indicates c
1a4e0 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20  orruption..     
1a4f0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1a500 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1a510 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
1a520 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
1a530 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1a540 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
1a550 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69  nFin = finalDbSi
1a560 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e  ze(pBt, nOrig, n
1a570 46 72 65 65 29 3b 0a 20 20 20 20 69 66 28 20 6e  Free);.    if( n
1a580 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75  Fin>nOrig ) retu
1a590 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1a5a0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28 20  T_BKPT;.    if( 
1a5b0 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20  nFin<nOrig ){.  
1a5c0 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c      rc = saveAll
1a5d0 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
1a5e0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  0);.    }.    fo
1a5f0 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69  r(iFree=nOrig; i
1a600 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d  Free>nFin && rc=
1a610 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65  =SQLITE_OK; iFre
1a620 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  e--){.      rc =
1a630 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
1a640 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65  pBt, nFin, iFree
1a650 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
1a660 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  if( (rc==SQLITE_
1a670 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  DONE || rc==SQLI
1a680 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e  TE_OK) && nFree>
1a690 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1a6a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1a6b0 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
1a6c0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70  DbPage);.      p
1a6d0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
1a6e0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
1a6f0 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
1a700 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1a710 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b  ->aData[36], 0);
1a720 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1a730 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1a740 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a  ata[28], nFin);.
1a750 20 20 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72        pBt->bDoTr
1a760 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20  uncate = 1;.    
1a770 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
1a780 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Fin;.    }.    i
1a790 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a7a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1a7b0 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
1a7c0 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
1a7d0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  }..  assert( nRe
1a7e0 66 3e 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52  f>=sqlite3PagerR
1a7f0 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
1a800 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1a810 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64  }..#else /* ifnd
1a820 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1a830 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64  UTOVACUUM */.# d
1a840 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74  efine setChildPt
1a850 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f  rmaps(x) SQLITE_
1a860 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  OK.#endif../*.**
1a870 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
1a880 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
1a890 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73  se of a two-phas
1a8a0 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20  e commit.  This 
1a8b0 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65  routine.** cause
1a8c0 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  s a rollback jou
1a8d0 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74  rnal to be creat
1a8e0 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e  ed (if it does n
1a8f0 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
1a900 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74  ).** and populat
1a910 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69  ed with enough i
1a920 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68  nformation so th
1a930 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f  at if a power lo
1a940 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65  ss occurs.** the
1a950 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
1a960 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
1a970 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
1a980 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a  by playing back.
1a990 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ** the journal. 
1a9a0 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   Then the conten
1a9b0 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ts of the journa
1a9c0 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75  l are flushed ou
1a9d0 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b  t to.** the disk
1a9e0 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  .  After the jou
1a9f0 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f  rnal is safely o
1aa00 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61  n oxide, the cha
1aa10 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64  nges to the.** d
1aa20 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74  atabase are writ
1aa30 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ten into the dat
1aa40 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66  abase file and f
1aa50 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e  lushed to oxide.
1aa60 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
1aa70 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65  f this call, the
1aa80 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1aa90 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f  l still exists o
1aaa0 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  n the.** disk an
1aab0 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68  d we are still h
1aac0 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73  olding all locks
1aad0 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63  , so the transac
1aae0 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20  tion has not.** 
1aaf0 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20  committed.  See 
1ab00 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1ab10 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72  itPhaseTwo() for
1ab20 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
1ab30 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d  e of the.** comm
1ab40 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  it process..**.*
1ab50 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * This call is a
1ab60 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69   no-op if no wri
1ab70 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
1ab80 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  s currently acti
1ab90 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a  ve on pBt..**.**
1aba0 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63   Otherwise, sync
1abb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1abc0 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65  le for the btree
1abd0 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f   pBt. zMaster po
1abe0 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  ints to.** the n
1abf0 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
1ac00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
1ac10 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
1ac20 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20  ten into the.** 
1ac30 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
1ac40 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e  al file, or is N
1ac50 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ULL, indicating 
1ac60 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
1ac70 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67  l file .** (sing
1ac80 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
1ac90 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
1aca0 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
1acb0 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20  led, the master 
1acc0 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61  journal should a
1acd0 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e  lready have been
1ace0 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70  .** created, pop
1acf0 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ulated with this
1ad00 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
1ad10 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
1ad20 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  isk..**.** Once 
1ad30 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20  this is routine 
1ad40 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68  has returned, th
1ad50 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71  e only thing req
1ad60 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a  uired to commit.
1ad70 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  ** the write-tra
1ad80 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69  nsaction for thi
1ad90 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  s database file 
1ada0 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
1adb0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74   journal..*/.int
1adc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1add0 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65  mitPhaseOne(Btre
1ade0 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
1adf0 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
1ae00 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1ae10 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
1ae20 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1ae30 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
1ae40 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1ae50 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
1ae60 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66  nter(p);.#ifndef
1ae70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1ae80 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
1ae90 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1aea0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75  ){.      rc = au
1aeb0 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70  toVacuumCommit(p
1aec0 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Bt);.      if( r
1aed0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1aee0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
1aef0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1af00 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1af10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1af20 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f 54     if( pBt->bDoT
1af30 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20  runcate ){.     
1af40 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
1af50 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e  ncateImage(pBt->
1af60 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61  pPager, pBt->nPa
1af70 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ge);.    }.#endi
1af80 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  f.    rc = sqlit
1af90 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
1afa0 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65  seOne(pBt->pPage
1afb0 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  r, zMaster, 0);.
1afc0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1afd0 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
1afe0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1aff0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1b000 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  n is called from
1b010 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69   both BtreeCommi
1b020 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20  tPhaseTwo() and 
1b030 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a  BtreeRollback().
1b040 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ** at the conclu
1b050 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61  sion of a transa
1b060 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
1b070 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72   void btreeEndTr
1b080 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20  ansaction(Btree 
1b090 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
1b0a0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1b0b0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1b0c0 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
1b0d0 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
1b0e0 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23 69  sMutex(p) );..#i
1b0f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1b100 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 70  T_AUTOVACUUM.  p
1b110 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
1b120 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  = 0;.#endif.  if
1b130 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  ( p->inTrans>TRA
1b140 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e  NS_NONE && db->n
1b150 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20 20  VdbeRead>1 ){.  
1b160 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
1b170 65 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73  e other active s
1b180 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62  tatements that b
1b190 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61  elong to this da
1b1a0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61  tabase.    ** ha
1b1b0 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20  ndle, downgrade 
1b1c0 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  to a read-only t
1b1d0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
1b1e0 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73  other statements
1b1f0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c  .    ** may stil
1b200 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f  l be reading fro
1b210 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
1b220 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64   */.    downgrad
1b230 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  eAllSharedCacheT
1b240 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
1b250 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
1b260 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c  RANS_READ;.  }el
1b270 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
1b280 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79  e handle had any
1b290 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63   kind of transac
1b2a0 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65  tion open, decre
1b2b0 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a  ment the .    **
1b2c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1b2d0 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  nt of the shared
1b2e0 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74   btree. If the t
1b2f0 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1b300 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73   .    ** reaches
1b310 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72   0, set the shar
1b320 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
1b330 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f  S_NONE. The unlo
1b340 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1b350 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65  ).    ** call be
1b360 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20  low will unlock 
1b370 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20  the pager.  */. 
1b380 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
1b390 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
1b3a0 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53  .      clearAllS
1b3b0 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1b3c0 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70  ocks(p);.      p
1b3d0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
1b3e0 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  --;.      if( 0=
1b3f0 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  =pBt->nTransacti
1b400 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  on ){.        pB
1b410 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1b420 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
1b430 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1b440 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72    /* Set the cur
1b450 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
1b460 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
1b470 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  NONE and unlock 
1b480 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65  the .    ** page
1b490 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63  r if this call c
1b4a0 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72  losed the only r
1b4b0 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
1b4c0 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  nsaction.  */.  
1b4d0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
1b4e0 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75  RANS_NONE;.    u
1b4f0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
1b500 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  ed(pBt);.  }..  
1b510 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1b520 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  );.}../*.** Comm
1b530 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
1b540 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  on currently in 
1b550 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  progress..**.** 
1b560 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70  This routine imp
1b570 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f  lements the seco
1b580 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d  nd phase of a 2-
1b590 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
1b5a0 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  he.** sqlite3Btr
1b5b0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
1b5c0 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  () routine does 
1b5d0 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
1b5e0 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  and should.** be
1b5f0 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74   invoked prior t
1b600 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
1b610 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c  outine.  The sql
1b620 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1b630 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75  haseOne().** rou
1b640 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65  tine did all the
1b650 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67   work of writing
1b660 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74   information out
1b670 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75   to disk and flu
1b680 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  shing the.** con
1b690 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68  tents so that th
1b6a0 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  ey are written o
1b6b0 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61  nto the disk pla
1b6c0 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a  tter.  All this.
1b6d0 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74  ** routine has t
1b6e0 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f  o do is delete o
1b6f0 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65  r truncate or ze
1b700 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e  ro the header in
1b710 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c   the.** the roll
1b720 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68  back journal (wh
1b730 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74  ich causes the t
1b740 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f  ransaction to co
1b750 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f  mmit) and.** dro
1b760 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e  p locks..**.** N
1b770 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65  ormally, if an e
1b780 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
1b790 65 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  e the pager laye
1b7a0 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20  r is attempting 
1b7b0 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20  to .** finalize 
1b7c0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a  the underlying j
1b7d0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69  ournal file, thi
1b7e0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1b7f0 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a  ns an error and.
1b800 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  ** the upper lay
1b810 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20  er will attempt 
1b820 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65  a rollback. Howe
1b830 76 65 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f  ver, if the seco
1b840 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  nd argument.** i
1b850 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20  s non-zero then 
1b860 74 68 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e  this b-tree tran
1b870 73 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20  saction is part 
1b880 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  of a multi-file 
1b890 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
1b8a0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
1b8b0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  he transaction h
1b8c0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1b8d0 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62  committed .** (b
1b8e0 79 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73  y deleting a mas
1b8f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1b900 29 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72  ) and the caller
1b910 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69   will ignore thi
1b920 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  s .** functions 
1b930 72 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c  return code. So,
1b940 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f   even if an erro
1b950 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  r occurs in the 
1b960 70 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20  pager layer,.** 
1b970 72 65 73 65 74 20 74 68 65 20 62 2d 74 72 65 65  reset the b-tree
1b980 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61   objects interna
1b990 6c 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63  l state to indic
1b9a0 61 74 65 20 74 68 61 74 20 74 68 65 20 77 72 69  ate that the wri
1b9b0 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  te.** transactio
1b9c0 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65  n has been close
1b9d0 64 2e 20 54 68 69 73 20 69 73 20 71 75 69 74 65  d. This is quite
1b9e0 20 73 61 66 65 2c 20 61 73 20 74 68 65 20 70 61   safe, as the pa
1b9f0 67 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a  ger will have.**
1ba00 20 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f   transitioned to
1ba10 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
1ba20 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
1ba30 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
1ba40 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
1ba50 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
1ba60 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
1ba70 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
1ba80 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
1ba90 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
1baa0 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
1bab0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1bac0 65 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69  eTwo(Btree *p, i
1bad0 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20  nt bCleanup){.. 
1bae0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1baf0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65  =TRANS_NONE ) re
1bb00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1bb10 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1bb20 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
1bb30 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
1bb40 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
1bb50 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61   has a write-tra
1bb60 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63  nsaction open, c
1bb70 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64  ommit the shared
1bb80 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72  -btrees .  ** tr
1bb90 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65  ansaction and se
1bba0 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
1bbb0 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44  te to TRANS_READ
1bbc0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
1bbd0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1bbe0 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
1bbf0 72 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64  rc;.    BtShared
1bc00 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1bc10 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
1bc20 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1bc30 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
1bc40 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
1bc50 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
1bc60 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1bc70 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
1bc80 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65  seTwo(pBt->pPage
1bc90 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
1bca0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c  SQLITE_OK && bCl
1bcb0 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20  eanup==0 ){.    
1bcc0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1bcd0 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65  ave(p);.      re
1bce0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1bcf0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
1bd00 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
1bd10 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65  AD;.    btreeCle
1bd20 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  arHasContent(pBt
1bd30 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45  );.  }..  btreeE
1bd40 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29  ndTransaction(p)
1bd50 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1bd60 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1bd70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1bd80 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70  ./*.** Do both p
1bd90 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69  hases of a commi
1bda0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1bdb0 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72  3BtreeCommit(Btr
1bdc0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
1bdd0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1bde0 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
1bdf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1be00 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30  mitPhaseOne(p, 0
1be10 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1be20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1be30 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
1be40 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 2c  ommitPhaseTwo(p,
1be50 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
1be60 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1be70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1be80 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1be90 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61  ine sets the sta
1bea0 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  te to CURSOR_FAU
1beb0 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  LT and the error
1bec0 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43  .** code to errC
1bed0 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75  ode for every cu
1bee0 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72 65 64  rsor on BtShared
1bef0 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20   that pBtree.** 
1bf00 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a  references..**.*
1bf10 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69  * Every cursor i
1bf20 73 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75  s tripped, inclu
1bf30 64 69 6e 67 20 63 75 72 73 6f 72 73 20 74 68 61  ding cursors tha
1bf40 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f  t belong.** to o
1bf50 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
1bf60 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68  nnections that h
1bf70 61 70 70 65 6e 20 74 6f 20 62 65 20 73 68 61 72  appen to be shar
1bf80 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  ing.** the cache
1bf90 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a   with pBtree..**
1bfa0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1bfb0 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65   gets called whe
1bfc0 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  n a rollback occ
1bfd0 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73  urs..** All curs
1bfe0 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20 73 61  ors using the sa
1bff0 6d 65 20 63 61 63 68 65 20 6d 75 73 74 20 62 65  me cache must be
1c000 20 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70   tripped.** to p
1c010 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d  revent them from
1c020 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74   trying to use t
1c030 68 65 20 62 74 72 65 65 20 61 66 74 65 72 0a 2a  he btree after.*
1c040 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20  * the rollback. 
1c050 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
1c060 79 20 68 61 76 65 20 64 65 6c 65 74 65 64 20 74  y have deleted t
1c070 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65  ables.** or move
1c080 64 20 72 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f  d root pages, so
1c090 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69   it is not suffi
1c0a0 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65  cient to.** save
1c0b0 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
1c0c0 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63  e cursor.  The c
1c0d0 75 72 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a  ursor must be.**
1c0e0 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f   invalidated..*/
1c0f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
1c100 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
1c110 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20  (Btree *pBtree, 
1c120 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a 20 20  int errCode){.  
1c130 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69  BtCursor *p;.  i
1c140 66 28 20 70 42 74 72 65 65 3d 3d 30 20 29 20 72  f( pBtree==0 ) r
1c150 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
1c160 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
1c170 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72  e);.  for(p=pBtr
1c180 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ee->pBt->pCursor
1c190 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
1c1a0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
1c1b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
1c1c0 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20  arCursor(p);.   
1c1d0 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
1c1e0 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70  SOR_FAULT;.    p
1c1f0 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72  ->skipNext = err
1c200 43 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Code;.    for(i=
1c210 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20  0; i<=p->iPage; 
1c220 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  i++){.      rele
1c230 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67  asePage(p->apPag
1c240 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e  e[i]);.      p->
1c250 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20  apPage[i] = 0;. 
1c260 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1c270 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
1c280 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ree);.}../*.** R
1c290 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
1c2a0 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
1c2b0 65 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72  ess.  All cursor
1c2c0 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76  s will be.** inv
1c2d0 61 6c 69 64 65 64 20 62 79 20 74 68 69 73 20 6f  alided by this o
1c2e0 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61  peration.  Any a
1c2f0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
1c300 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77  cursor.** that w
1c310 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62  as open at the b
1c320 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73  eginning of this
1c330 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20   operation will 
1c340 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20  result.** in an 
1c350 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  error..**.** Thi
1c360 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74  s will release t
1c370 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
1c380 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1c390 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  le.  If there.**
1c3a0 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63   are no active c
1c3b0 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20  ursors, it also 
1c3c0 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61  releases the rea
1c3d0 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  d lock..*/.int s
1c3e0 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
1c3f0 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ack(Btree *p, in
1c400 74 20 74 72 69 70 43 6f 64 65 29 7b 0a 20 20 69  t tripCode){.  i
1c410 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
1c420 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1c430 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1c440 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  e1;..  sqlite3Bt
1c450 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
1c460 66 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c  f( tripCode==SQL
1c470 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1c480 20 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61   = tripCode = sa
1c490 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
1c4a0 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  , 0, 0);.  }else
1c4b0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1c4c0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
1c4d0 74 72 69 70 43 6f 64 65 20 29 7b 0a 20 20 20 20  tripCode ){.    
1c4e0 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
1c4f0 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 74 72  AllCursors(p, tr
1c500 69 70 43 6f 64 65 29 3b 0a 20 20 7d 0a 20 20 62  ipCode);.  }.  b
1c510 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
1c520 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  ;..  if( p->inTr
1c530 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1c540 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
1c550 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52  ..    assert( TR
1c560 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e  ANS_WRITE==pBt->
1c570 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b  inTransaction );
1c580 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
1c590 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1c5a0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
1c5b0 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54    if( rc2!=SQLIT
1c5c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
1c5d0 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20   = rc2;.    }.. 
1c5e0 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61     /* The rollba
1c5f0 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74  ck may have dest
1c600 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31  royed the pPage1
1c610 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20  ->aData value.  
1c620 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62  So.    ** call b
1c630 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e  treeGetPage() on
1c640 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f   page 1 again to
1c650 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
1c660 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
1c670 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79  is set correctly
1c680 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72  . */.    if( btr
1c690 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
1c6a0 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53  , &pPage1, 0)==S
1c6b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c6c0 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65    int nPage = ge
1c6d0 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70  t4byte(28+(u8*)p
1c6e0 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20  Page1->aData);. 
1c6f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
1c700 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Page==0 );.     
1c710 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20   if( nPage==0 ) 
1c720 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1c730 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
1c740 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
1c750 20 20 74 65 73 74 63 61 73 65 28 20 70 42 74 2d    testcase( pBt-
1c760 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b  >nPage!=nPage );
1c770 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
1c780 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
1c790 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
1c7a0 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge1);.    }.    
1c7b0 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c  assert( countVal
1c7c0 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c 20 31  idCursors(pBt, 1
1c7d0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==0 );.    pBt-
1c7e0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
1c7f0 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20   TRANS_READ;.   
1c800 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
1c810 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a  ntent(pBt);.  }.
1c820 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  .  btreeEndTrans
1c830 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c  action(p);.  sql
1c840 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1c850 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1c860 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61  }../*.** Start a
1c870 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   statement subtr
1c880 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
1c890 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  ubtransaction ca
1c8a0 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a  n can be rolled.
1c8b0 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
1c8c0 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69  ently of the mai
1c8d0 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59  n transaction. Y
1c8e0 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20  ou must start a 
1c8f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
1c900 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20  before starting 
1c910 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  a subtransaction
1c920 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  . The subtransac
1c930 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75  tion is ended au
1c940 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
1c950 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  if the main tran
1c960 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20  saction commits 
1c970 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a  or rolls back..*
1c980 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73  *.** Statement s
1c990 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  ubtransactions a
1c9a0 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69  re used around i
1c9b0 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74  ndividual SQL st
1c9c0 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74  atements.** that
1c9d0 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77   are contained w
1c9e0 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e  ithin a BEGIN...
1c9f0 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49  COMMIT block.  I
1ca00 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  f a constraint.*
1ca10 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  * error occurs w
1ca20 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
1ca30 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20  ent, the effect 
1ca40 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74  of that one stat
1ca50 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20  ement.** can be 
1ca60 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68  rolled back with
1ca70 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f  out having to ro
1ca80 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72  llback the entir
1ca90 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
1caa0 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74  *.** A statement
1cab0 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e   sub-transaction
1cac0 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
1cad0 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20  as an anonymous 
1cae0 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a  savepoint. The.*
1caf0 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  * value passed a
1cb00 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
1cb10 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f  ameter is the to
1cb20 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  tal number of sa
1cb30 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63  vepoints,.** inc
1cb40 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61  luding the new a
1cb50 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
1cb60 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  nt, open on the 
1cb70 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20  B-Tree. i.e. if 
1cb80 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
1cb90 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
1cba0 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73  s and no other s
1cbb0 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63  tatement-transac
1cbc0 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69  tions open,.** i
1cbd0 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20  Statement is 1. 
1cbe0 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  This anonymous s
1cbf0 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20  avepoint can be 
1cc00 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c  released or roll
1cc10 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67  ed back.** using
1cc20 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
1cc30 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e  eSavepoint() fun
1cc40 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
1cc50 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53  lite3BtreeBeginS
1cc60 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  tmt(Btree *p, in
1cc70 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20  t iStatement){. 
1cc80 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
1cc90 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1cca0 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
1ccb0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
1ccc0 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  ert( p->inTrans=
1ccd0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
1cce0 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
1ccf0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
1cd00 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a  EAD_ONLY)==0 );.
1cd10 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
1cd20 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  ment>0 );.  asse
1cd30 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70  rt( iStatement>p
1cd40 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
1cd50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
1cd60 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1cd70 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
1cd80 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67  .  /* At the pag
1cd90 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74  er level, a stat
1cda0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
1cdb0 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  n is a savepoint
1cdc0 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e   with.  ** an in
1cdd0 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e  dex greater than
1cde0 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20   all savepoints 
1cdf0 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74  created explicit
1ce00 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51  ly using.  ** SQ
1ce10 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74  L statements. It
1ce20 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f   is illegal to o
1ce30 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20  pen, release or 
1ce40 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a  rollback any.  *
1ce50 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74  * such savepoint
1ce60 73 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74  s while the stat
1ce70 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
1ce80 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  n savepoint is a
1ce90 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  ctive..  */.  rc
1cea0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
1ceb0 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
1cec0 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65  ->pPager, iState
1ced0 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  ment);.  sqlite3
1cee0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1cef0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1cf00 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
1cf10 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
1cf20 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69   function, op, i
1cf30 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49  s always SAVEPOI
1cf40 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f  NT_ROLLBACK.** o
1cf50 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  r SAVEPOINT_RELE
1cf60 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ASE. This functi
1cf70 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73  on either releas
1cf80 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  es or rolls back
1cf90 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e   the.** savepoin
1cfa0 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  t identified by 
1cfb0 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70  parameter iSavep
1cfc0 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20  oint, depending 
1cfd0 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a  on the value .**
1cfe0 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   of op..**.** No
1cff0 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69  rmally, iSavepoi
1d000 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
1d010 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
1d020 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ero. However, if
1d030 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f   op is.** SAVEPO
1d040 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68  INT_ROLLBACK, th
1d050 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61  en iSavepoint ma
1d060 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e  y also be -1. In
1d070 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a   this case the .
1d080 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
1d090 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
1d0a0 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64  ction are rolled
1d0b0 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64   back. This is d
1d0c0 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d  ifferent.** from
1d0d0 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61   a normal transa
1d0e0 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20  ction rollback, 
1d0f0 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20  as no locks are 
1d100 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65  released and the
1d110 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
1d120 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f  remains open..*/
1d130 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1d140 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65  eSavepoint(Btree
1d150 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
1d160 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20   iSavepoint){.  
1d170 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1d180 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  OK;.  if( p && p
1d190 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1d1a0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
1d1b0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1d1c0 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
1d1d0 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
1d1e0 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53  RELEASE || op==S
1d1f0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
1d200 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
1d210 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c   iSavepoint>=0 |
1d220 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d  | (iSavepoint==-
1d230 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49  1 && op==SAVEPOI
1d240 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a  NT_ROLLBACK) );.
1d250 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1d260 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63  Enter(p);.    rc
1d270 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
1d280 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
1d290 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70  ager, op, iSavep
1d2a0 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72  oint);.    if( r
1d2b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d2c0 20 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70        if( iSavep
1d2d0 6f 69 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e  oint<0 && (pBt->
1d2e0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49  btsFlags & BTS_I
1d2f0 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21  NITIALLY_EMPTY)!
1d300 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  =0 ){.        pB
1d310 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  t->nPage = 0;.  
1d320 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
1d330 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
1d340 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  );.      pBt->nP
1d350 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32  age = get4byte(2
1d360 38 20 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  8 + pBt->pPage1-
1d370 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20  >aData);..      
1d380 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1d390 73 69 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e  size was written
1d3a0 20 69 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74   into the offset
1d3b0 20 32 38 20 6f 66 20 74 68 65 20 68 65 61 64 65   28 of the heade
1d3c0 72 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20  r.      ** when 
1d3d0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1d3e0 73 74 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b  started, so we k
1d3f0 6e 6f 77 20 74 68 61 74 20 74 68 65 20 76 61 6c  now that the val
1d400 75 65 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20  ue at offset.   
1d410 20 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a     ** 28 is nonz
1d420 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ero. */.      as
1d430 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65  sert( pBt->nPage
1d440 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >0 );.    }.    
1d450 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1d460 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
1d470 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1d480 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72  Create a new cur
1d490 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65  sor for the BTre
1d4a0 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20  e whose root is 
1d4b0 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69  on the page.** i
1d4c0 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64  Table. If a read
1d4d0 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20  -only cursor is 
1d4e0 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73  requested, it is
1d4f0 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
1d500 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65   the caller alre
1d510 61 64 79 20 68 61 73 20 61 74 20 6c 65 61 73 74  ady has at least
1d520 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61   a read-only tra
1d530 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a  nsaction open.**
1d540 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1d550 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77   already. If a w
1d560 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72  rite-cursor is r
1d570 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a  equested, then.*
1d580 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  * the caller is 
1d590 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20  assumed to have 
1d5a0 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
1d5b0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
1d5c0 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74   If wrFlag==0, t
1d5d0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63  hen the cursor c
1d5e0 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  an only be used 
1d5f0 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20  for reading..** 
1d600 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68  If wrFlag==1, th
1d610 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
1d620 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  n be used for re
1d630 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20  ading or for.** 
1d640 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72  writing if other
1d650 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20   conditions for 
1d660 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f  writing are also
1d670 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20   met.  These.** 
1d680 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  are the conditio
1d690 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  ns that must be 
1d6a0 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72  met in order for
1d6b0 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62   writing to.** b
1d6c0 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a  e allowed:.**.**
1d6d0 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20   1:  The cursor 
1d6e0 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
1d6f0 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61  pened with wrFla
1d700 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f  g==1.**.** 2:  O
1d710 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
1d720 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73  nnections that s
1d730 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61  hare the same pa
1d740 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20  ger cache.**    
1d750 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e   but which are n
1d760 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55  ot in the READ_U
1d770 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65  NCOMMITTED state
1d780 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a   may not have.**
1d790 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65       cursors ope
1d7a0 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  n with wrFlag==0
1d7b0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62   on the same tab
1d7c0 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a  le.  Otherwise.*
1d7d0 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65  *     the change
1d7e0 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77  s made by this w
1d7f0 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c  rite cursor woul
1d800 64 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a  d be visible to.
1d810 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20  **     the read 
1d820 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f  cursors in the o
1d830 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
1d840 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
1d850 33 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65  3:  The database
1d860 20 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c   must be writabl
1d870 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f  e (not on read-o
1d880 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a  nly media).**.**
1d890 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20   4:  There must 
1d8a0 62 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61  be an active tra
1d8b0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
1d8c0 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64  No checking is d
1d8d0 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  one to make sure
1d8e0 20 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c   that page iTabl
1d8f0 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a  e really is the.
1d900 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  ** root page of 
1d910 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74  a b-tree.  If it
1d920 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68   is not, then th
1d930 65 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65  e cursor acquire
1d940 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f  d.** will not wo
1d950 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a  rk correctly..**
1d960 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65  .** It is assume
1d970 64 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  d that the sqlit
1d980 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72  e3BtreeCursorZer
1d990 6f 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c  o() has been cal
1d9a0 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74  led.** on pCur t
1d9b0 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
1d9c0 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72   memory space pr
1d9d0 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20  ior to invoking 
1d9e0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  this routine..*/
1d9f0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
1da00 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
1da10 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1da20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da30 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
1da40 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1da50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
1da70 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
1da80 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
1da90 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
1daa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dab0 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
1dac0 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
1dad0 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
1dae0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
1daf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1db00 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70  irst arg to comp
1db10 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
1db20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
1db30 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
1db40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1db50 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72  pace for new cur
1db60 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  sor */.){.  BtSh
1db70 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1db80 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
1db90 20 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74     /* Shared b-t
1dba0 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20  ree handle */.. 
1dbb0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1dbc0 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
1dbd0 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
1dbe0 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46  wrFlag==0 || wrF
1dbf0 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20  lag==1 );..  /* 
1dc00 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
1dc10 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20  sert statements 
1dc20 76 65 72 69 66 79 20 74 68 61 74 20 69 66 20 74  verify that if t
1dc30 68 69 73 20 69 73 20 61 20 73 68 61 72 61 62 6c  his is a sharabl
1dc40 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64  e .  ** b-tree d
1dc50 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e  atabase, the con
1dc60 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69  nection is holdi
1dc70 6e 67 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ng the required 
1dc80 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20  table locks, .  
1dc90 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f  ** and that no o
1dca0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
1dcb0 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72  has any open cur
1dcc0 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63  sor that conflic
1dcd0 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68  ts with .  ** th
1dce0 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61  is lock.  */.  a
1dcf0 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64  ssert( hasShared
1dd00 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
1dd10 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e  , iTable, pKeyIn
1dd20 66 6f 21 3d 30 2c 20 77 72 46 6c 61 67 2b 31 29  fo!=0, wrFlag+1)
1dd30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
1dd40 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52  Flag==0 || !hasR
1dd50 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20  eadConflicts(p, 
1dd60 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a  iTable) );..  /*
1dd70 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
1dd80 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e   caller has open
1dd90 65 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ed the required 
1dda0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a  transaction. */.
1ddb0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
1ddc0 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  rans>TRANS_NONE 
1ddd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
1dde0 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54  lag==0 || p->inT
1ddf0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1de00 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
1de10 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42  Bt->pPage1 && pB
1de20 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1de30 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52   );..  if( NEVER
1de40 28 77 72 46 6c 61 67 20 26 26 20 28 70 42 74 2d  (wrFlag && (pBt-
1de50 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
1de60 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 29 20 29  READ_ONLY)!=0) )
1de70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1de80 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
1de90 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d  }.  if( iTable==
1dea0 31 20 26 26 20 62 74 72 65 65 50 61 67 65 63 6f  1 && btreePageco
1deb0 75 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20  unt(pBt)==0 ){. 
1dec0 20 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61     assert( wrFla
1ded0 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54 61 62  g==0 );.    iTab
1dee0 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  le = 0;.  }..  /
1def0 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74  * Now that no ot
1df00 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f  her errors can o
1df10 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c  ccur, finish fil
1df20 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75  ling in the BtCu
1df30 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62  rsor.  ** variab
1df40 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65  les and link the
1df50 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65   cursor into the
1df60 20 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20   BtShared list. 
1df70 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f   */.  pCur->pgno
1df80 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61  Root = (Pgno)iTa
1df90 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  ble;.  pCur->iPa
1dfa0 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d  ge = -1;.  pCur-
1dfb0 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79  >pKeyInfo = pKey
1dfc0 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42  Info;.  pCur->pB
1dfd0 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72  tree = p;.  pCur
1dfe0 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 61  ->pBt = pBt;.  a
1dff0 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
1e000 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 42 54 43 46   || wrFlag==BTCF
1e010 5f 57 72 69 74 65 46 6c 61 67 20 29 3b 0a 20 20  _WriteFlag );.  
1e020 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 3d  pCur->curFlags =
1e030 20 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d   wrFlag;.  pCur-
1e040 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43  >pNext = pBt->pC
1e050 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75  ursor;.  if( pCu
1e060 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
1e070 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
1e080 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20  ev = pCur;.  }. 
1e090 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
1e0a0 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53  pCur;.  pCur->eS
1e0b0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
1e0c0 56 41 4c 49 44 3b 0a 20 20 72 65 74 75 72 6e 20  VALID;.  return 
1e0d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74  SQLITE_OK;.}.int
1e0e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1e0f0 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  sor(.  Btree *p,
1e100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e120 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
1e130 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
1e140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e160 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
1e170 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
1e180 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
1e190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1b0 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30  /* 1 to write. 0
1e1c0 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
1e1d0 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a  struct KeyInfo *
1e1e0 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20  pKeyInfo,       
1e1f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1e200 69 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d  irst arg to xCom
1e210 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75  pare() */.  BtCu
1e220 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
1e230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e240 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1e250 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65   new cursor here
1e260 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
1e270 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1e280 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
1e290 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69  btreeCursor(p, i
1e2a0 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70  Table, wrFlag, p
1e2b0 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a  KeyInfo, pCur);.
1e2c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1e2d0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1e2e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
1e2f0 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
1e300 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65   a BtCursor obje
1e310 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a  ct in bytes..**.
1e320 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63  ** This interfac
1e330 65 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20  es is needed so 
1e340 74 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75  that users of cu
1e350 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c  rsors can preall
1e360 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69  ocate.** suffici
1e370 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68  ent storage to h
1e380 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54  old a cursor.  T
1e390 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65  he BtCursor obje
1e3a0 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20  ct is opaque.** 
1e3b0 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79  to users so they
1e3c0 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73   cannot do the s
1e3d0 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76  izeof() themselv
1e3e0 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63  es - they must c
1e3f0 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  all.** this rout
1e400 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ine..*/.int sqli
1e410 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69  te3BtreeCursorSi
1e420 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75  ze(void){.  retu
1e430 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  rn ROUND8(sizeof
1e440 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a  (BtCursor));.}..
1e450 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
1e460 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c   memory that wil
1e470 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  l be converted i
1e480 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f  nto a BtCursor o
1e490 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  bject..**.** The
1e4a0 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68   simple approach
1e4b0 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74   here would be t
1e4c0 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65  o memset() the e
1e4d0 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20  ntire object.** 
1e4e0 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74  to zero.  But it
1e4f0 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20   turns out that 
1e500 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64  the apPage[] and
1e510 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a   aiIdx[] arrays.
1e520 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  ** do not need t
1e530 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20  o be zeroed and 
1e540 74 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20  they are large, 
1e550 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20 61  so we can save a
1e560 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74   lot.** of run-t
1e570 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20  ime by skipping 
1e580 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
1e590 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d  on of those elem
1e5a0 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ents..*/.void sq
1e5b0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1e5c0 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Zero(BtCursor *p
1e5d0 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  ){.  memset(p, 0
1e5e0 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72  , offsetof(BtCur
1e5f0 73 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a  sor, iPage));.}.
1e600 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
1e610 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64  ursor.  The read
1e620 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1e630 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65  abase file is re
1e640 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74  leased.** when t
1e650 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69  he last cursor i
1e660 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74  s closed..*/.int
1e670 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
1e680 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  seCursor(BtCurso
1e690 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65  r *pCur){.  Btre
1e6a0 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72  e *pBtree = pCur
1e6b0 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20  ->pBtree;.  if( 
1e6c0 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e  pBtree ){.    in
1e6d0 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65  t i;.    BtShare
1e6e0 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
1e6f0 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  Bt;.    sqlite3B
1e700 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
1e710 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
1e720 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
1e730 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43  Cur);.    if( pC
1e740 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  ur->pPrev ){.   
1e750 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e     pCur->pPrev->
1e760 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e  pNext = pCur->pN
1e770 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
1e780 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73        pBt->pCurs
1e790 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  or = pCur->pNext
1e7a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1e7b0 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  pCur->pNext ){. 
1e7c0 20 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74       pCur->pNext
1e7d0 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d 3e  ->pPrev = pCur->
1e7e0 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20  pPrev;.    }.   
1e7f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
1e800 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
1e810 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1e820 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  e(pCur->apPage[i
1e830 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e  ]);.    }.    un
1e840 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
1e850 64 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  d(pBt);.    sqli
1e860 74 65 33 44 62 46 72 65 65 28 70 42 74 72 65 65  te3DbFree(pBtree
1e870 2d 3e 64 62 2c 20 70 43 75 72 2d 3e 61 4f 76 65  ->db, pCur->aOve
1e880 72 66 6c 6f 77 29 3b 0a 20 20 20 20 2f 2a 20 73  rflow);.    /* s
1e890 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
1e8a0 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ); */.    sqlite
1e8b0 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
1e8c0 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ee);.  }.  retur
1e8d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1e8e0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
1e8f0 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69  the BtCursor* gi
1e900 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
1e910 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a  ent has a valid.
1e920 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  ** BtCursor.info
1e930 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20   structure.  If 
1e940 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
1e950 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a  y valid, call.**
1e960 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
1e970 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e  ) to fill it in.
1e980 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  .**.** BtCursor.
1e990 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20  info is a cache 
1e9a0 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  of the informati
1e9b0 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  on in the curren
1e9c0 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67  t cell..** Using
1e9d0 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75   this cache redu
1e9e0 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ces the number o
1e9f0 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65  f calls to btree
1ea00 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a  ParseCell()..**.
1ea10 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20  ** 2007-06-25:  
1ea20 54 68 65 72 65 20 69 73 20 61 20 62 75 67 20 69  There is a bug i
1ea30 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20  n some versions 
1ea40 6f 66 20 4d 53 56 43 20 74 68 61 74 20 63 61 75  of MSVC that cau
1ea50 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c  se the.** compil
1ea60 65 72 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e  er to crash when
1ea70 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69   getCellInfo() i
1ea80 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
1ea90 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74   a macro..** But
1eaa0 20 74 68 65 72 65 20 69 73 20 61 20 6d 65 61 73   there is a meas
1eab0 75 72 65 61 62 6c 65 20 73 70 65 65 64 20 61 64  ureable speed ad
1eac0 76 61 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67  vantage to using
1ead0 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63   the macro on gc
1eae0 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20  c.** (when less 
1eaf0 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a  compiler optimiz
1eb00 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20  ations like -Os 
1eb10 6f 72 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20  or -O0 are used 
1eb20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69  and the.** compi
1eb30 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67  ler is not doing
1eb40 20 61 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e   agressive inlin
1eb50 69 6e 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65  ing.)  So we use
1eb60 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e   a real function
1eb70 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64  .** for MSVC and
1eb80 20 61 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65   a macro for eve
1eb90 72 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54  rything else.  T
1eba0 69 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a  icket #2457..*/.
1ebb0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
1ebc0 20 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73   static void ass
1ebd0 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  ertCellInfo(BtCu
1ebe0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20  rsor *pCur){.   
1ebf0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
1ec00 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
1ec10 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20  pCur->iPage;.   
1ec20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30   memset(&info, 0
1ec30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b  , sizeof(info));
1ec40 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
1ec50 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ell(pCur->apPage
1ec60 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61  [iPage], pCur->a
1ec70 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e  iIdx[iPage], &in
1ec80 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  fo);.    assert(
1ec90 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 6d   CORRUPT_DB || m
1eca0 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43  emcmp(&info, &pC
1ecb0 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66  ur->info, sizeof
1ecc0 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20  (info))==0 );.  
1ecd0 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e  }.#else.  #defin
1ece0 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f  e assertCellInfo
1ecf0 28 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  (x).#endif.#ifde
1ed00 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20  f _MSC_VER.  /* 
1ed10 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74  Use a real funct
1ed20 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77  ion in MSVC to w
1ed30 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20  ork around bugs 
1ed40 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72  in that compiler
1ed50 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f  . */.  static vo
1ed60 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42  id getCellInfo(B
1ed70 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1ed80 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
1ed90 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  fo.nSize==0 ){. 
1eda0 20 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d       int iPage =
1edb0 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
1edc0 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
1edd0 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
1ede0 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49  iPage],pCur->aiI
1edf0 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d  dx[iPage],&pCur-
1ee00 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43  >info);.      pC
1ee10 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
1ee20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a  BTCF_ValidNKey;.
1ee30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ee40 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
1ee50 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
1ee60 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74  .#else /* if not
1ee70 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f   _MSC_VER */.  /
1ee80 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e  * Use a macro in
1ee90 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69   all other compi
1eea0 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65  lers so that the
1eeb0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c   function is inl
1eec0 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ined */.#define 
1eed0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
1eee0 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
1eef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef10 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70         \.  if( p
1ef20 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
1ef30 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
1ef40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef60 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e          \.    in
1ef70 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
1ef80 69 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  iPage;          
1ef90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efb0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 62           \.    b
1efc0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
1efd0 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
1efe0 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  ],pCur->aiIdx[iP
1eff0 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f  age],&pCur->info
1f000 29 3b 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20  );        \.    
1f010 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
1f020 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  = BTCF_ValidNKey
1f030 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f050 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d             \.  }
1f060 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20  else{           
1f070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0a0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1f0b0 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f    assertCellInfo
1f0c0 28 70 43 75 72 29 3b 20 20 20 20 20 20 20 20 20  (pCur);         
1f0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1f100 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53   }.#endif /* _MS
1f110 43 5f 56 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65  C_VER */..#ifnde
1f120 66 20 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65  f NDEBUG  /* The
1f130 20 6e 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73   next routine us
1f140 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61  ed only within a
1f150 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
1f160 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ts */./*.** Retu
1f170 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 67  rn true if the g
1f180 69 76 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73  iven BtCursor is
1f190 20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64   valid.  A valid
1f1a0 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a   cursor is one.*
1f1b0 2a 20 74 68 61 74 20 69 73 20 63 75 72 72 65 6e  * that is curren
1f1c0 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  tly pointing to 
1f1d0 61 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d  a row in a (non-
1f1e0 65 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a  empty) table..**
1f1f0 20 54 68 69 73 20 69 73 20 61 20 76 65 72 69 66   This is a verif
1f200 69 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20  ication routine 
1f210 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74  is used only wit
1f220 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61  hin assert() sta
1f230 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20  tements..*/.int 
1f240 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1f250 6f 72 49 73 56 61 6c 69 64 28 42 74 43 75 72 73  orIsValid(BtCurs
1f260 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74  or *pCur){.  ret
1f270 75 72 6e 20 70 43 75 72 20 26 26 20 70 43 75 72  urn pCur && pCur
1f280 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1f290 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66  _VALID;.}.#endif
1f2a0 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f   /* NDEBUG */../
1f2b0 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20  *.** Set *pSize 
1f2c0 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
1f2d0 68 65 20 62 75 66 66 65 72 20 6e 65 65 64 65 64  he buffer needed
1f2e0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c   to hold the val
1f2f0 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ue of.** the key
1f300 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
1f310 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20   entry.  If the 
1f320 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
1f330 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76  inting.** to a v
1f340 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69  alid entry, *pSi
1f350 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20  ze is set to 0. 
1f360 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62  .**.** For a tab
1f370 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b  le with the INTK
1f380 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69  EY flag set, thi
1f390 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1f3a0 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73  s the key.** its
1f3b0 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d  elf, not the num
1f3c0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
1f3d0 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54  the key..**.** T
1f3e0 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 70  he caller must p
1f3f0 6f 73 69 74 69 6f 6e 20 74 68 65 20 63 75 72 73  osition the curs
1f400 6f 72 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f  or prior to invo
1f410 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  king this routin
1f420 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72  e..** .** This r
1f430 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61  outine cannot fa
1f440 69 6c 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72  il.  It always r
1f450 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
1f460 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .  .*/.int sqlit
1f470 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42  e3BtreeKeySize(B
1f480 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1f490 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73  64 *pSize){.  as
1f4a0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1f4b0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1f4c0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1f4d0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
1f4e0 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  NVALID || pCur->
1f4f0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1f500 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70 43  ALID );.  if( pC
1f510 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
1f520 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
1f530 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 65  *pSize = 0;.  }e
1f540 6c 73 65 7b 0a 20 20 20 20 67 65 74 43 65 6c 6c  lse{.    getCell
1f550 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20  Info(pCur);.    
1f560 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
1f570 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  nfo.nKey;.  }.  
1f580 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1f590 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a  ;.}../*.** Set *
1f5a0 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d  pSize to the num
1f5b0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
1f5c0 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72  data in the entr
1f5d0 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  y the.** cursor 
1f5e0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
1f5f0 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63   to..**.** The c
1f600 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61  aller must guara
1f610 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 63 75  ntee that the cu
1f620 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
1f630 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a   to a non-NULL.*
1f640 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20  * valid entry.  
1f650 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1f660 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
1f670 65 64 75 72 65 20 6d 75 73 74 20 67 75 61 72 61  edure must guara
1f680 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65  ntee.** that the
1f690 20 63 75 72 73 6f 72 20 68 61 73 20 43 75 72 73   cursor has Curs
1f6a0 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  or.eState==CURSO
1f6b0 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46  R_VALID..**.** F
1f6c0 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f  ailure is not po
1f6d0 73 73 69 62 6c 65 2e 20 20 54 68 69 73 20 66 75  ssible.  This fu
1f6e0 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 72 65  nction always re
1f6f0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
1f700 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a 75 73  .** It might jus
1f710 74 20 61 73 20 77 65 6c 6c 20 62 65 20 61 20 70  t as well be a p
1f720 72 6f 63 65 64 75 72 65 20 28 72 65 74 75 72 6e  rocedure (return
1f730 69 6e 67 20 76 6f 69 64 29 20 62 75 74 20 77 65  ing void) but we
1f740 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20   continue.** to 
1f750 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  return an intege
1f760 72 20 72 65 73 75 6c 74 20 63 6f 64 65 20 66 6f  r result code fo
1f770 72 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65 61  r historical rea
1f780 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sons..*/.int sql
1f790 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a  ite3BtreeDataSiz
1f7a0 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
1f7b0 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20  , u32 *pSize){. 
1f7c0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1f7d0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1f7e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1f7f0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1f800 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74  R_VALID );.  get
1f810 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
1f820 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
1f830 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 72  >info.nData;.  r
1f840 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f850 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
1f860 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1f870 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  of an overflow p
1f880 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
1f890 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a  ase (parameter.*
1f8a0 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75  * ovfl), this fu
1f8b0 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65  nction finds the
1f8c0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1f8d0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
1f8e0 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20   the .** linked 
1f8f0 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77  list of overflow
1f900 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69   pages. If possi
1f910 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65  ble, it uses the
1f920 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
1f930 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61  pointer-map data
1f940 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64   instead of read
1f950 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
1f960 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20  of page ovfl to 
1f970 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  do so. .**.** If
1f980 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1f990 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1f9a0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1f9b0 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a  d. Otherwise:.**
1f9c0 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d  .** The page num
1f9d0 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
1f9e0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
1f9f0 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
1fa00 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20   is .** written 
1fa10 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49  to *pPgnoNext. I
1fa20 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74  f page ovfl is t
1fa30 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
1fa40 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c  its linked .** l
1fa50 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20  ist, *pPgnoNext 
1fa60 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
1fa70 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65  .**.** If ppPage
1fa80 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e   is not NULL, an
1fa90 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  d a reference to
1faa0 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
1fab0 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ect correspondin
1fac0 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d  g.** to page num
1fad0 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62  ber pOvfl was ob
1fae0 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70  tained, then *pp
1faf0 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70  Page is set to p
1fb00 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20  oint to that.** 
1fb10 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73  reference. It is
1fb20 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
1fb30 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
1fb40 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73  r to call releas
1fb50 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70  ePage().** on *p
1fb60 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68  pPage to free th
1fb70 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20  e reference. In 
1fb80 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73  no reference was
1fb90 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75   obtained (becau
1fba0 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  se.** the pointe
1fbb0 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74  r-map was used t
1fbc0 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c  o obtain the val
1fbd0 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78  ue for *pPgnoNex
1fbe0 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50  t), then.** *ppP
1fbf0 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65  age is set to ze
1fc00 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
1fc10 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  t getOverflowPag
1fc20 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
1fc30 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt,             
1fc40 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1fc50 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
1fc60 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20   ovfl,          
1fc70 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
1fc80 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
1fc90 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65  e number */.  Me
1fca0 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
1fcb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
1fcc0 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c  T: MemPage handl
1fcd0 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20  e (may be NULL) 
1fce0 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  */.  Pgno *pPgno
1fcf0 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  Next            
1fd00 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f    /* OUT: Next o
1fd10 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
1fd20 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f  ber */.){.  Pgno
1fd30 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d   next = 0;.  Mem
1fd40 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
1fd50 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1fd60 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
1fd70 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1fd80 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1fd90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67   );.  assert(pPg
1fda0 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65  noNext);..#ifnde
1fdb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1fdc0 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72  TOVACUUM.  /* Tr
1fdd0 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65  y to find the ne
1fde0 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
1fdf0 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69  verflow list usi
1fe00 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f  ng the.  ** auto
1fe10 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d  vacuum pointer-m
1fe20 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20  ap pages. Guess 
1fe30 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61  that the next pa
1fe40 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20  ge in .  ** the 
1fe50 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73  overflow list is
1fe60 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76   page number (ov
1fe70 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67  fl+1). If that g
1fe80 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a  uess turns .  **
1fe90 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67   out to be wrong
1fea0 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c  , fall back to l
1feb0 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  oading the data 
1fec0 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75  of page .  ** nu
1fed0 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74  mber ovfl to det
1fee0 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20  ermine the next 
1fef0 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a  page number..  *
1ff00 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  /.  if( pBt->aut
1ff10 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  oVacuum ){.    P
1ff20 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67  gno pgno;.    Pg
1ff30 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c  no iGuess = ovfl
1ff40 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65  +1;.    u8 eType
1ff50 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54  ;..    while( PT
1ff60 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1ff70 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65   iGuess) || iGue
1ff80 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ss==PENDING_BYTE
1ff90 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1ffa0 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20      iGuess++;.  
1ffb0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75    }..    if( iGu
1ffc0 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f  ess<=btreePageco
1ffd0 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
1ffe0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
1fff0 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65  (pBt, iGuess, &e
20000 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  Type, &pgno);.  
20010 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
20020 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d  TE_OK && eType==
20030 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
20040 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29   && pgno==ovfl )
20050 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d  {.        next =
20060 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20   iGuess;.       
20070 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
20080 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
20090 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
200a0 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c  ssert( next==0 |
200b0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  | rc==SQLITE_DON
200c0 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  E );.  if( rc==S
200d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
200e0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
200f0 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50  e(pBt, ovfl, &pP
20100 61 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30 29  age, (ppPage==0)
20110 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   ? PAGER_GET_REA
20120 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20  DONLY : 0);.    
20130 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
20140 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d  TE_OK || pPage==
20150 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  0 );.    if( rc=
20160 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20170 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62      next = get4b
20180 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
20190 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
201a0 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78  *pPgnoNext = nex
201b0 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65 20  t;.  if( ppPage 
201c0 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  ){.    *ppPage =
201d0 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b   pPage;.  }else{
201e0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
201f0 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  (pPage);.  }.  r
20200 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
20210 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f  E_DONE ? SQLITE_
20220 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  OK : rc);.}../*.
20230 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  ** Copy data fro
20240 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20  m a buffer to a 
20250 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20  page, or from a 
20260 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72  page to a buffer
20270 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64  ..**.** pPayload
20280 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
20290 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20   data stored on 
202a0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
202b0 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67  bPage..** If arg
202c0 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c  ument eOp is fal
202d0 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62  se, then nByte b
202e0 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65  ytes of data are
202f0 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20   copied.** from 
20300 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20  pPayload to the 
20310 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61  buffer pointed a
20320 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f  t by pBuf. If eO
20330 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68  p is true,.** th
20340 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  en sqlite3PagerW
20350 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  rite() is called
20360 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20   on pDbPage and 
20370 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f  nByte bytes.** o
20380 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
20390 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65  d from the buffe
203a0 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f  r pBuf to pPaylo
203b0 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ad..**.** SQLITE
203c0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
203d0 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65  on success, othe
203e0 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63  rwise an error c
203f0 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
20400 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a  nt copyPayload(.
20410 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64    void *pPayload
20420 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
20430 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64  ointer to page d
20440 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ata */.  void *p
20450 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
20460 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
20470 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
20480 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20   nByte,         
20490 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
204a0 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70   of bytes to cop
204b0 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20  y */.  int eOp, 
204c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204d0 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72   /* 0 -> copy fr
204e0 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f  om page, 1 -> co
204f0 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20  py to page */.  
20500 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20  DbPage *pDbPage 
20510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
20520 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61  e containing pPa
20530 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66  yload */.){.  if
20540 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  ( eOp ){.    /* 
20550 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62  Copy data from b
20560 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61  uffer to page (a
20570 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
20580 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20  ) */.    int rc 
20590 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
205a0 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
205b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
205c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
205d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
205e0 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
205f0 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b  d, pBuf, nByte);
20600 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
20610 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
20620 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28  page to buffer (
20630 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
20640 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28  ) */.    memcpy(
20650 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20  pBuf, pPayload, 
20660 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65  nByte);.  }.  re
20670 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20680 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
20690 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
206a0 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72  o read or overwr
206b0 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f  ite payload info
206c0 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74  rmation.** for t
206d0 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
206e0 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  e pCur cursor is
206f0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68   pointing to. Th
20700 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e  e eOp.** argumen
20710 74 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  t is interpreted
20720 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
20730 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65 72  **   0: The oper
20740 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e  ation is a read.
20750 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   Populate the ov
20760 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a  erflow cache..**
20770 20 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61 74     1: The operat
20780 69 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e 20  ion is a write. 
20790 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  Populate the ove
207a0 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20  rflow cache..** 
207b0 20 20 32 3a 20 54 68 65 20 6f 70 65 72 61 74 69    2: The operati
207c0 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20 44 6f  on is a read. Do
207d0 20 6e 6f 74 20 70 6f 70 75 6c 61 74 65 20 74 68   not populate th
207e0 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65  e overflow cache
207f0 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20  ..**.** A total 
20800 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61  of "amt" bytes a
20810 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  re read or writt
20820 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  en beginning at 
20830 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74  "offset"..** Dat
20840 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20  a is read to or 
20850 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20  from the buffer 
20860 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  pBuf..**.** The 
20870 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65  content being re
20880 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69  ad or written mi
20890 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68  ght appear on th
208a0 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f  e main page.** o
208b0 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f  r be scattered o
208c0 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f  ut on multiple o
208d0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a  verflow pages..*
208e0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
208f0 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79  ent cursor entry
20900 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72   uses one or mor
20910 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
20920 20 61 6e 64 20 74 68 65 0a 2a 2a 20 65 4f 70 20   and the.** eOp 
20930 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
20940 32 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  2, this function
20950 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73 70   may allocate sp
20960 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69  ace for and lazi
20970 6c 79 20 0a 2a 2a 20 70 6f 70 6c 75 61 74 65 73  ly .** popluates
20980 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
20990 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 61 72  ge-list cache ar
209a0 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f  ray (BtCursor.aO
209b0 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75  verflow). .** Su
209c0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75  bsequent calls u
209d0 73 65 20 74 68 69 73 20 63 61 63 68 65 20 74 6f  se this cache to
209e0 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f   make seeking to
209f0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66   the supplied of
20a00 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66  fset .** more ef
20a10 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f  ficient..**.** O
20a20 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  nce an overflow 
20a30 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
20a40 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
20a50 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a  ed, it may be.**
20a60 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20   invalidated if 
20a70 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f  some other curso
20a80 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20  r writes to the 
20a90 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69  same table, or i
20aa0 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20  f.** the cursor 
20ab0 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69  is moved to a di
20ac0 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64  fferent row. Add
20ad0 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75  itionally, in au
20ae0 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64  to-vacuum.** mod
20af0 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
20b00 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61   events may inva
20b10 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c  lidate an overfl
20b20 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
20b30 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e  he..**.**   * An
20b40 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
20b50 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f  uum,.**   * A co
20b60 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63  mmit in auto_vac
20b70 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c  uum="full" mode,
20b80 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67  .**   * Creating
20b90 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65   a table (may re
20ba0 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20  quire moving an 
20bb0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a  overflow page)..
20bc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63  */.static int ac
20bd0 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42  cessPayload(.  B
20be0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
20bf0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
20c00 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20  inting to entry 
20c10 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
20c20 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20    u32 offset,   
20c30 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
20c40 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72  reading this far
20c50 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f   into payload */
20c60 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20  .  u32 amt,     
20c70 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
20c80 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
20c90 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
20ca0 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69  ar *pBuf, /* Wri
20cb0 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74  te the bytes int
20cc0 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f  o this buffer */
20cd0 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20   .  int eOp     
20ce0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f           /* zero
20cf0 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65   to read. non-ze
20d00 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a  ro to write. */.
20d10 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
20d20 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *aPayload;.  
20d30 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
20d40 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a  OK;.  u32 nKey;.
20d50 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a    int iIdx = 0;.
20d60 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
20d70 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
20d80 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a  pCur->iPage]; /*
20d90 20 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63   Btree page of c
20da0 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a  urrent entry */.
20db0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
20dc0 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20  = pCur->pBt;    
20dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20de0 20 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73   Btree this curs
20df0 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f  or belongs to */
20e00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
20e10 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
20e20 45 41 44 0a 20 20 69 6e 74 20 62 45 6e 64 3b 20  EAD.  int bEnd; 
20e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e50 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61    /* True if rea
20e60 64 69 6e 67 20 74 6f 20 65 6e 64 20 6f 66 20 64  ding to end of d
20e70 61 74 61 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ata */.#endif.. 
20e80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29   assert( pPage )
20e90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
20ea0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
20eb0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
20ec0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
20ed0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
20ee0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
20ef0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
20f00 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
20f10 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70 21 3d  .  assert( eOp!=
20f20 32 20 7c 7c 20 6f 66 66 73 65 74 3d 3d 30 20 29  2 || offset==0 )
20f30 3b 20 20 20 20 20 20 2f 2a 20 41 6c 77 61 79 73  ;      /* Always
20f40 20 73 74 61 72 74 20 66 72 6f 6d 20 62 65 67 69   start from begi
20f50 6e 6e 69 6e 67 20 66 6f 72 20 65 4f 70 3d 3d 32  nning for eOp==2
20f60 20 2a 2f 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e   */..  getCellIn
20f70 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
20f80 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
20f90 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e  o.pCell + pCur->
20fa0 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20  info.nHeader;.  
20fb0 6e 4b 65 79 20 3d 20 28 70 50 61 67 65 2d 3e 69  nKey = (pPage->i
20fc0 6e 74 4b 65 79 20 3f 20 30 20 3a 20 28 69 6e 74  ntKey ? 0 : (int
20fd0 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79  )pCur->info.nKey
20fe0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
20ff0 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
21000 5f 52 45 41 44 0a 20 20 62 45 6e 64 20 3d 20 28  _READ.  bEnd = (
21010 6f 66 66 73 65 74 2b 61 6d 74 3d 3d 6e 4b 65 79  offset+amt==nKey
21020 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74  +pCur->info.nDat
21030 61 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  a);.#endif..  if
21040 28 20 4e 45 56 45 52 28 6f 66 66 73 65 74 2b 61  ( NEVER(offset+a
21050 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e  mt > nKey+pCur->
21060 69 6e 66 6f 2e 6e 44 61 74 61 29 20 0a 20 20 20  info.nData) .   
21070 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75  || &aPayload[pCu
21080 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20  r->info.nLocal] 
21090 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  > &pPage->aData[
210a0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d  pBt->usableSize]
210b0 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79  .  ){.    /* Try
210c0 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77  ing to read or w
210d0 72 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e  rite past the en
210e0 64 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73  d of the data is
210f0 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
21100 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
21110 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
21120 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
21130 64 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61  data must be rea
21140 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f  d/written to/fro
21150 6d 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65  m the btree page
21160 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66   itself. */.  if
21170 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69  ( offset<pCur->i
21180 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
21190 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
211a0 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e     if( a+offset>
211b0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
211c0 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70  l ){.      a = p
211d0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
211e0 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d   - offset;.    }
211f0 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61  .    rc = copyPa
21200 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b  yload(&aPayload[
21210 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61  offset], pBuf, a
21220 2c 20 28 65 4f 70 20 26 20 30 78 30 31 29 2c 20  , (eOp & 0x01), 
21230 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
21240 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b  .    offset = 0;
21250 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a  .    pBuf += a;.
21260 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
21270 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65  }else{.    offse
21280 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t -= pCur->info.
21290 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69  nLocal;.  }..  i
212a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
212b0 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
212c0 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53   const u32 ovflS
212d0 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
212e0 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42  eSize - 4;  /* B
212f0 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72  ytes content per
21300 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20   ovfl page */.  
21310 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b    Pgno nextPage;
21320 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d  ..    nextPage =
21330 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c   get4byte(&aPayl
21340 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
21350 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a  Local]);..    /*
21360 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72   If the BtCursor
21370 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73  .aOverflow[] has
21380 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
21390 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74  ted, allocate it
213a0 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a 20 45 78 63   now..    ** Exc
213b0 65 70 74 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f  ept, do not allo
213c0 63 61 74 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d  cate aOverflow[]
213d0 20 66 6f 72 20 65 4f 70 3d 3d 32 2e 0a 20 20 20   for eOp==2..   
213e0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61   **.    ** The a
213f0 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
21400 20 69 73 20 73 69 7a 65 64 20 61 74 20 6f 6e 65   is sized at one
21410 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20   entry for each 
21420 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
21430 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65 72    ** in the over
21440 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20  flow chain. The 
21450 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
21460 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
21470 77 20 70 61 67 65 20 69 73 0a 20 20 20 20 2a 2a  w page is.    **
21480 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72   stored in aOver
21490 66 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20  flow[0], etc. A 
214a0 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68  value of 0 in th
214b0 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
214c0 72 61 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73  ray.    ** means
214d0 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22   "not yet known"
214e0 20 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c   (the cache is l
214f0 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29  azily populated)
21500 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
21510 20 65 4f 70 21 3d 32 20 26 26 20 28 70 43 75 72   eOp!=2 && (pCur
21520 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
21530 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20  F_ValidOvfl)==0 
21540 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76  ){.      int nOv
21550 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f  fl = (pCur->info
21560 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e  .nPayload-pCur->
21570 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c  info.nLocal+ovfl
21580 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65  Size-1)/ovflSize
21590 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66  ;.      if( nOvf
215a0 6c 3e 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c  l>pCur->nOvflAll
215b0 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  oc ){.        Pg
215c0 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f  no *aNew = (Pgno
215d0 2a 29 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  *)sqlite3DbReall
215e0 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  oc(.            
215f0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
21600 2c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  , pCur->aOverflo
21610 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f  w, nOvfl*2*sizeo
21620 66 28 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20  f(Pgno).        
21630 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
21640 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
21650 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
21660 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d  NOMEM;.        }
21670 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
21680 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63  pCur->nOvflAlloc
21690 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20 20 20 20   = nOvfl*2;.    
216a0 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65        pCur->aOve
216b0 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a 20 20  rflow = aNew;.  
216c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
216d0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
216e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
216f0 20 20 20 6d 65 6d 73 65 74 28 70 43 75 72 2d 3e     memset(pCur->
21700 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f  aOverflow, 0, nO
21710 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29  vfl*sizeof(Pgno)
21720 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  );.        pCur-
21730 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
21740 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20  F_ValidOvfl;.   
21750 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
21760 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c  /* If the overfl
21770 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
21780 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  he has been allo
21790 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20  cated and the.  
217a0 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74    ** entry for t
217b0 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72 65  he first require
217c0 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  d overflow page 
217d0 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20  is valid, skip. 
217e0 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74     ** directly t
217f0 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o it..    */.   
21800 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46   if( (pCur->curF
21810 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
21820 64 4f 76 66 6c 29 21 3d 30 20 26 26 20 70 43 75  dOvfl)!=0 && pCu
21830 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66  r->aOverflow[off
21840 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b  set/ovflSize] ){
21850 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f  .      iIdx = (o
21860 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b  ffset/ovflSize);
21870 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20  .      nextPage 
21880 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
21890 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f  w[iIdx];.      o
218a0 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25  ffset = (offset%
218b0 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d  ovflSize);.    }
218c0 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d  ..    for( ; rc=
218d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
218e0 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b  t>0 && nextPage;
218f0 20 69 49 64 78 2b 2b 29 7b 0a 0a 20 20 20 20 20   iIdx++){..     
21900 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c   /* If required,
21910 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   populate the ov
21920 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
21930 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20   cache. */.     
21940 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46   if( (pCur->curF
21950 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
21960 64 4f 76 66 6c 29 21 3d 30 20 29 7b 0a 20 20 20  dOvfl)!=0 ){.   
21970 20 20 20 20 20 61 73 73 65 72 74 28 21 70 43 75       assert(!pCu
21980 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
21990 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65  x] || pCur->aOve
219a0 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78  rflow[iIdx]==nex
219b0 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  tPage);.        
219c0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
219d0 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65  iIdx] = nextPage
219e0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
219f0 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66   if( offset>=ovf
21a00 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
21a10 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61   /* The only rea
21a20 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73  son to read this
21a30 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61   page is to obta
21a40 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  in the page.    
21a50 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f      ** number fo
21a60 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  r the next page 
21a70 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
21a80 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a  chain. The page.
21a90 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
21aa0 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
21ab0 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f   So first try to
21ac0 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72   lookup the over
21ad0 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20  flow.        ** 
21ae0 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c  page-list cache,
21af0 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61   if any, then fa
21b00 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67  ll back to the g
21b10 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29  etOverflowPage()
21b20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
21b30 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  tion..        **
21b40 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  .        ** Note
21b50 20 74 68 61 74 20 74 68 65 20 61 4f 76 65 72 66   that the aOverf
21b60 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 75 73 74  low[] array must
21b70 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 62 65   be allocated be
21b80 63 61 75 73 65 20 65 4f 70 21 3d 32 0a 20 20 20  cause eOp!=2.   
21b90 20 20 20 20 20 2a 2a 20 68 65 72 65 2e 20 20 49       ** here.  I
21ba0 66 20 65 4f 70 3d 3d 32 2c 20 74 68 65 6e 20 6f  f eOp==2, then o
21bb0 66 66 73 65 74 3d 3d 30 20 61 6e 64 20 74 68 69  ffset==0 and thi
21bc0 73 20 62 72 61 6e 63 68 20 69 73 20 6e 65 76 65  s branch is neve
21bd0 72 20 74 61 6b 65 6e 2e 0a 20 20 20 20 20 20 20  r taken..       
21be0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
21bf0 72 74 28 20 65 4f 70 21 3d 32 20 29 3b 0a 20 20  rt( eOp!=2 );.  
21c00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
21c10 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
21c20 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b  TCF_ValidOvfl );
21c30 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75  .        if( pCu
21c40 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
21c50 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  x+1] ){.        
21c60 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
21c70 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
21c80 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65  x+1];.        }e
21c90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
21ca0 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
21cb0 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67  age(pBt, nextPag
21cc0 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29  e, 0, &nextPage)
21cd0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21ce0 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76      offset -= ov
21cf0 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65  flSize;.      }e
21d00 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
21d10 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69  Need to read thi
21d20 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e  s page properly.
21d30 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d   It contains som
21d40 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  e of the.       
21d50 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74   ** range of dat
21d60 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  a that is being 
21d70 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72  read (eOp==0) or
21d80 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30   written (eOp!=0
21d90 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69  )..        */.#i
21da0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
21db0 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
21dc0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21dd0 5f 66 69 6c 65 20 2a 66 64 3b 0a 23 65 6e 64 69  _file *fd;.#endi
21de0 66 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20  f.        int a 
21df0 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69  = amt;.        i
21e00 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20  f( a + offset > 
21e10 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
21e20 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69        a = ovflSi
21e30 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  ze - offset;.   
21e40 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53       }..#ifdef S
21e50 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
21e60 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20  RFLOW_READ.     
21e70 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65     /* If all the
21e80 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
21e90 72 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  rue:.        **.
21ea0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20          **   1) 
21eb0 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f  this is a read o
21ec0 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20  peration, and . 
21ed0 20 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64         **   2) d
21ee0 61 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20  ata is required 
21ef0 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f  from the start o
21f00 66 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20  f this overflow 
21f10 70 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20  page, and.      
21f20 20 20 2a 2a 20 20 20 33 29 20 74 68 65 20 64 61    **   3) the da
21f30 74 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62  tabase is file-b
21f40 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20  acked, and.     
21f50 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65 72 65     **   4) there
21f60 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74   is no open writ
21f70 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e-transaction, a
21f80 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
21f90 35 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  5) the database 
21fa0 69 73 20 6e 6f 74 20 61 20 57 41 4c 20 64 61 74  is not a WAL dat
21fb0 61 62 61 73 65 2c 0a 20 20 20 20 20 20 20 20 2a  abase,.        *
21fc0 2a 20 20 20 36 29 20 61 6c 6c 20 64 61 74 61 20  *   6) all data 
21fd0 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69 73  from the page is
21fe0 20 62 65 69 6e 67 20 72 65 61 64 2e 0a 20 20 20   being read..   
21ff0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
22000 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e  ** then data can
22010 20 62 65 20 72 65 61 64 20 64 69 72 65 63 74 6c   be read directl
22020 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  y from the datab
22030 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68  ase file into th
22040 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  e.        ** out
22050 70 75 74 20 62 75 66 66 65 72 2c 20 62 79 70 61  put buffer, bypa
22060 73 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63  ssing the page-c
22070 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e  ache altogether.
22080 20 54 68 69 73 20 73 70 65 65 64 73 0a 20 20 20   This speeds.   
22090 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69       ** up loadi
220a0 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73  ng large records
220b0 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20   that span many 
220c0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
220d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
220e0 20 20 20 69 66 28 20 28 65 4f 70 26 30 78 30 31     if( (eOp&0x01
220f0 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20  )==0            
22100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29            /* (1)
22120 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
22130 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20 20  offset==0       
22140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22160 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20     /* (2) */.   
22170 20 20 20 20 20 20 26 26 20 28 62 45 6e 64 20 7c        && (bEnd |
22180 7c 20 61 3d 3d 6f 76 66 6c 53 69 7a 65 29 20 20  | a==ovflSize)  
22190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
221b0 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  6) */.         &
221c0 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
221d0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44  tion==TRANS_READ
221e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221f0 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20       /* (4) */. 
22200 20 20 20 20 20 20 20 20 26 26 20 28 66 64 20 3d          && (fd =
22210 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
22220 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 2d  e(pBt->pPager))-
22230 3e 70 4d 65 74 68 6f 64 73 20 20 20 20 20 2f 2a  >pMethods     /*
22240 20 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (3) */.        
22250 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d   && pBt->pPage1-
22260 3e 61 44 61 74 61 5b 31 39 5d 3d 3d 30 78 30 31  >aData[19]==0x01
22270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22280 20 20 20 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f         /* (5) */
22290 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
222a0 20 20 20 20 20 20 75 38 20 61 53 61 76 65 5b 34        u8 aSave[4
222b0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  ];.          u8 
222c0 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75 66 5b  *aWrite = &pBuf[
222d0 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  -4];.          m
222e0 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57 72  emcpy(aSave, aWr
222f0 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ite, 4);.       
22300 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
22310 73 52 65 61 64 28 66 64 2c 20 61 57 72 69 74 65  sRead(fd, aWrite
22320 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42 74 2d  , a+4, (i64)pBt-
22330 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78 74 50  >pageSize*(nextP
22340 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  age-1));.       
22350 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
22360 74 34 62 79 74 65 28 61 57 72 69 74 65 29 3b 0a  t4byte(aWrite);.
22370 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
22380 28 61 57 72 69 74 65 2c 20 61 53 61 76 65 2c 20  (aWrite, aSave, 
22390 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  4);.        }els
223a0 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  e.#endif..      
223b0 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62    {.          Db
223c0 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
223d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
223e0 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
223f0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  e(pBt->pPager, n
22400 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67  extPage, &pDbPag
22410 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
22420 20 28 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20   ((eOp&0x01)==0 
22430 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ? PAGER_GET_READ
22440 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20 20  ONLY : 0).      
22450 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
22460 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22470 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
22480 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c    aPayload = sql
22490 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
224a0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
224b0 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
224c0 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c  = get4byte(aPayl
224d0 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oad);.          
224e0 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
224f0 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
22500 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c  set+4], pBuf, a,
22510 20 28 65 4f 70 26 30 78 30 31 29 2c 20 70 44 62   (eOp&0x01), pDb
22520 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
22530 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
22540 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
22550 20 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65             offse
22560 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
22570 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
22580 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20       amt -= a;. 
22590 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61         pBuf += a
225a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
225b0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
225c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
225d0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
225e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
225f0 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
22600 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
22610 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
22620 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  key associated w
22630 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e  ith cursor pCur.
22640 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d    Exactly.** "am
22650 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65  t" bytes will be
22660 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f   transfered into
22670 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72   pBuf[].  The tr
22680 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73  ansfer.** begins
22690 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
226a0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
226b0 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20  ust ensure that 
226c0 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  pCur is pointing
226d0 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 0a   to a valid row.
226e0 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ** in the table.
226f0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
22700 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
22710 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
22720 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
22730 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
22740 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
22750 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
22760 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
22770 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
22780 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
22790 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
227a0 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70  eKey(BtCursor *p
227b0 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
227c0 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
227d0 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28  pBuf){.  assert(
227e0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
227f0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
22800 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
22810 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
22820 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
22830 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
22840 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
22850 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
22860 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
22870 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
22880 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
22890 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
228a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65  );.  return acce
228b0 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
228c0 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e  offset, amt, (un
228d0 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75  signed char*)pBu
228e0 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f, 0);.}../*.** 
228f0 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
22900 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64   data associated
22910 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75   with cursor pCu
22920 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22  r.  Exactly.** "
22930 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20  amt" bytes will 
22940 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e  be transfered in
22950 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
22960 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
22970 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
22980 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
22990 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
229a0 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
229b0 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
229c0 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
229d0 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
229e0 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
229f0 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
22a00 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
22a10 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
22a20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
22a30 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70  Data(BtCursor *p
22a40 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
22a50 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
22a60 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pBuf){.  int rc;
22a70 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
22a80 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
22a90 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61   if ( pCur->eSta
22aa0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
22ab0 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ID ){.    return
22ac0 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20   SQLITE_ABORT;. 
22ad0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
22ae0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
22af0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
22b00 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
22b10 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
22b20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
22b30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
22b40 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
22b50 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
22b60 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
22b70 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
22b80 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
22b90 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
22ba0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
22bb0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
22bc0 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
22bd0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
22be0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
22bf0 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
22c00 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
22c10 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a  , pBuf, 0);.  }.
22c20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22c30 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
22c40 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61  ointer to payloa
22c50 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  d information fr
22c60 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  om the entry tha
22c70 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63  t the .** pCur c
22c80 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
22c90 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74  g to.  The point
22ca0 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67  er is to the beg
22cb0 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65  inning of.** the
22cc0 20 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62 74   key if index bt
22cd0 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74  rees (pPage->int
22ce0 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20 74  Key==0) and is t
22cf0 68 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74  he data for.** t
22d00 61 62 6c 65 20 62 74 72 65 65 73 20 28 70 50 61  able btrees (pPa
22d10 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20  ge->intKey==1). 
22d20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  The number of by
22d30 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  tes of available
22d40 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73 20  .** key/data is 
22d50 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41  written into *pA
22d60 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30  mt.  If *pAmt==0
22d70 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
22d80 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69 6c  .** returned wil
22d90 6c 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69 64  l not be a valid
22da0 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
22db0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
22dc0 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
22dd0 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66    It is common f
22de0 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65  or the entire ke
22df0 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f  y.** and data to
22e00 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61   fit on the loca
22e10 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74  l page and for t
22e20 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76  here to be no ov
22e30 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e  erflow.** pages.
22e40 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73    When that is s
22e50 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  o, this routine 
22e60 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61  can be used to a
22e70 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79  ccess the.** key
22e80 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75   and data withou
22e90 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e  t making a copy.
22ea0 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64    If the key and
22eb0 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a  /or data spills.
22ec0 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ** onto overflow
22ed0 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63   pages, then acc
22ee0 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73  essPayload() mus
22ef0 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61  t be used to rea
22f00 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b  ssemble.** the k
22f10 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79  ey/data and copy
22f20 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c   it into a preal
22f30 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a  located buffer..
22f40 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
22f50 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  r returned by th
22f60 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73  is routine looks
22f70 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74   directly into t
22f80 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67  he cached.** pag
22f90 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
22fa0 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67  e.  The data mig
22fb0 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76  ht change or mov
22fc0 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a  e the next time.
22fd0 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75  ** any btree rou
22fe0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
22ff0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
23000 76 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c 6f  void *fetchPaylo
23010 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ad(.  BtCursor *
23020 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75  pCur,      /* Cu
23030 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
23040 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66   entry to read f
23050 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41  rom */.  u32 *pA
23060 6d 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  mt            /*
23070 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
23080 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
23090 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ytes here */.){.
230a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d    assert( pCur!=
230b0 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65  0 && pCur->iPage
230c0 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
230d0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
230e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
230f0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
23100 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
23110 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
23120 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
23130 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
23140 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
23150 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
23160 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
23170 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
23180 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
23190 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
231a0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
231b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
231c0 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20  nfo.nSize>0 );. 
231d0 20 2a 70 41 6d 74 20 3d 20 70 43 75 72 2d 3e 69   *pAmt = pCur->i
231e0 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65  nfo.nLocal;.  re
231f0 74 75 72 6e 20 28 76 6f 69 64 2a 29 28 70 43 75  turn (void*)(pCu
23200 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20  r->info.pCell + 
23210 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64  pCur->info.nHead
23220 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46  er);.}.../*.** F
23230 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
23240 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  t cursor pCur is
23250 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72   point to, retur
23260 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74  n as.** many byt
23270 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72  es of the key or
23280 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61   data as are ava
23290 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f  ilable on the lo
232a0 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61  cal.** b-tree pa
232b0 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e  ge.  Write the n
232c0 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
232d0 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70  le bytes into *p
232e0 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  Amt..**.** The p
232f0 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
23300 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54  is ephemeral.  T
23310 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20  he key/data may 
23320 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65  move.** or be de
23330 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e  stroyed on the n
23340 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20  ext call to any 
23350 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a  Btree routine,.*
23360 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c  * including call
23370 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72  s from other thr
23380 65 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65  eads against the
23390 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20   same cache..** 
233a0 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f  Hence, a mutex o
233b0 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  n the BtShared s
233c0 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72  hould be held pr
233d0 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a  ior to calling.*
233e0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
233f0 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  **.** These rout
23400 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20  ines is used to 
23410 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73  get quick access
23420 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61   to key and data
23430 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  .** in the commo
23440 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20  n case where no 
23450 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
23460 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73  re used..*/.cons
23470 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
23480 74 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 43  treeKeyFetch(BtC
23490 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
234a0 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72   *pAmt){.  retur
234b0 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  n fetchPayload(p
234c0 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 63 6f  Cur, pAmt);.}.co
234d0 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
234e0 33 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28  3BtreeDataFetch(
234f0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
23500 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65  u32 *pAmt){.  re
23510 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61  turn fetchPayloa
23520 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d  d(pCur, pAmt);.}
23530 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  .../*.** Move th
23540 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
23550 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   a new child pag
23560 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20  e.  The newPgno 
23570 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a  argument is the.
23580 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ** page number o
23590 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  f the child page
235a0 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a   to move to..**.
235b0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
235c0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
235d0 43 4f 52 52 55 50 54 20 69 66 20 74 68 65 20 70  CORRUPT if the p
235e0 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73  age-header flags
235f0 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65   field of.** the
23600 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
23610 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
23620 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f  he flags field o
23630 66 20 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e  f the parent (i.
23640 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b  e..** if an intk
23650 65 79 20 70 61 67 65 20 61 70 70 65 61 72 73 20  ey page appears 
23660 74 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e 74  to be the parent
23670 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79   of a non-intkey
23680 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63   page, or.** vic
23690 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61  e-versa)..*/.sta
236a0 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68  tic int moveToCh
236b0 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ild(BtCursor *pC
236c0 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29  ur, u32 newPgno)
236d0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
236e0 74 20 69 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  t i = pCur->iPag
236f0 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  e;.  MemPage *pN
23700 65 77 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72  ewPage;.  BtShar
23710 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
23720 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
23730 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
23740 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
23750 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
23760 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
23770 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
23780 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52  ->iPage<BTCURSOR
23790 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20  _MAX_DEPTH );.  
237a0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
237b0 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  age>=0 );.  if( 
237c0 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54  pCur->iPage>=(BT
237d0 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48  CURSOR_MAX_DEPTH
237e0 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  -1) ){.    retur
237f0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
23800 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20  _BKPT;.  }.  rc 
23810 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
23820 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26  (pBt, newPgno, &
23830 70 4e 65 77 50 61 67 65 2c 0a 20 20 20 20 20 20  pNewPage,.      
23840 20 20 20 20 20 20 20 20 20 28 70 43 75 72 2d 3e           (pCur->
23850 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
23860 57 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 3f 20  WriteFlag)==0 ? 
23870 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
23880 4c 59 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 72  LY : 0);.  if( r
23890 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
238a0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b   pCur->apPage[i+
238b0 31 5d 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20  1] = pNewPage;. 
238c0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31   pCur->aiIdx[i+1
238d0 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69  ] = 0;.  pCur->i
238e0 50 61 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d  Page++;..  pCur-
238f0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
23900 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
23910 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
23920 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
23930 4f 76 66 6c 29 3b 0a 20 20 69 66 28 20 70 4e 65  Ovfl);.  if( pNe
23940 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c  wPage->nCell<1 |
23950 7c 20 70 4e 65 77 50 61 67 65 2d 3e 69 6e 74 4b  | pNewPage->intK
23960 65 79 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  ey!=pCur->apPage
23970 5b 69 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  [i]->intKey ){. 
23980 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
23990 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
239a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
239b0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 30 0a  TE_OK;.}..#if 0.
239c0 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65  /*.** Page pPare
239d0 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  nt is an interna
239e0 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65  l (non-leaf) tre
239f0 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e  e page. This fun
23a00 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74  ction .** assert
23a10 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  s that page numb
23a20 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
23a30 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74   left-child if t
23a40 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65  he iIdx'th.** ce
23a50 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65  ll in page pPare
23a60 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20  nt. Or, if iIdx 
23a70 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  is equal to the 
23a80 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a  total number of.
23a90 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  ** cells in pPar
23aa0 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e  ent, that page n
23ab0 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
23ac0 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
23ad0 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a  of.** the page..
23ae0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
23af0 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
23b00 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e  (MemPage *pParen
23b10 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e  t, int iIdx, Pgn
23b20 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 61 73 73  o iChild){.  ass
23b30 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65  ert( iIdx<=pPare
23b40 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69  nt->nCell );.  i
23b50 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74  f( iIdx==pParent
23b60 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61  ->nCell ){.    a
23b70 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28  ssert( get4byte(
23b80 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
23b90 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
23ba0 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29  et+8])==iChild )
23bb0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
23bc0 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28  ssert( get4byte(
23bd0 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74  findCell(pParent
23be0 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64  , iIdx))==iChild
23bf0 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a   );.  }.}.#else.
23c00 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  #  define assert
23c10 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c  ParentIndex(x,y,
23c20 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  z) .#endif../*.*
23c30 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
23c40 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72 65  r up to the pare
23c50 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70  nt page..**.** p
23c60 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20  Cur->idx is set 
23c70 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65  to the cell inde
23c80 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  x that contains 
23c90 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  the pointer.** t
23ca0 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  o the page we ar
23cb0 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20  e coming from.  
23cc0 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67  If we are coming
23cd0 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67   from the.** rig
23ce0 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61  ht-most child pa
23cf0 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64  ge then pCur->id
23d00 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20  x is set to one 
23d10 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65  more than.** the
23d20 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e   largest cell in
23d30 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
23d40 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74  oid moveToParent
23d50 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
23d60 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
23d70 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
23d80 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
23d90 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
23da0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
23db0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
23dc0 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  age>0 );.  asser
23dd0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
23de0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
23df0 0a 20 20 2f 2a 20 55 50 44 41 54 45 3a 20 49 74  .  /* UPDATE: It
23e00 20 69 73 20 61 63 74 75 61 6c 6c 79 20 70 6f 73   is actually pos
23e10 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 63 6f  sible for the co
23e20 6e 64 69 74 69 6f 6e 20 74 65 73 74 65 64 20 62  ndition tested b
23e30 79 20 74 68 65 20 61 73 73 65 72 74 0a 20 20 2a  y the assert.  *
23e40 2a 20 62 65 6c 6f 77 20 74 6f 20 62 65 20 75 6e  * below to be un
23e50 74 72 75 65 20 69 66 20 74 68 65 20 64 61 74 61  true if the data
23e60 62 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72  base file is cor
23e70 72 75 70 74 2e 20 54 68 69 73 20 63 61 6e 20 6f  rupt. This can o
23e80 63 63 75 72 20 69 66 0a 20 20 2a 2a 20 6f 6e 65  ccur if.  ** one
23e90 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 64 69   cursor has modi
23ea0 66 69 65 64 20 70 61 67 65 20 70 50 61 72 65 6e  fied page pParen
23eb0 74 20 77 68 69 6c 65 20 61 20 72 65 66 65 72 65  t while a refere
23ec0 6e 63 65 20 74 6f 20 69 74 20 69 73 20 68 65 6c  nce to it is hel
23ed0 64 20 0a 20 20 2a 2a 20 62 79 20 61 20 73 65 63  d .  ** by a sec
23ee0 6f 6e 64 20 63 75 72 73 6f 72 2e 20 57 68 69 63  ond cursor. Whic
23ef0 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  h can only happe
23f00 6e 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61  n if a single pa
23f10 67 65 20 69 73 20 6c 69 6e 6b 65 64 0a 20 20 2a  ge is linked.  *
23f20 2a 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e  * into more than
23f30 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75   one b-tree stru
23f40 63 74 75 72 65 20 69 6e 20 61 20 63 6f 72 72 75  cture in a corru
23f50 70 74 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f  pt database.  */
23f60 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 50  .#if 0.  assertP
23f70 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20  arentIndex(.    
23f80 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
23f90 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
23fa0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
23fb0 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20  ur->iPage-1], . 
23fc0 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
23fd0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67  pCur->iPage]->pg
23fe0 6e 6f 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20  no.  );.#endif. 
23ff0 20 74 65 73 74 63 61 73 65 28 20 70 43 75 72 2d   testcase( pCur-
24000 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
24010 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70  ge-1] > pCur->ap
24020 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
24030 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20  -1]->nCell );.. 
24040 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
24050 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
24060 69 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d  iPage]);.  pCur-
24070 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72  >iPage--;.  pCur
24080 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
24090 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
240a0 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c  gs &= ~(BTCF_Val
240b0 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
240c0 64 4f 76 66 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dOvfl);.}../*.**
240d0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
240e0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
240f0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74   root page of it
24100 73 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  s b-tree structu
24110 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  re..**.** If the
24120 20 74 61 62 6c 65 20 68 61 73 20 61 20 76 69 72   table has a vir
24130 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20  tual root page, 
24140 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
24150 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e  is moved to poin
24160 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74  t.** to the virt
24170 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e  ual root page in
24180 73 74 65 61 64 20 6f 66 20 74 68 65 20 61 63 74  stead of the act
24190 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41  ual root page. A
241a0 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20   table has a.** 
241b0 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
241c0 65 20 77 68 65 6e 20 74 68 65 20 61 63 74 75 61  e when the actua
241d0 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74  l root page cont
241e0 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e  ains no cells an
241f0 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63  d a .** single c
24200 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20  hild page. This 
24210 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
24220 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 72  with the table r
24230 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 31 2e  ooted at page 1.
24240 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d  .**.** If the b-
24250 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69  tree structure i
24260 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72  s empty, the cur
24270 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 74  sor state is set
24280 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49   to .** CURSOR_I
24290 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73  NVALID. Otherwis
242a0 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  e, the cursor is
242b0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
242c0 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65   the first.** ce
242d0 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68  ll located on th
242e0 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75  e root (or virtu
242f0 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e  al root) page an
24300 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  d the cursor sta
24310 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  te.** is set to 
24320 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a  CURSOR_VALID..**
24330 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63  .** If this func
24340 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63  tion returns suc
24350 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61  cessfully, it ma
24360 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 68 61  y be assumed tha
24370 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65  t the.** page-he
24380 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63  ader flags indic
24390 61 74 65 20 74 68 61 74 20 74 68 65 20 5b 76 69  ate that the [vi
243a0 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65  rtual] root-page
243b0 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65 64   is the expected
243c0 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74   .** kind of b-t
243d0 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69  ree page (i.e. i
243e0 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74  f when opening t
243f0 68 65 20 63 75 72 73 6f 72 20 74 68 65 20 63 61  he cursor the ca
24400 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20  ller did not.** 
24410 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66  specify a KeyInf
24420 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20  o structure the 
24430 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65  flags byte is se
24440 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30  t to 0x05 or 0x0
24450 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67  D,.** indicating
24460 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c   a table b-tree,
24470 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65   or if the calle
24480 72 20 64 69 64 20 73 70 65 63 69 66 79 20 61 20  r did specify a 
24490 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75  KeyInfo .** stru
244a0 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20  cture the flags 
244b0 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30  byte is set to 0
244c0 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64  x02 or 0x0A, ind
244d0 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78  icating an index
244e0 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a  .** b-tree)..*/.
244f0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
24500 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a  oRoot(BtCursor *
24510 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pCur){.  MemPage
24520 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72   *pRoot;.  int r
24530 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
24540 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
24550 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
24560 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
24570 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43  RSOR_INVALID < C
24580 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
24590 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
245a0 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20  URSOR_VALID   < 
245b0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
245c0 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EK );.  assert( 
245d0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e  CURSOR_FAULT   >
245e0 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
245f0 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75  EEK );.  if( pCu
24600 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  r->eState>=CURSO
24610 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b  R_REQUIRESEEK ){
24620 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
24630 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
24640 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ULT ){.      ass
24650 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
24660 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ext!=SQLITE_OK )
24670 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
24680 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20  Cur->skipNext;. 
24690 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
246a0 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
246b0 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  (pCur);.  }..  i
246c0 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  f( pCur->iPage>=
246d0 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  0 ){.    while( 
246e0 70 43 75 72 2d 3e 69 50 61 67 65 20 29 20 72 65  pCur->iPage ) re
246f0 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
24700 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
24710 67 65 2d 2d 5d 29 3b 0a 20 20 7d 65 6c 73 65 20  ge--]);.  }else 
24720 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  if( pCur->pgnoRo
24730 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75  ot==0 ){.    pCu
24740 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
24750 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
24760 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
24770 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
24780 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
24790 67 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ge(pCur->pBtree-
247a0 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  >pBt, pCur->pgno
247b0 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50  Root, &pCur->apP
247c0 61 67 65 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20  age[0],.        
247d0 20 20 20 20 20 20 20 20 20 28 70 43 75 72 2d 3e           (pCur->
247e0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
247f0 57 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 3f 20  WriteFlag)==0 ? 
24800 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
24810 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28  LY : 0);.    if(
24820 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
24830 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
24840 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
24850 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74  VALID;.      ret
24860 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
24870 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
24880 30 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d  0;.  }.  pRoot =
24890 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
248a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  ;.  assert( pRoo
248b0 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70  t->pgno==pCur->p
248c0 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a  gnoRoot );..  /*
248d0 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e   If pCur->pKeyIn
248e0 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  fo is not NULL, 
248f0 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
24900 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73  that opened this
24910 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70   cursor.  ** exp
24920 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74  ected to open it
24930 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74   on an index b-t
24940 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ree. Otherwise, 
24950 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20  if pKeyInfo is. 
24960 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61   ** NULL, the ca
24970 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20 74  ller expects a t
24980 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20  able b-tree. If 
24990 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
249a0 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72  case,.  ** retur
249b0 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  n an SQLITE_CORR
249c0 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a  UPT error. .  **
249d0 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65  .  ** Earlier ve
249e0 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
249f0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
24a00 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f  is test could no
24a10 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74  t fail.  ** if t
24a20 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73  he root page was
24a30 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20   already loaded 
24a40 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
24a50 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69  on was called (i
24a60 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72  .e..  ** if pCur
24a70 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74  ->iPage>=0). But
24a80 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20   this is not so 
24a90 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
24aa0 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20  is corrupted .  
24ab0 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  ** in such a way
24ac0 20 74 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74   that page pRoot
24ad0 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20   is linked into 
24ae0 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20  a second b-tree 
24af0 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20  table .  ** (or 
24b00 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20  the freelist).  
24b10 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  */.  assert( pRo
24b20 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c  ot->intKey==1 ||
24b30 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d   pRoot->intKey==
24b40 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74  0 );.  if( pRoot
24b50 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28  ->isInit==0 || (
24b60 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
24b70 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65  0)!=pRoot->intKe
24b80 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
24b90 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
24ba0 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72  KPT;.  }..  pCur
24bb0 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a  ->aiIdx[0] = 0;.
24bc0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
24bd0 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
24be0 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
24bf0 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56  CF_AtLast|BTCF_V
24c00 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
24c10 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 69 66 28  lidOvfl);..  if(
24c20 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20   pRoot->nCell>0 
24c30 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  ){.    pCur->eSt
24c40 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
24c50 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ID;.  }else if( 
24c60 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a  !pRoot->leaf ){.
24c70 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65      Pgno subpage
24c80 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d  ;.    if( pRoot-
24c90 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72  >pgno!=1 ) retur
24ca0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
24cb0 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61  _BKPT;.    subpa
24cc0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ge = get4byte(&p
24cd0 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f  Root->aData[pRoo
24ce0 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
24cf0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
24d00 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
24d10 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  D;.    rc = move
24d20 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75  ToChild(pCur, su
24d30 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  bpage);.  }else{
24d40 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
24d50 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
24d60 49 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ID;.  }.  return
24d70 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
24d80 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
24d90 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d  wn to the left-m
24da0 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
24db0 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e  eneath the.** en
24dc0 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20  try to which it 
24dd0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
24de0 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nting..**.** The
24df0 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
24e00 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
24e10 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79  the smallest key
24e20 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20   - the first.** 
24e30 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
24e40 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
24e50 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  t moveToLeftmost
24e60 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
24e70 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
24e80 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
24e90 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
24ea0 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
24eb0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
24ec0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
24ed0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
24ee0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
24ef0 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
24f00 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28  =SQLITE_OK && !(
24f10 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
24f20 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
24f30 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ])->leaf ){.    
24f40 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
24f50 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
24f60 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
24f70 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
24f80 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
24f90 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78  age, pCur->aiIdx
24fa0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b  [pCur->iPage]));
24fb0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
24fc0 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
24fd0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
24fe0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
24ff0 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
25000 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  n to the right-m
25010 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
25020 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61  eneath the.** pa
25030 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ge to which it i
25040 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
25050 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68  ting.  Notice th
25060 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20  e difference.** 
25070 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65  between moveToLe
25080 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76  ftmost() and mov
25090 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20  eToRightmost(). 
250a0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
250b0 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c  ).** finds the l
250c0 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  eft-most entry b
250d0 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72  eneath the *entr
250e0 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54  y* whereas moveT
250f0 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20  oRightmost().** 
25100 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d  finds the right-
25110 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
25120 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a  th the *page*..*
25130 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d  *.** The right-m
25140 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65  ost entry is the
25150 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61   one with the la
25160 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  rgest key - the 
25170 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61  last.** key in a
25180 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
25190 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
251a0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74  veToRightmost(Bt
251b0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
251c0 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
251d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
251e0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
251f0 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ge = 0;..  asser
25200 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
25210 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
25220 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
25230 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
25240 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  D );.  while( rc
25250 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
25260 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  (pPage = pCur->a
25270 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
25280 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  e])->leaf ){.   
25290 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
252a0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
252b0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
252c0 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61  8]);.    pCur->a
252d0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
252e0 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ] = pPage->nCell
252f0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
25300 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
25310 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  o);.  }.  if( rc
25320 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25330 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
25340 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50  Cur->iPage] = pP
25350 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
25360 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
25370 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ze = 0;.    pCur
25380 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42  ->curFlags &= ~B
25390 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20  TCF_ValidNKey;. 
253a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
253b0 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
253c0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72  ursor to the fir
253d0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
253e0 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
253f0 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
25400 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
25410 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
25420 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
25430 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
25440 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
25450 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
25460 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
25470 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
25480 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72  eeFirst(BtCursor
25490 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
254a0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  s){.  int rc;.. 
254b0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
254c0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
254d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
254e0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
254f0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
25500 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
25510 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
25520 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
25530 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25540 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
25550 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
25560 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
25570 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
25580 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
25590 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
255a0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
255b0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
255c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
255d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
255e0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
255f0 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  ]->nCell>0 );.  
25600 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
25610 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
25620 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
25630 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
25640 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
25650 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
25660 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
25670 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
25680 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
25690 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
256a0 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
256b0 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
256c0 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
256d0 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
256e0 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
256f0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
25700 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
25710 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43  te3BtreeLast(BtC
25720 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
25730 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
25740 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63  c;. .  assert( c
25750 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
25760 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
25770 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
25780 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
25790 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
257a0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
257b0 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f  ursor already po
257c0 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74  ints to the last
257d0 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20   entry, this is 
257e0 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66  a no-op. */.  if
257f0 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
25800 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20  pCur->eState && 
25810 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
25820 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d  & BTCF_AtLast)!=
25830 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  0 ){.#ifdef SQLI
25840 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
25850 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65  This block serve
25860 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68  s to assert() th
25870 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 72 65  at the cursor re
25880 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20  ally does point 
25890 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c  .    ** to the l
258a0 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
258b0 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20   b-tree. */.    
258c0 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28  int ii;.    for(
258d0 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69  ii=0; ii<pCur->i
258e0 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Page; ii++){.   
258f0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
25900 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72  >aiIdx[ii]==pCur
25910 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43  ->apPage[ii]->nC
25920 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ell );.    }.   
25930 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
25940 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
25950 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ]==pCur->apPage[
25960 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
25970 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73  ell-1 );.    ass
25980 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
25990 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
259a0 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20  leaf );.#endif. 
259b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
259c0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  _OK;.  }..  rc =
259d0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
259e0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
259f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
25a00 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
25a10 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
25a20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
25a30 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
25a40 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
25a50 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
25a60 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
25a70 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
25a80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
25a90 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
25aa0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
25ab0 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
25ac0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
25ad0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
25ae0 70 43 75 72 29 3b 0a 20 20 20 20 20 20 69 66 28  pCur);.      if(
25af0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
25b00 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
25b10 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
25b20 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d  _AtLast;.      }
25b30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
25b40 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
25b50 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20  ~BTCF_AtLast;.  
25b60 20 20 20 20 7d 0a 20 20 20 0a 20 20 20 20 7d 0a      }.   .    }.
25b70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
25b80 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
25b90 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69  cursor so that i
25ba0 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  t points to an e
25bb0 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65  ntry near the ke
25bc0 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  y .** specified 
25bd0 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e  by pIdxKey or in
25be0 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61  tKey.   Return a
25bf0 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a   success code..*
25c00 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20  *.** For INTKEY 
25c10 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b  tables, the intK
25c20 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ey parameter is 
25c30 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a  used.  pIdxKey .
25c40 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e  ** must be NULL.
25c50 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c    For index tabl
25c60 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75  es, pIdxKey is u
25c70 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a  sed and intKey.*
25c80 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a  * is ignored..**
25c90 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20  .** If an exact 
25ca0 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75  match is not fou
25cb0 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  nd, then the cur
25cc0 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a  sor is always.**
25cd0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
25ce0 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68  t a leaf page wh
25cf0 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74  ich would hold t
25d00 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a  he entry if it.*
25d10 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20  * were present. 
25d20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68   The cursor migh
25d30 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e  t point to an en
25d40 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a  try that comes.*
25d50 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65  * before or afte
25d60 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  r the key..**.**
25d70 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77   An integer is w
25d80 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65  ritten into *pRe
25d90 73 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72  s which is the r
25da0 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70  esult of.** comp
25db0 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69  aring the key wi
25dc0 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20  th the entry to 
25dd0 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72  which the cursor
25de0 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67   is .** pointing
25df0 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f  .  The meaning o
25e00 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 77 72  f the integer wr
25e10 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70  itten into.** *p
25e20 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  Res is as follow
25e30 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  s:.**.**     *pR
25e40 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75  es<0      The cu
25e50 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
25e60 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
25e70 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
25e80 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d             is sm
25e90 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65  aller than intKe
25ea0 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20  y/pIdxKey or if 
25eb0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
25ec0 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ty.**           
25ed0 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63         and the c
25ee0 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f  ursor is therefo
25ef0 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f  re left point to
25f00 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   nothing..**.** 
25f10 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20      *pRes==0    
25f20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
25f30 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
25f40 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
25f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f60 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65    exactly matche
25f70 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  s intKey/pIdxKey
25f80 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  ..**.**     *pRe
25f90 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72  s>0      The cur
25fa0 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
25fb0 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
25fc0 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
25fd0 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72            is lar
25fe0 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f  ger than intKey/
25ff0 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69  pIdxKey..**.*/.i
26000 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
26010 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20  ovetoUnpacked(. 
26020 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
26030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
26040 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f   cursor to be mo
26050 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ved */.  Unpacke
26060 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79  dRecord *pIdxKey
26070 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e  , /* Unpacked in
26080 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34  dex key */.  i64
26090 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20   intKey,        
260a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
260b0 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  le key */.  int 
260c0 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20  biasRight,      
260d0 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
260e0 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68   bias the search
260f0 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
26100 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
26110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26120 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
26130 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
26140 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52 65  {.  int rc;.  Re
26150 63 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65 63  cordCompare xRec
26160 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61  ordCompare;..  a
26170 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
26180 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
26190 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
261a0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
261b0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
261c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
261d0 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73  rt( pRes );.  as
261e0 73 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d  sert( (pIdxKey==
261f0 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49  0)==(pCur->pKeyI
26200 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  nfo==0) );..  /*
26210 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
26220 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69  s already positi
26230 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e  oned at the poin
26240 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a  t we are trying.
26250 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c    ** to move to,
26260 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72   then just retur
26270 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
26280 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66  any work */.  if
26290 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
262a0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20  CURSOR_VALID && 
262b0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
262c0 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  & BTCF_ValidNKey
262d0 29 21 3d 30 0a 20 20 20 26 26 20 70 43 75 72 2d  )!=0.   && pCur-
262e0 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
262f0 65 79 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  ey .  ){.    if(
26300 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
26310 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ==intKey ){.    
26320 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
26330 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26340 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
26350 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  f( (pCur->curFla
26360 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74  gs & BTCF_AtLast
26370 29 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 6e  )!=0 && pCur->in
26380 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29  fo.nKey<intKey )
26390 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
263a0 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  -1;.      return
263b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
263c0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 64  }.  }..  if( pId
263d0 78 4b 65 79 20 29 7b 0a 20 20 20 20 78 52 65 63  xKey ){.    xRec
263e0 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c  ordCompare = sql
263f0 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70  ite3VdbeFindComp
26400 61 72 65 28 70 49 64 78 4b 65 79 29 3b 0a 20 20  are(pIdxKey);.  
26410 20 20 70 49 64 78 4b 65 79 2d 3e 69 73 43 6f 72    pIdxKey->isCor
26420 72 75 70 74 20 3d 20 30 3b 0a 20 20 20 20 61 73  rupt = 0;.    as
26430 73 65 72 74 28 20 70 49 64 78 4b 65 79 2d 3e 64  sert( pIdxKey->d
26440 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20  efault_rc==1 .  
26450 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65         || pIdxKe
26460 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30  y->default_rc==0
26470 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49   .         || pI
26480 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72  dxKey->default_r
26490 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d  c==-1.    );.  }
264a0 65 6c 73 65 7b 0a 20 20 20 20 78 52 65 63 6f 72  else{.    xRecor
264b0 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a  dCompare = 0; /*
264c0 20 41 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e   All keys are in
264d0 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20  tegers */.  }.. 
264e0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
264f0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
26500 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
26510 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
26520 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
26530 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
26540 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
26550 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
26560 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
26570 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
26580 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49  Cur->iPage]->isI
26590 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
265a0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
265b0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c  URSOR_INVALID ||
265c0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
265d0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
265e0 6c 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  l>0 );.  if( pCu
265f0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
26600 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
26610 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
26620 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
26630 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
26640 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
26650 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
26660 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 );.    return 
26670 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
26680 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
26690 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
266a0 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20   || pIdxKey );. 
266b0 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e   for(;;){.    in
266c0 74 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 2c  t lwr, upr, idx,
266d0 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c   c;.    Pgno chl
266e0 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  dPg;.    MemPage
266f0 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
26700 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
26710 67 65 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65  ge];.    u8 *pCe
26720 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
26730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26740 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65  Pointer to curre
26750 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65  nt cell in pPage
26760 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67   */..    /* pPag
26770 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65  e->nCell must be
26780 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
26790 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ro. If this is t
267a0 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  he root-page.   
267b0 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77   ** the cursor w
267c0 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49  ould have been I
267d0 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64  NVALID above and
267e0 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f   this for(;;) lo
267f0 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75  op.    ** not ru
26800 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  n. If this is no
26810 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c  t the root-page,
26820 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f   then the moveTo
26830 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a  Child() routine.
26840 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76      ** would hav
26850 65 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74  e already detect
26860 65 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e  ed db corruption
26870 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61  . Similarly, pPa
26880 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  ge must.    ** b
26890 65 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64  e the right kind
268a0 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65   (index or table
268b0 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65  ) of b-tree page
268c0 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20  . Otherwise.    
268d0 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64  ** a moveToChild
268e0 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74  () or moveToRoot
268f0 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61  () call would ha
26900 76 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72  ve detected corr
26910 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20  uption.  */.    
26920 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
26930 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73  Cell>0 );.    as
26940 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
26950 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30  Key==(pIdxKey==0
26960 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30  ) );.    lwr = 0
26970 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67  ;.    upr = pPag
26980 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20  e->nCell-1;.    
26990 61 73 73 65 72 74 28 20 62 69 61 73 52 69 67 68  assert( biasRigh
269a0 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68  t==0 || biasRigh
269b0 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20  t==1 );.    idx 
269c0 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69  = upr>>(1-biasRi
269d0 67 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62  ght); /* idx = b
269e0 69 61 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a  iasRight ? upr :
269f0 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f   (lwr+upr)/2; */
26a00 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
26a10 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
26a20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66  (u16)idx;.    if
26a30 28 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  ( xRecordCompare
26a40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ==0 ){.      for
26a50 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36  (;;){.        i6
26a60 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  4 nCellKey;.    
26a70 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
26a80 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
26a90 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
26aa0 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  trSize;.        
26ab0 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
26ac0 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ta ){.          
26ad0 77 68 69 6c 65 28 20 30 78 38 30 20 3c 3d 20 2a  while( 0x80 <= *
26ae0 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20  (pCell++) ){.   
26af0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65           if( pCe
26b00 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  ll>=pPage->aData
26b10 45 6e 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  End ) return SQL
26b20 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
26b30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
26b40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26b50 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c  getVarint(pCell,
26b60 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79   (u64*)&nCellKey
26b70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
26b80 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29  CellKey<intKey )
26b90 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20  {.          lwr 
26ba0 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20  = idx+1;.       
26bb0 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
26bc0 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b  { c = -1; break;
26bd0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
26be0 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e   if( nCellKey>in
26bf0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
26c00 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20    upr = idx-1;. 
26c10 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72           if( lwr
26c20 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20  >upr ){ c = +1; 
26c30 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20  break; }.       
26c40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26c50 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b    assert( nCellK
26c60 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20  ey==intKey );.  
26c70 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75          pCur->cu
26c80 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56  rFlags |= BTCF_V
26c90 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 20 20  alidNKey;.      
26ca0 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
26cb0 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a  Key = nCellKey;.
26cc0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
26cd0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
26ce0 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  e] = (u16)idx;. 
26cf0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
26d00 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
26d10 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
26d20 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  dx;.            
26d30 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74  goto moveto_next
26d40 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20 20 20 20  _layer;.        
26d50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26d60 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
26d70 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
26d80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
26d90 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
26da0 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
26db0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26dc0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
26dd0 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a  ( lwr+upr>=0 );.
26de0 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c          idx = (l
26df0 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20  wr+upr)>>1;  /* 
26e00 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f  idx = (lwr+upr)/
26e10 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  2; */.      }.  
26e20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
26e30 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20  or(;;){.        
26e40 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 20  int nCell;.     
26e50 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
26e60 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 20  ell(pPage, idx) 
26e70 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
26e80 72 53 69 7a 65 3b 0a 0a 20 20 20 20 20 20 20 20  rSize;..        
26e90 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73  /* The maximum s
26ea0 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69  upported page-si
26eb0 7a 65 20 69 73 20 36 35 35 33 36 20 62 79 74 65  ze is 65536 byte
26ec0 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  s. This means th
26ed0 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  at.        ** th
26ee0 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
26ef0 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65 73   of record bytes
26f00 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e   stored on an in
26f10 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20  dex B-Tree.     
26f20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c 65     ** page is le
26f30 73 73 20 74 68 61 6e 20 31 36 33 38 34 20 62 79  ss than 16384 by
26f40 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20 73  tes and may be s
26f50 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79 74  tored as a 2-byt
26f60 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72  e.        ** var
26f70 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d  int. This inform
26f80 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
26f90 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69   attempt to avoi
26fa0 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20  d parsing .     
26fb0 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
26fc0 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e   cell by checkin
26fd0 67 20 66 6f 72 20 74 68 65 20 63 61 73 65 73 20  g for the cases 
26fe0 77 68 65 72 65 20 74 68 65 20 72 65 63 6f 72 64  where the record
26ff0 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   is .        ** 
27000 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20  stored entirely 
27010 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65  within the b-tre
27020 65 20 70 61 67 65 20 62 79 20 69 6e 73 70 65 63  e page by inspec
27030 74 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a  ting the first .
27040 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74          ** 2 byt
27050 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a  es of the cell..
27060 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
27070 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c     nCell = pCell
27080 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [0];.        if(
27090 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d   nCell<=pPage->m
270a0 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 29  ax1bytePayload )
270b0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
270c0 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20  his branch runs 
270d0 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69  if the record-si
270e0 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ze field of the 
270f0 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20  cell is a.      
27100 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79      ** single by
27110 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
27120 65 20 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e  e record fits en
27130 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61  tirely on the ma
27140 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  in.          ** 
27150 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f  b-tree page.  */
27160 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
27170 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c  ase( pCell+nCell
27180 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  +1==pPage->aData
27190 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20  End );.         
271a0 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70   c = xRecordComp
271b0 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64  are(nCell, (void
271c0 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64  *)&pCell[1], pId
271d0 78 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  xKey, 0);.      
271e0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43    }else if( !(pC
271f0 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a  ell[1] & 0x80) .
27200 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43            && (nC
27210 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78  ell = ((nCell&0x
27220 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b  7f)<<7) + pCell[
27230 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  1])<=pPage->maxL
27240 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a  ocal.        ){.
27250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
27260 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65   record-size fie
27270 6c 64 20 69 73 20 61 20 32 20 62 79 74 65 20 76  ld is a 2 byte v
27280 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65  arint and the re
27290 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20 20  cord .          
272a0 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79  ** fits entirely
272b0 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74   on the main b-t
272c0 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
272d0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
272e0 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d  ( pCell+nCell+2=
272f0 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
27300 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
27310 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  = xRecordCompare
27320 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26  (nCell, (void*)&
27330 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65  pCell[2], pIdxKe
27340 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  y, 0);.        }
27350 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
27360 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c  /* The record fl
27370 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e  ows over onto on
27380 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
27390 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20  ow pages. In.   
273a0 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
273b0 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65  ase the whole ce
273c0 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  ll needs to be p
273d0 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 20  arsed, a buffer 
273e0 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20  allocated.      
273f0 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73      ** and acces
27400 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20  sPayload() used 
27410 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20  to retrieve the 
27420 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a  record into the.
27430 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66            ** buf
27440 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65 52  fer before VdbeR
27450 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63  ecordCompare() c
27460 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f  an be called. */
27470 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20  .          void 
27480 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20  *pCellKey;.     
27490 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20       u8 * const 
274a0 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c  pCellBody = pCel
274b0 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l - pPage->child
274c0 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  PtrSize;.       
274d0 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
274e0 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
274f0 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e  lBody, &pCur->in
27500 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  fo);.          n
27510 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72  Cell = (int)pCur
27520 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20  ->info.nKey;.   
27530 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20         pCellKey 
27540 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
27550 20 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20   nCell );.      
27560 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79      if( pCellKey
27570 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
27580 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
27590 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
275a0 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
275b0 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
275c0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  }.          pCur
275d0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
275e0 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b  age] = (u16)idx;
275f0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
27600 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
27610 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75  ur, 0, nCell, (u
27620 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43  nsigned char*)pC
27630 65 6c 6c 4b 65 79 2c 20 32 29 3b 0a 20 20 20 20  ellKey, 2);.    
27640 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
27650 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
27660 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
27670 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
27680 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
27690 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
276a0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52            c = xR
276b0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
276c0 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49  ll, pCellKey, pI
276d0 64 78 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20  dxKey, 0);.     
276e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
276f0 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  e(pCellKey);.   
27700 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
27710 73 73 65 72 74 28 20 70 49 64 78 4b 65 79 2d 3e  ssert( pIdxKey->
27720 69 73 43 6f 72 72 75 70 74 3d 3d 30 20 7c 7c 20  isCorrupt==0 || 
27730 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  c==0 );.        
27740 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20  if( c<0 ){.     
27750 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31       lwr = idx+1
27760 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
27770 69 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20  if( c>0 ){.     
27780 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31       upr = idx-1
27790 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
277a0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
277b0 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20  t( c==0 );.     
277c0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
277d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
277e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
277f0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
27800 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
27810 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
27820 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e     if( pIdxKey->
27830 69 73 43 6f 72 72 75 70 74 20 29 20 72 63 20 3d  isCorrupt ) rc =
27840 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
27850 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
27860 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
27870 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27880 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 20 62   if( lwr>upr ) b
27890 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73  reak;.        as
278a0 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30  sert( lwr+upr>=0
278b0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20   );.        idx 
278c0 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20  = (lwr+upr)>>1; 
278d0 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75   /* idx = (lwr+u
278e0 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d  pr)/2 */.      }
278f0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
27900 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c  t( lwr==upr+1 ||
27910 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   (pPage->intKey 
27920 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29  && !pPage->leaf)
27930 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
27940 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
27950 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
27960 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 61 73  leaf ){.      as
27970 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
27980 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
27990 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
279a0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
279b0 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  );.      pCur->a
279c0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
279d0 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  ] = (u16)idx;.  
279e0 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20      *pRes = c;. 
279f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
27a00 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  _OK;.      goto 
27a10 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
27a20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74     }.moveto_next
27a30 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69 66 28 20  _layer:.    if( 
27a40 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  lwr>=pPage->nCel
27a50 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  l ){.      chldP
27a60 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  g = get4byte(&pP
27a70 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
27a80 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
27a90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
27aa0 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
27ab0 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
27ac0 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d  ge, lwr));.    }
27ad0 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
27ae0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
27af0 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 72 63  (u16)lwr;.    rc
27b00 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
27b10 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20  Cur, chldPg);.  
27b20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
27b30 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e  ;.  }.moveto_fin
27b40 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ish:.  pCur->inf
27b50 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
27b60 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
27b70 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
27b80 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
27b90 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
27ba0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
27bb0 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72   TRUE if the cur
27bc0 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
27bd0 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
27be0 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  of the table..**
27bf0 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65  .** TRUE will be
27c00 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20   returned after 
27c10 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
27c20 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76  3BtreeNext() mov
27c30 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c  es.** past the l
27c40 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
27c50 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65   table or sqlite
27c60 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76  3BtreePrev() mov
27c70 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66  es past.** the f
27c80 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55  irst entry.  TRU
27c90 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  E is also return
27ca0 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ed if the table 
27cb0 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
27cc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66   sqlite3BtreeEof
27cd0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
27ce0 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61  {.  /* TODO: Wha
27cf0 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  t if the cursor 
27d00 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51  is in CURSOR_REQ
27d10 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c  UIRESEEK but all
27d20 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20   table entries. 
27d30 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65   ** have been de
27d40 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20  leted? This API 
27d50 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61  will need to cha
27d60 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  nge to return an
27d70 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a   error code.  **
27d80 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   as well as the 
27d90 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76  boolean result v
27da0 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  alue..  */.  ret
27db0 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49  urn (CURSOR_VALI
27dc0 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29  D!=pCur->eState)
27dd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
27de0 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ce the cursor to
27df0 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   the next entry 
27e00 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
27e10 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
27e20 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
27e30 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
27e40 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
27e50 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
27e60 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
27e70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
27e80 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
27e90 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
27ea0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
27eb0 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  1..**.** The cal
27ec0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77 69  ling function wi
27ed0 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  ll set *pRes to 
27ee0 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e 69  0 or 1.  The ini
27ef0 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65  tial *pRes value
27f00 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69 66  .** will be 1 if
27f10 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 69 6e   the cursor bein
27f20 67 20 73 74 65 70 70 65 64 20 63 6f 72 72 65 73  g stepped corres
27f30 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20  ponds to an SQL 
27f40 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20  index and.** if 
27f50 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75  this routine cou
27f60 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69  ld have been ski
27f70 70 70 65 64 20 69 66 20 74 68 61 74 20 53 51 4c  pped if that SQL
27f80 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 0a   index had been.
27f90 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  ** a unique inde
27fa0 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68  x.  Otherwise th
27fb0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61  e caller will ha
27fc0 76 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  ve set *pRes to 
27fd0 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73  zero..** Zero is
27fe0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
27ff0 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d 70 6c  . The btree impl
28000 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66 72  ementation is fr
28010 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a  ee to use the.**
28020 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76   initial *pRes v
28030 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20 74  alue as a hint t
28040 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f 72  o improve perfor
28050 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20 63  mance, but the c
28060 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65  urrent.** SQLite
28070 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74   btree implement
28080 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20  ation does not. 
28090 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63  (Note that the c
280a0 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20 69  omdb2 btree.** i
280b0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f  mplementation do
280c0 65 73 20 75 73 65 20 74 68 69 73 20 68 69 6e 74  es use this hint
280d0 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 69  , however.).*/.i
280e0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  nt sqlite3BtreeN
280f0 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ext(BtCursor *pC
28100 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
28110 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
28120 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  idx;.  MemPage *
28130 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
28140 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
28150 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
28160 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
28170 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73  .  assert( *pRes
28180 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20  ==0 || *pRes==1 
28190 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
281a0 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
281b0 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
281c0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
281d0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
281e0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
281f0 20 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61   ){.    invalida
28200 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
28210 70 43 75 72 29 3b 0a 20 20 20 20 72 63 20 3d 20  pCur);.    rc = 
28220 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
28230 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20  ition(pCur);.   
28240 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28250 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  OK ){.      *pRe
28260 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
28270 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
28280 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
28290 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
282a0 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  te ){.      *pRe
282b0 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  s = 1;.      ret
282c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
282d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
282e0 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20  r->skipNext ){. 
282f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
28300 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
28310 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
28320 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
28330 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20  SKIPNEXT );.    
28340 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
28350 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
28360 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73       if( pCur->s
28370 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20  kipNext>0 ){.   
28380 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
28390 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ext = 0;.       
283a0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
283b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
283c0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
283d0 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
283e0 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  xt = 0;.    }.  
283f0 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  }..  pPage = pCu
28400 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
28410 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20  iPage];.  idx = 
28420 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ++pCur->aiIdx[pC
28430 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
28440 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
28450 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  nit );..  /* If 
28460 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
28470 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20 69 74  e is corrupt, it
28480 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   is possible for
28490 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69 64   the value of id
284a0 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e  x .  ** to be in
284b0 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68 69 73  valid here. This
284c0 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20   can only occur 
284d0 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73  if a second curs
284e0 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a  or modifies.  **
284f0 20 74 68 65 20 70 61 67 65 20 77 68 69 6c 65 20   the page while 
28500 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 68  cursor pCur is h
28510 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e  olding a referen
28520 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63 68 20  ce to it. Which 
28530 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61  can.  ** only ha
28540 70 70 65 6e 20 69 66 20 74 68 65 20 64 61 74 61  ppen if the data
28550 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 20  base is corrupt 
28560 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 61 73  in such a way as
28570 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a   to link the.  *
28580 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65  * page into more
28590 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65   than one b-tree
285a0 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20   structure. */. 
285b0 20 74 65 73 74 63 61 73 65 28 20 69 64 78 3e 70   testcase( idx>p
285c0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a  Page->nCell );..
285d0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
285e0 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
285f0 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
28600 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
28610 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20  F_ValidOvfl);.  
28620 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e  if( idx>=pPage->
28630 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28  nCell ){.    if(
28640 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
28650 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
28660 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65  ToChild(pCur, ge
28670 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
28680 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
28690 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20  ffset+8]));.    
286a0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
286b0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
286c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
286d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
286e0 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
286f0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ost(pCur);.     
28700 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
28710 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
28720 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20   }.    do{.     
28730 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
28740 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ==0 ){.        *
28750 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
28760 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
28770 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
28780 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
28790 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
287a0 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
287b0 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
287c0 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
287d0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
287e0 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65  age];.    }while
287f0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
28800 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67  ur->iPage]>=pPag
28810 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
28820 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69  *pRes = 0;.    i
28830 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
28840 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
28850 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
28860 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20  pCur, pRes);.   
28870 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
28880 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
28890 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
288a0 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d  c;.  }.  *pRes =
288b0 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   0;.  if( pPage-
288c0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74  >leaf ){.    ret
288d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
288e0 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f   }.  rc = moveTo
288f0 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
28900 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
28910 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20  ./*.** Step the 
28920 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61  cursor to the ba
28930 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  ck to the previo
28940 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  us entry in the 
28950 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a  database.  If.**
28960 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e   successful then
28970 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49   set *pRes=0.  I
28980 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  f the cursor.** 
28990 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  was already poin
289a0 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73  ting to the firs
289b0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
289c0 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
289d0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
289e0 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
289f0 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a  set *pRes=1..**.
28a00 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  ** The calling f
28a10 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74  unction will set
28a20 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31   *pRes to 0 or 1
28a30 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a  .  The initial *
28a40 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69  pRes value.** wi
28a50 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65 20 63  ll be 1 if the c
28a60 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70  ursor being step
28a70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  ped corresponds 
28a80 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20  to an SQL index 
28a90 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72  and.** if this r
28aa0 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76  outine could hav
28ab0 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69  e been skipped i
28ac0 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78  f that SQL index
28ad0 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75   had been.** a u
28ae0 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74  nique index.  Ot
28af0 68 65 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c  herwise the call
28b00 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74  er will have set
28b10 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a   *pRes to zero..
28b20 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63  ** Zero is the c
28b30 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20  ommon case. The 
28b40 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
28b50 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20  tion is free to 
28b60 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69  use the.** initi
28b70 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61  al *pRes value a
28b80 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72  s a hint to impr
28b90 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c  ove performance,
28ba0 20 62 75 74 20 74 68 65 20 63 75 72 72 65 6e 74   but the current
28bb0 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65  .** SQLite btree
28bc0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
28bd0 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20  does not. (Note 
28be0 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20  that the comdb2 
28bf0 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  btree.** impleme
28c00 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65  ntation does use
28c10 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65   this hint, howe
28c20 76 65 72 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ver.).*/.int sql
28c30 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
28c40 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
28c50 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
28c60 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
28c70 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
28c80 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
28c90 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
28ca0 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30   assert( pRes!=0
28cb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70   );.  assert( *p
28cc0 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d  Res==0 || *pRes=
28cd0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
28ce0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
28cf0 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
28d00 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
28d10 29 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  );.  pCur->curFl
28d20 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74  ags &= ~(BTCF_At
28d30 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f  Last|BTCF_ValidO
28d40 76 66 6c 29 3b 0a 20 20 69 66 28 20 70 43 75 72  vfl);.  if( pCur
28d50 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
28d60 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 69 66  _VALID ){.    if
28d70 28 20 41 4c 57 41 59 53 28 70 43 75 72 2d 3e 65  ( ALWAYS(pCur->e
28d80 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
28d90 51 55 49 52 45 53 45 45 4b 29 20 29 7b 0a 20 20  QUIRESEEK) ){.  
28da0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 52 65      rc = btreeRe
28db0 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
28dc0 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ion(pCur);.     
28dd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28de0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  OK ){.        *p
28df0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
28e00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
28e10 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
28e20 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
28e30 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
28e40 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
28e50 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
28e60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
28e70 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73  .    if( pCur->s
28e80 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  kipNext ){.     
28e90 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
28ea0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
28eb0 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
28ec0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50  ate==CURSOR_SKIP
28ed0 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43  NEXT );.      pC
28ee0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
28ef0 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20  SOR_VALID;.     
28f00 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
28f10 65 78 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ext<0 ){.       
28f20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
28f30 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2a 70 52  = 0;.        *pR
28f40 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
28f50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28f60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28f70 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
28f80 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
28f90 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
28fa0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
28fb0 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e];.  assert( pP
28fc0 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
28fd0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
28fe0 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78  f ){.    int idx
28ff0 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   = pCur->aiIdx[p
29000 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
29010 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
29020 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
29030 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
29040 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28   idx)));.    if(
29050 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2a 70 52   rc ){.      *pR
29060 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  es = 0;.      re
29070 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
29080 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
29090 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
290a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
290b0 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
290c0 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29  Cur->iPage]==0 )
290d0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
290e0 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
290f0 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
29100 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
29110 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52  LID;.        *pR
29120 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  es = 1;.        
29130 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
29140 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29150 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  moveToParent(pCu
29160 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  r);.    }.    pC
29170 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
29180 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75   0;.    pCur->cu
29190 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
291a0 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
291b0 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 20  ValidOvfl);..   
291c0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
291d0 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20  r->iPage]--;.   
291e0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
291f0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
29200 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  e];.    if( pPag
29210 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50  e->intKey && !pP
29220 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
29230 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
29240 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75  treePrevious(pCu
29250 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65  r, pRes);.    }e
29260 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
29270 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
29280 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30  .  }.  *pRes = 0
29290 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
292a0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
292b0 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d   a new page from
292c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
292d0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  le..**.** The ne
292e0 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  w page is marked
292f0 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20   as dirty.  (In 
29300 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c  other words, sql
29310 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
29320 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20  .** has already 
29330 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74  been called on t
29340 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54  he new page.)  T
29350 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20  he new page has 
29360 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66  also.** been ref
29370 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20  erenced and the 
29380 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
29390 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
293a0 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71  or calling.** sq
293b0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
293c0 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67  ) on the new pag
293d0 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e  e when it is don
293e0 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  e..**.** SQLITE_
293f0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
29400 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20  n success.  Any 
29410 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c  other return val
29420 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20  ue indicates.** 
29430 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61  an error.  *ppPa
29440 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72  ge and *pPgno ar
29450 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74  e undefined in t
29460 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65  he event of an e
29470 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20  rror..** Do not 
29480 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50 61  invoke sqlite3Pa
29490 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70  gerUnref() on *p
294a0 70 50 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f  pPage if an erro
294b0 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  r is returned..*
294c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61  *.** If the "nea
294d0 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69  rby" parameter i
294e0 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e  s not 0, then an
294f0 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20   effort is made 
29500 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20  to .** locate a 
29510 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68  page close to th
29520 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e  e page number "n
29530 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61  earby".  This ca
29540 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a  n be used in an.
29550 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65  ** attempt to ke
29560 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73  ep related pages
29570 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f   close to each o
29580 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61  ther in the data
29590 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68  base file,.** wh
295a0 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20  ich in turn can 
295b0 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63  make database ac
295c0 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a  cess faster..**.
295d0 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f 64 65 20  ** If the eMode 
295e0 70 61 72 61 6d 65 74 65 72 20 69 73 20 42 54 41  parameter is BTA
295f0 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 74  LLOC_EXACT and t
29600 68 65 20 6e 65 61 72 62 79 20 70 61 67 65 20 65  he nearby page e
29610 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72  xists.** anywher
29620 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
29630 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67  st, then it is g
29640 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
29650 72 65 74 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a  returned.  If.**
29660 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f   eMode is BTALLO
29670 43 5f 4c 54 20 74 68 65 6e 20 74 68 65 20 70 61  C_LT then the pa
29680 67 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ge returned will
29690 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   be less than or
296a0 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61   equal.** to nea
296b0 72 62 79 20 69 66 20 61 6e 79 20 73 75 63 68 20  rby if any such 
296c0 70 61 67 65 20 65 78 69 73 74 73 2e 20 20 49 66  page exists.  If
296d0 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f   eMode is BTALLO
296e0 43 5f 41 4e 59 20 74 68 65 6e 20 74 68 65 72 65  C_ANY then there
296f0 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73 74 72  .** are no restr
29700 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68  ictions on which
29710 20 70 61 67 65 20 69 73 20 72 65 74 75 72 6e 65   page is returne
29720 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
29730 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
29740 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
29750 70 42 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pBt,         /* 
29760 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d  The btree */.  M
29770 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
29780 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 70        /* Store p
29790 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c  ointer to the al
297a0 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 65 72  located page her
297b0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67  e */.  Pgno *pPg
297c0 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
297d0 20 53 74 6f 72 65 20 74 68 65 20 70 61 67 65 20   Store the page 
297e0 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20  number here */. 
297f0 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20   Pgno nearby,   
29800 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63          /* Searc
29810 68 20 66 6f 72 20 61 20 70 61 67 65 20 6e 65 61  h for a page nea
29820 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20  r this one */.  
29830 75 38 20 65 4d 6f 64 65 20 20 20 20 20 20 20 20  u8 eMode        
29840 20 20 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f         /* BTALLO
29850 43 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43  C_EXACT, BTALLOC
29860 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f  _LT, or BTALLOC_
29870 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50  ANY */.){.  MemP
29880 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69  age *pPage1;.  i
29890 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20  nt rc;.  u32 n; 
298a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
298b0 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
298c0 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20  eelist */.  u32 
298d0 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  k;     /* Number
298e0 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68   of leaves on th
298f0 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66  e trunk of the f
29900 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d  reelist */.  Mem
29910 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30  Page *pTrunk = 0
29920 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72  ;.  MemPage *pPr
29930 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50  evTrunk = 0;.  P
29940 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20  gno mxPage;     
29950 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66  /* Total size of
29960 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29970 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  le */..  assert(
29980 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
29990 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
299a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f  );.  assert( eMo
299b0 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20  de==BTALLOC_ANY 
299c0 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20 26 26 20  || (nearby>0 && 
299d0 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
299e0 3e 61 75 74 6f 56 61 63 75 75 6d 29 29 20 29 3b  >autoVacuum)) );
299f0 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d  .  pPage1 = pBt-
29a00 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67  >pPage1;.  mxPag
29a10 65 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75  e = btreePagecou
29a20 6e 74 28 70 42 74 29 3b 0a 20 20 6e 20 3d 20 67  nt(pBt);.  n = g
29a30 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
29a40 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74  >aData[36]);.  t
29a50 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61  estcase( n==mxPa
29a60 67 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e  ge-1 );.  if( n>
29a70 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72  =mxPage ){.    r
29a80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
29a90 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
29aa0 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
29ab0 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67  /* There are pag
29ac0 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
29ad0 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f  st.  Reuse one o
29ae0 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a  f those pages. *
29af0 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e  /.    Pgno iTrun
29b00 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68  k;.    u8 search
29b10 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20  List = 0; /* If 
29b20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75  the free-list mu
29b30 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66  st be searched f
29b40 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20  or 'nearby' */. 
29b50 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d     .    /* If eM
29b60 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41  ode==BTALLOC_EXA
29b70 43 54 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f  CT and a query o
29b80 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  f the pointer-ma
29b90 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74  p.    ** shows t
29ba0 68 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65  hat the page 'ne
29bb0 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65  arby' is somewhe
29bc0 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  re on the free-l
29bd0 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ist, then.    **
29be0 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74   the entire-list
29bf0 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65   will be searche
29c00 64 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e  d for that page.
29c10 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  .    */.#ifndef 
29c20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
29c30 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65  VACUUM.    if( e
29c40 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58  Mode==BTALLOC_EX
29c50 41 43 54 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ACT ){.      if(
29c60 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20   nearby<=mxPage 
29c70 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54  ){.        u8 eT
29c80 79 70 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ype;.        ass
29c90 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b  ert( nearby>0 );
29ca0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
29cb0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
29cc0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
29cd0 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
29ce0 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20  nearby, &eType, 
29cf0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
29d00 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
29d10 20 20 20 20 20 20 20 20 69 66 28 20 65 54 79 70          if( eTyp
29d20 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
29d30 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  GE ){.          
29d40 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
29d50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29d60 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
29d70 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
29d80 45 20 29 7b 0a 20 20 20 20 20 20 73 65 61 72 63  E ){.      searc
29d90 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d  hList = 1;.    }
29da0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
29db0 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Decrement the fr
29dc0 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79  ee-list count by
29dd0 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74   1. Set iTrunk t
29de0 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
29df0 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20  he.    ** first 
29e00 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
29e10 70 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b  page. iPrevTrunk
29e20 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e   is initially 1.
29e30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
29e40 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
29e50 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
29e60 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
29e70 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
29e80 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
29e90 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d  1->aData[36], n-
29ea0 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  1);..    /* The 
29eb0 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73  code within this
29ec0 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c   loop is run onl
29ed0 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73  y once if the 's
29ee0 65 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61  earchList' varia
29ef0 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f  ble.    ** is no
29f00 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73  t true. Otherwis
29f10 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20  e, it runs once 
29f20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70  for each trunk-p
29f30 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  age on the.    *
29f40 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69  * free-list unti
29f50 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72  l the page 'near
29f60 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28  by' is located (
29f70 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45  eMode==BTALLOC_E
29f80 58 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20  XACT).    ** or 
29f90 75 6e 74 69 6c 20 61 20 70 61 67 65 20 6c 65 73  until a page les
29fa0 73 20 74 68 61 6e 20 27 6e 65 61 72 62 79 27 20  s than 'nearby' 
29fb0 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64  is located (eMod
29fc0 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20  e==BTALLOC_LT). 
29fd0 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20     */.    do {. 
29fe0 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20       pPrevTrunk 
29ff0 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
2a000 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29  if( pPrevTrunk )
2a010 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  {.        iTrunk
2a020 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72   = get4byte(&pPr
2a030 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
2a040 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
2a050 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
2a060 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2a070 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a  e1->aData[32]);.
2a080 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
2a090 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d  stcase( iTrunk==
2a0a0 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
2a0b0 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67  if( iTrunk>mxPag
2a0c0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
2a0d0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2a0e0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c  _BKPT;.      }el
2a0f0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
2a100 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
2a110 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
2a120 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  nk, 0);.      }.
2a130 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2a140 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
2a150 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   0;.        goto
2a160 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2a170 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ge;.      }.    
2a180 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b    assert( pTrunk
2a190 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
2a1a0 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61  ert( pTrunk->aDa
2a1b0 74 61 21 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  ta!=0 );..      
2a1c0 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
2a1d0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
2a1e0 20 2f 2a 20 23 20 6f 66 20 6c 65 61 76 65 73 20   /* # of leaves 
2a1f0 6f 6e 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61  on this trunk pa
2a200 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ge */.      if( 
2a210 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c  k==0 && !searchL
2a220 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ist ){.        /
2a230 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20  * The trunk has 
2a240 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68  no leaves and th
2a250 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65  e list is not be
2a260 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20  ing searched. . 
2a270 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74         ** So ext
2a280 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70  ract the trunk p
2a290 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75  age itself and u
2a2a0 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77  se it as the new
2a2b0 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ly .        ** a
2a2c0 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f  llocated page */
2a2d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2a2e0 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29   pPrevTrunk==0 )
2a2f0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
2a300 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2a310 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
2a320 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2a330 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
2a340 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2a350 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
2a360 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20  .        *pPgno 
2a370 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = iTrunk;.      
2a380 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
2a390 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
2a3a0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2a3b0 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50  4);.        *ppP
2a3c0 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
2a3d0 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
2a3e0 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
2a3f0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
2a400 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
2a410 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
2a420 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  Pgno, n-1));.   
2a430 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28     }else if( k>(
2a440 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u32)(pBt->usable
2a450 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20  Size/4 - 2) ){. 
2a460 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
2a470 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72  of k is out of r
2a480 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20  ange.  Database 
2a490 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  corruption */.  
2a4a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2a4b0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2a4c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2a4d0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2a4e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2a4f0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2a500 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
2a510 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20  earchList .     
2a520 20 20 20 20 20 20 20 26 26 20 28 6e 65 61 72 62         && (nearb
2a530 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54  y==iTrunk || (iT
2a540 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65  runk<nearby && e
2a550 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
2a560 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  )) .      ){.   
2a570 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74       /* The list
2a580 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68   is being search
2a590 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e  ed and this trun
2a5a0 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61  k page is the pa
2a5b0 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ge.        ** to
2a5c0 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72   allocate, regar
2a5d0 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
2a5e0 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a   it has leaves..
2a5f0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2a600 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75     *pPgno = iTru
2a610 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50  nk;.        *ppP
2a620 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
2a630 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
2a640 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
2a650 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2a660 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
2a670 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
2a680 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2a690 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2a6a0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2a6b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2a6c0 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   k==0 ){.       
2a6d0 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
2a6e0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
2a6f0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
2a700 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
2a710 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2a720 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  4);.          }e
2a730 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2a740 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2a750 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75  erWrite(pPrevTru
2a760 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
2a770 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2a780 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2a790 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
2a7a0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2a7b0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  age;.           
2a7c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d   }.            m
2a7d0 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e  emcpy(&pPrevTrun
2a7e0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
2a7f0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2a800 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
2a810 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2a820 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2a830 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65  trunk page is re
2a840 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61  quired by the ca
2a850 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74  ller but it cont
2a860 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20  ains .          
2a870 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ** pointers to f
2a880 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e  ree-list leaves.
2a890 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20   The first leaf 
2a8a0 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a  becomes a trunk.
2a8b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67            ** pag
2a8c0 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
2a8d0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
2a8e0 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
2a8f0 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20  pNewTrunk;.     
2a900 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72       Pgno iNewTr
2a910 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
2a920 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  pTrunk->aData[8]
2a930 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2a940 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67   iNewTrunk>mxPag
2a950 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  e ){ .          
2a960 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2a970 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2a980 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2a990 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2a9a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a9b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2a9c0 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67  iNewTrunk==mxPag
2a9d0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e );.          r
2a9e0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
2a9f0 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c  (pBt, iNewTrunk,
2aa00 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b   &pNewTrunk, 0);
2aa10 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2aa20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2aa30 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2aa40 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2aa50 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
2aa60 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2aa70 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2aa80 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50  (pNewTrunk->pDbP
2aa90 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2aaa0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2aab0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2aac0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
2aad0 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
2aae0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2aaf0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2ab00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ab10 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54     memcpy(&pNewT
2ab20 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2ab30 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
2ab40 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
2ab50 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54   put4byte(&pNewT
2ab60 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
2ab70 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
2ab80 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
2ab90 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54  k->aData[8], &pT
2aba0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c  runk->aData[12],
2abb0 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20   (k-1)*4);.     
2abc0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2abd0 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
2abe0 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65         if( !pPre
2abf0 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
2ac00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
2ac10 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2ac20 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44  eable(pPage1->pD
2ac30 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20  bPage) );.      
2ac40 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
2ac50 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
2ac60 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
2ac70 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2ac80 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2ac90 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2aca0 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
2acb0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2acc0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2acd0 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
2ace0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2acf0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  age;.           
2ad00 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
2ad10 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  ut4byte(&pPrevTr
2ad20 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69  unk->aData[0], i
2ad30 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
2ad40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2ad50 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
2ad60 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
2ad70 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
2ad80 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
2ad90 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
2ada0 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
2adb0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
2adc0 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20  se if( k>0 ){.  
2add0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74        /* Extract
2ade0 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65   a leaf from the
2adf0 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20   trunk */.      
2ae00 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20    u32 closest;. 
2ae10 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67         Pgno iPag
2ae20 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67  e;.        unsig
2ae30 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20  ned char *aData 
2ae40 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b  = pTrunk->aData;
2ae50 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61  .        if( nea
2ae60 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  rby>0 ){.       
2ae70 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20     u32 i;.      
2ae80 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
2ae90 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
2aea0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
2aeb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2aec0 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b  for(i=0; i<k; i+
2aed0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2aee0 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
2aef0 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d  te(&aData[8+i*4]
2af00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2af10 20 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61 72   if( iPage<=near
2af20 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  by ){.          
2af30 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
2af40 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i;.             
2af50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2af60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2af70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2af80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2af90 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20       int dist;. 
2afa0 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20             dist 
2afb0 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33  = sqlite3AbsInt3
2afc0 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74  2(get4byte(&aDat
2afd0 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b  a[8]) - nearby);
2afe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
2aff0 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=1; i<k; i++){
2b000 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2b010 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41  nt d2 = sqlite3A
2b020 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65  bsInt32(get4byte
2b030 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20  (&aData[8+i*4]) 
2b040 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20  - nearby);.     
2b050 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c           if( d2<
2b060 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  dist ){.        
2b070 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
2b080 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = i;.           
2b090 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a       dist = d2;.
2b0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2b0b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2b0c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b0d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2b0e0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
2b0f0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
2b100 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
2b110 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  yte(&aData[8+clo
2b120 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20  sest*4]);.      
2b130 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67    testcase( iPag
2b140 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  e==mxPage );.   
2b150 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d       if( iPage>m
2b160 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
2b170 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2b180 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2b190 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2b1a0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2b1b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b1c0 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65   testcase( iPage
2b1d0 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
2b1e0 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c      if( !searchL
2b1f0 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ist .         ||
2b200 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20   (iPage==nearby 
2b210 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79  || (iPage<nearby
2b220 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c   && eMode==BTALL
2b230 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20  OC_LE)) .       
2b240 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
2b250 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20  t noContent;.   
2b260 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
2b270 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  iPage;.         
2b280 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
2b290 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25  E: %d was leaf %
2b2a0 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b  d of %d on trunk
2b2b0 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20   %d".           
2b2c0 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65        ": %d more
2b2d0 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a   free pages\n",.
2b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2f0 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74   *pPgno, closest
2b300 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70  +1, k, pTrunk->p
2b310 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
2b320 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2b330 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
2b340 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2b350 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
2b360 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63  ) goto end_alloc
2b370 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2b380 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c      if( closest<
2b390 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  k-1 ){.         
2b3a0 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61     memcpy(&aData
2b3b0 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26  [8+closest*4], &
2b3c0 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29  aData[4+k*4], 4)
2b3d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2b3e0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
2b3f0 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  (&aData[4], k-1)
2b400 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f  ;.          noCo
2b410 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65  ntent = !btreeGe
2b420 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c  tHasContent(pBt,
2b430 20 2a 70 50 67 6e 6f 29 20 3f 20 50 41 47 45 52   *pPgno) ? PAGER
2b440 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a  _GET_NOCONTENT :
2b450 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
2b460 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2b470 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
2b480 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b  age, noContent);
2b490 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2b4a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2b4b0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2b4c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2b4d0 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
2b4e0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2b4f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2b500 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2b510 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2b520 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
2b530 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2b540 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2b550 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
2b560 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2b570 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
2b580 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
2b590 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  ;.      pPrevTru
2b5a0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69  nk = 0;.    }whi
2b5b0 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29  le( searchList )
2b5c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
2b5d0 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70  * There are no p
2b5e0 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
2b5f0 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20  list, so append 
2b600 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68  a new page to th
2b610 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
2b620 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a  e image..    **.
2b630 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c      ** Normally,
2b640 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63   new pages alloc
2b650 61 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f  ated by this blo
2b660 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65 73  ck can be reques
2b670 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20  ted from the.   
2b680 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20   ** pager layer 
2b690 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e  with the 'no-con
2b6a0 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20  tent' flag set. 
2b6b0 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 74 68  This prevents th
2b6c0 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66  e pager.    ** f
2b6d0 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65  rom trying to re
2b6e0 61 64 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e  ad the pages con
2b6f0 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20  tent from disk. 
2b700 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a  However, if the.
2b710 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74      ** current t
2b720 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
2b730 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f  lready run one o
2b740 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74  r more increment
2b750 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a  al-vacuum.    **
2b760 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65   steps, then the
2b770 20 70 61 67 65 20 77 65 20 61 72 65 20 61 62 6f   page we are abo
2b780 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  ut to allocate m
2b790 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65  ay contain conte
2b7a0 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69  nt.    ** that i
2b7b0 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68  s required in th
2b7c0 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c  e event of a rol
2b7d0 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63  lback. In this c
2b7e0 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e  ase, do.    ** n
2b7f0 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f  ot set the no-co
2b800 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73  ntent flag. This
2b810 20 63 61 75 73 65 73 20 74 68 65 20 70 61 67 65   causes the page
2b820 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f  r to load and jo
2b830 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65  urnal.    ** the
2b840 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f   current page co
2b850 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65  ntent before ove
2b860 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20  rwriting it..   
2b870 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20   **.    ** Note 
2b880 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77  that the pager w
2b890 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ill not actually
2b8a0 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64   attempt to load
2b8b0 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20   or journal .   
2b8c0 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20   ** content for 
2b8d0 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 72 65  any page that re
2b8e0 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61  ally does lie pa
2b8f0 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
2b900 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
2b910 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  * file on disk. 
2b920 53 6f 20 74 68 65 20 65 66 66 65 63 74 73 20 6f  So the effects o
2b930 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20  f disabling the 
2b940 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d  no-content optim
2b950 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68  ization.    ** h
2b960 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64  ere are confined
2b970 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20   to those pages 
2b980 74 68 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e  that lie between
2b990 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
2b9a0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2b9b0 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e  image and the en
2b9c0 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
2b9d0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
2b9e0 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e     int bNoConten
2b9f0 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69  t = (0==IfNotOmi
2ba00 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e  tAV(pBt->bDoTrun
2ba10 63 61 74 65 29 29 20 3f 20 50 41 47 45 52 5f 47  cate)) ? PAGER_G
2ba20 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30  ET_NOCONTENT : 0
2ba30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
2ba40 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
2ba50 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
2ba60 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
2ba70 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2ba80 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20   pBt->nPage++;. 
2ba90 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
2baa0 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e==PENDING_BYTE_
2bab0 50 41 47 45 28 70 42 74 29 20 29 20 70 42 74 2d  PAGE(pBt) ) pBt-
2bac0 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64  >nPage++;..#ifnd
2bad0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2bae0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
2baf0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
2bb00 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41  m && PTRMAP_ISPA
2bb10 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  GE(pBt, pBt->nPa
2bb20 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ge) ){.      /* 
2bb30 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73  If *pPgno refers
2bb40 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61   to a pointer-ma
2bb50 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65  p page, allocate
2bb60 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20   two new pages. 
2bb70 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65       ** at the e
2bb80 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  nd of the file i
2bb90 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54  nstead of one. T
2bba0 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74  he first allocat
2bbb0 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ed page.      **
2bbc0 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70   becomes a new p
2bbd0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
2bbe0 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75   the second is u
2bbf0 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  sed by the calle
2bc00 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  r..      */.    
2bc10 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d    MemPage *pPg =
2bc20 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28   0;.      TRACE(
2bc30 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
2bc40 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20  rom end of file 
2bc50 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67  (pointer-map pag
2bc60 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67  e)\n", pBt->nPag
2bc70 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e));.      asser
2bc80 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50  t( pBt->nPage!=P
2bc90 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2bca0 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72  (pBt) );.      r
2bcb0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
2bcc0 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65  (pBt, pBt->nPage
2bcd0 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74 65  , &pPg, bNoConte
2bce0 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  nt);.      if( r
2bcf0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2bd00 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2bd10 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2bd20 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  Pg->pDbPage);.  
2bd30 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2bd40 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  e(pPg);.      }.
2bd50 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
2bd60 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2bd70 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  pBt->nPage++;.  
2bd80 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61      if( pBt->nPa
2bd90 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge==PENDING_BYTE
2bda0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20 70 42  _PAGE(pBt) ){ pB
2bdb0 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20  t->nPage++; }.  
2bdc0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70    }.#endif.    p
2bdd0 75 74 34 62 79 74 65 28 32 38 20 2b 20 28 75 38  ut4byte(28 + (u8
2bde0 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  *)pBt->pPage1->a
2bdf0 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65  Data, pBt->nPage
2be00 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20  );.    *pPgno = 
2be10 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20  pBt->nPage;..   
2be20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
2be30 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
2be40 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72  GE(pBt) );.    r
2be50 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
2be60 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
2be70 50 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74  Page, bNoContent
2be80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2be90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72  return rc;.    r
2bea0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2beb0 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
2bec0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
2bed0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2bee0 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
2bef0 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
2bf00 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28      }.    TRACE(
2bf10 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
2bf20 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c  rom end of file\
2bf30 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20  n", *pPgno));.  
2bf40 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50  }..  assert( *pP
2bf50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
2bf60 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a  E_PAGE(pBt) );..
2bf70 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2bf80 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  e:.  releasePage
2bf90 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65  (pTrunk);.  rele
2bfa0 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
2bfb0 6e 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  nk);.  if( rc==S
2bfc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2bfd0 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
2bfe0 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70  PageRefcount((*p
2bff0 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
2c000 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  >1 ){.      rele
2c010 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
2c020 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20  ;.      *ppPage 
2c030 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
2c040 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2c050 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
2c060 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e   (*ppPage)->isIn
2c070 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  it = 0;.  }else{
2c080 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30  .    *ppPage = 0
2c090 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2c0a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
2c0b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2c0c0 72 69 74 65 61 62 6c 65 28 28 2a 70 70 50 61 67  riteable((*ppPag
2c0d0 65 29 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  e)->pDbPage) );.
2c0e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2c0f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2c100 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61  ion is used to a
2c110 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74 6f  dd page iPage to
2c120 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c130 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a  le free-list. .*
2c140 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  * It is assumed 
2c150 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
2c160 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70   not already a p
2c170 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d  art of the free-
2c180 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  list..**.** The 
2c190 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
2c1a0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
2c1b0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
2c1c0 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c  tion is optional
2c1d0 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c  ..** If the call
2c1e0 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61  er happens to ha
2c1f0 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ve a pointer to 
2c200 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
2c210 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  ct .** correspon
2c220 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61  ding to page iPa
2c230 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79  ge handy, it may
2c240 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65 20   pass it as the 
2c250 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a  second value. .*
2c260 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  * Otherwise, it 
2c270 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a  may pass NULL..*
2c280 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65  *.** If a pointe
2c290 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f  r to a MemPage o
2c2a0 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64 20  bject is passed 
2c2b0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
2c2c0 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72  gument,.** its r
2c2d0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
2c2e0 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79  s not altered by
2c2f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
2c300 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
2c310 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65 64  eePage2(BtShared
2c320 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a   *pBt, MemPage *
2c330 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69  pMemPage, Pgno i
2c340 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Page){.  MemPage
2c350 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20   *pTrunk = 0;   
2c360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c370 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  Free-list trunk 
2c380 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  page */.  Pgno i
2c390 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20  Trunk = 0;      
2c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c3b0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
2c3c0 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
2c3d0 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61  page */ .  MemPa
2c3e0 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
2c3f0 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f  ->pPage1;      /
2c400 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63  * Local referenc
2c410 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20  e to page 1 */. 
2c420 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
2c430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c440 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69       /* Page bei
2c450 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65  ng freed. May be
2c460 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20   NULL. */.  int 
2c470 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2c480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c490 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
2c4a0 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20  /.  int nFree;  
2c4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c4c0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
2c4d0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
2c4e0 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20  es on free-list 
2c4f0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
2c500 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2c510 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
2c520 20 20 61 73 73 65 72 74 28 20 69 50 61 67 65 3e    assert( iPage>
2c530 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  1 );.  assert( !
2c540 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d  pMemPage || pMem
2c550 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67  Page->pgno==iPag
2c560 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d  e );..  if( pMem
2c570 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67  Page ){.    pPag
2c580 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20  e = pMemPage;.  
2c590 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
2c5a0 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  f(pPage->pDbPage
2c5b0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2c5c0 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
2c5d0 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61  eLookup(pBt, iPa
2c5e0 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ge);.  }..  /* I
2c5f0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ncrement the fre
2c600 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20  e page count on 
2c610 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d  pPage1 */.  rc =
2c620 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2c630 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
2c640 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
2c650 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
2c660 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74  t;.  nFree = get
2c670 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
2c680 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74  Data[36]);.  put
2c690 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
2c6a0 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b  Data[36], nFree+
2c6b0 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e  1);..  if( pBt->
2c6c0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
2c6d0 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
2c6e0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65      /* If the se
2c6f0 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69  cure_delete opti
2c700 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  on is enabled, t
2c710 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79  hen.    ** alway
2c720 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74  s fully overwrit
2c730 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
2c740 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
2c750 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2c760 20 28 21 70 50 61 67 65 20 26 26 20 28 28 72 63   (!pPage && ((rc
2c770 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2c780 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
2c790 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20 20  ge, 0))!=0) ).  
2c7a0 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20     ||           
2c7b0 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50   ((rc = sqlite3P
2c7c0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
2c7d0 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a 20  >pDbPage))!=0). 
2c7e0 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
2c7f0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
2c800 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
2c810 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c  pPage->aData, 0,
2c820 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67   pPage->pBt->pag
2c830 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  eSize);.  }..  /
2c840 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
2c850 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
2c860 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e  vacuum, write an
2c870 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f   entry in the po
2c880 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74  inter-map.  ** t
2c890 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
2c8a0 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65  the page is free
2c8b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41  ..  */.  if( ISA
2c8c0 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
2c8d0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
2c8e0 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52  iPage, PTRMAP_FR
2c8f0 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b  EEPAGE, 0, &rc);
2c900 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
2c910 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
2c920 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d  .  }..  /* Now m
2c930 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61 63  anipulate the ac
2c940 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 72  tual database fr
2c950 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72  ee-list structur
2c960 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  e. There are two
2c970 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74  .  ** possibilit
2c980 69 65 73 2e 20 49 66 20 74 68 65 20 66 72 65 65  ies. If the free
2c990 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e 74  -list is current
2c9a0 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20  ly empty, or if 
2c9b0 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74  the first.  ** t
2c9c0 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
2c9d0 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75   free-list is fu
2c9e0 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61  ll, then this pa
2c9f0 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  ge will become a
2ca00 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c  .  ** new free-l
2ca10 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
2ca20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77 69  Otherwise, it wi
2ca30 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66  ll become a leaf
2ca40 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72   of the.  ** fir
2ca50 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
2ca60 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 65   the current fre
2ca70 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f  e-list. This blo
2ca80 63 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a 20  ck tests if it. 
2ca90 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20   ** is possible 
2caa0 74 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20  to add the page 
2cab0 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69  as a new free-li
2cac0 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20  st leaf..  */.  
2cad0 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a  if( nFree!=0 ){.
2cae0 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20      u32 nLeaf;  
2caf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2cb00 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20   Initial number 
2cb10 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e  of leaf cells on
2cb20 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a   trunk page */..
2cb30 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
2cb40 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
2cb50 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72  Data[32]);.    r
2cb60 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
2cb70 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
2cb80 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69  Trunk, 0);.    i
2cb90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2cba0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   ){.      goto f
2cbb0 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
2cbc0 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20   }..    nLeaf = 
2cbd0 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
2cbe0 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
2cbf0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
2cc00 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20  ableSize>32 );. 
2cc10 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28     if( nLeaf > (
2cc20 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
2cc30 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20  ize/4 - 2 ){.   
2cc40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2cc50 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2cc60 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
2cc70 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
2cc80 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33 32  if( nLeaf < (u32
2cc90 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
2cca0 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20  /4 - 8 ){.      
2ccb0 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  /* In this case 
2ccc0 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e  there is room on
2ccd0 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
2cce0 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70 61  to insert the pa
2ccf0 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  ge.      ** bein
2cd00 67 20 66 72 65 65 64 20 61 73 20 61 20 6e 65 77  g freed as a new
2cd10 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a   leaf..      **.
2cd20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68        ** Note th
2cd30 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  at the trunk pag
2cd40 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
2cd50 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f  full until it co
2cd60 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20  ntains.      ** 
2cd70 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
2cd80 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73   entries, not us
2cd90 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
2cda0 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76  ntries as we hav
2cdb0 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64  e.      ** coded
2cdc0 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20  .  But due to a 
2cdd0 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20  coding error in 
2cde0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
2cdf0 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20  te prior to.    
2ce00 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61    ** 3.6.0, data
2ce10 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c  bases with freel
2ce20 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20  ist trunk pages 
2ce30 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61  holding more tha
2ce40 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  n.      ** usabl
2ce50 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
2ce60 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f  ies will be repo
2ce70 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e  rted as corrupt.
2ce80 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20    In order.     
2ce90 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20   ** to maintain 
2cea0 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
2ceb0 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64  ibility with old
2cec0 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
2ced0 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20  QLite,.      ** 
2cee0 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  we will continue
2cef0 20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65   to restrict the
2cf00 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
2cf10 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65  es to usableSize
2cf20 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20  /4 - 8.      ** 
2cf30 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d  for now.  At som
2cf40 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  e point in the f
2cf50 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72  uture (once ever
2cf60 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65  yone has upgrade
2cf70 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e  d.      ** to 3.
2cf80 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65  6.0 or later) we
2cf90 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72   should consider
2cfa0 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64   fixing the cond
2cfb0 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20  itional above.  
2cfc0 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22      ** to read "
2cfd0 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20  usableSize/4-2" 
2cfe0 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62  instead of "usab
2cff0 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20  leSize/4-8"..   
2d000 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
2d010 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2d020 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
2d030 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
2d040 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2d050 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
2d060 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
2d070 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20  4], nLeaf+1);.  
2d080 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
2d090 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b  pTrunk->aData[8+
2d0a0 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29  nLeaf*4], iPage)
2d0b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
2d0c0 61 67 65 20 26 26 20 28 70 42 74 2d 3e 62 74 73  age && (pBt->bts
2d0d0 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
2d0e0 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b  RE_DELETE)==0 ){
2d0f0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2d100 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
2d110 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2d120 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2d130 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65      rc = btreeSe
2d140 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c  tHasContent(pBt,
2d150 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d   iPage);.      }
2d160 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46  .      TRACE(("F
2d170 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61  REE-PAGE: %d lea
2d180 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20  f on trunk page 
2d190 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e  %d\n",pPage->pgn
2d1a0 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29  o,pTrunk->pgno))
2d1b0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  ;.      goto fre
2d1c0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
2d1d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f  .  }..  /* If co
2d1e0 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74  ntrol flows to t
2d1f0 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
2d200 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69  it was not possi
2d210 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20  ble to add the. 
2d220 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69   ** the page bei
2d230 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65  ng freed as a le
2d240 61 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  af page of the f
2d250 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68  irst trunk in th
2d260 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a  e free-list..  *
2d270 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75  * Possibly becau
2d280 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  se the free-list
2d290 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f   is empty, or po
2d2a0 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74  ssibly because t
2d2b0 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74  he .  ** first t
2d2c0 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65  runk in the free
2d2d0 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45  -list is full. E
2d2e0 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70  ither way, the p
2d2f0 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a  age being freed.
2d300 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65    ** will become
2d310 20 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74   the new first t
2d320 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
2d330 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f   free-list..  */
2d340 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20  .  if( pPage==0 
2d350 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  && SQLITE_OK!=(r
2d360 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
2d370 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50  (pBt, iPage, &pP
2d380 61 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20  age, 0)) ){.    
2d390 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
2d3a0 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  t;.  }.  rc = sq
2d3b0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2d3c0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
2d3d0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2d3e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
2d3f0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
2d400 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50   }.  put4byte(pP
2d410 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75  age->aData, iTru
2d420 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  nk);.  put4byte(
2d430 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d  &pPage->aData[4]
2d440 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65  , 0);.  put4byte
2d450 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2d460 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54  32], iPage);.  T
2d470 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
2d480 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70  : %d new trunk p
2d490 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64  age replacing %d
2d4a0 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  \n", pPage->pgno
2d4b0 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65  , iTrunk));..fre
2d4c0 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28  epage_out:.  if(
2d4d0 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50   pPage ){.    pP
2d4e0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
2d4f0 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61  .  }.  releasePa
2d500 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c  ge(pPage);.  rel
2d510 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
2d520 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2d530 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
2d540 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
2d550 50 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b  Page, int *pRC){
2d560 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53  .  if( (*pRC)==S
2d570 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d580 2a 70 52 43 20 3d 20 66 72 65 65 50 61 67 65 32  *pRC = freePage2
2d590 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61  (pPage->pBt, pPa
2d5a0 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  ge, pPage->pgno)
2d5b0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
2d5c0 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  ree any overflow
2d5d0 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65   pages associate
2d5e0 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  d with the given
2d5f0 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   Cell..*/.static
2d600 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d   int clearCell(M
2d610 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
2d620 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
2d630 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ell){.  BtShared
2d640 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
2d650 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  Bt;.  CellInfo i
2d660 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  nfo;.  Pgno ovfl
2d670 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Pgno;.  int rc;.
2d680 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75    int nOvfl;.  u
2d690 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b  32 ovflPageSize;
2d6a0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2d6b0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2d6c0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
2d6d0 29 20 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73  ) );.  btreePars
2d6e0 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
2d6f0 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
2d700 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
2d710 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  low==0 ){.    re
2d720 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
2d730 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20   /* No overflow 
2d740 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69  pages. Return wi
2d750 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
2d760 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  hing */.  }.  if
2d770 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76  ( pCell+info.iOv
2d780 65 72 66 6c 6f 77 2b 33 20 3e 20 70 50 61 67 65  erflow+3 > pPage
2d790 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d  ->aData+pPage->m
2d7a0 61 73 6b 50 61 67 65 20 29 7b 0a 20 20 20 20 72  askPage ){.    r
2d7b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2d7c0 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 43  RUPT_BKPT;  /* C
2d7d0 65 6c 6c 20 65 78 74 65 6e 64 73 20 70 61 73 74  ell extends past
2d7e0 20 65 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a   end of page */.
2d7f0 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d    }.  ovflPgno =
2d800 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
2d810 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
2d820 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
2d830 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34  ->usableSize > 4
2d840 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69   );.  ovflPageSi
2d850 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
2d860 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66  Size - 4;.  nOvf
2d870 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f  l = (info.nPaylo
2d880 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ad - info.nLocal
2d890 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20   + ovflPageSize 
2d8a0 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a  - 1)/ovflPageSiz
2d8b0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 76 66  e;.  assert( ovf
2d8c0 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66  lPgno==0 || nOvf
2d8d0 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  l>0 );.  while( 
2d8e0 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50  nOvfl-- ){.    P
2d8f0 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20  gno iNext = 0;. 
2d900 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66     MemPage *pOvf
2d910 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f  l = 0;.    if( o
2d920 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66  vflPgno<2 || ovf
2d930 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63  lPgno>btreePagec
2d940 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
2d950 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61     /* 0 is not a
2d960 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62   legal page numb
2d970 65 72 20 61 6e 64 20 70 61 67 65 20 31 20 63 61  er and page 1 ca
2d980 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20  nnot be an .    
2d990 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
2d9a0 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66  ge. Therefore if
2d9b0 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70   ovflPgno<2 or p
2d9c0 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
2d9d0 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  he .      ** fil
2d9e0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  e the database m
2d9f0 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20  ust be corrupt. 
2da00 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
2da10 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2da20 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KPT;.    }.    i
2da30 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( nOvfl ){.    
2da40 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c    rc = getOverfl
2da50 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  owPage(pBt, ovfl
2da60 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69  Pgno, &pOvfl, &i
2da70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Next);.      if(
2da80 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2da90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
2daa0 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76  ( pOvfl || ((pOv
2dab0 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  fl = btreePageLo
2dac0 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50 67  okup(pBt, ovflPg
2dad0 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20  no))!=0) ).     
2dae0 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  && sqlite3PagerP
2daf0 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76 66  ageRefcount(pOvf
2db00 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a 20  l->pDbPage)!=1. 
2db10 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54     ){.      /* T
2db20 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73 6f  here is no reaso
2db30 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68 6f  n any cursor sho
2db40 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74 73  uld have an outs
2db50 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
2db60 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  e .      ** to a
2db70 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
2db80 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63  belonging to a c
2db90 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69 6e  ell that is bein
2dba0 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74 65  g deleted/update
2dbb0 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 69  d..      ** So i
2dbc0 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6d  f there exists m
2dbd0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66  ore than one ref
2dbe0 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 70  erence to this p
2dbf0 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20 20  age, then it .  
2dc00 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20      ** must not 
2dc10 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65  really be an ove
2dc20 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20 74  rflow page and t
2dc30 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
2dc40 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20 20   be corrupt. .  
2dc50 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65 6c      ** It is hel
2dc60 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20 74  pful to detect t
2dc70 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  his before calli
2dc80 6e 67 20 66 72 65 65 50 61 67 65 32 28 29 2c 20  ng freePage2(), 
2dc90 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72 65  as .      ** fre
2dca0 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65 72  ePage2() may zer
2dcb0 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  o the page conte
2dcc0 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d 64 65  nts if secure-de
2dcd0 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20 20  lete mode is.   
2dce0 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49     ** enabled. I
2dcf0 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f 77  f this 'overflow
2dd00 27 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74  ' page happens t
2dd10 6f 20 62 65 20 61 20 70 61 67 65 20 74 68 61 74  o be a page that
2dd20 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61   the.      ** ca
2dd30 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74 69 6e  ller is iteratin
2dd40 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73 69  g through or usi
2dd50 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72  ng in some other
2dd60 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20 20   way, this.     
2dd70 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62 6c   ** can be probl
2dd80 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f  ematic..      */
2dd90 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2dda0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2ddb0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2ddc0 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 32    rc = freePage2
2ddd0 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66  (pBt, pOvfl, ovf
2dde0 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  lPgno);.    }.. 
2ddf0 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a     if( pOvfl ){.
2de00 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
2de10 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70  erUnref(pOvfl->p
2de20 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  DbPage);.    }. 
2de30 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2de40 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50  rn rc;.    ovflP
2de50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d  gno = iNext;.  }
2de60 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2de70 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
2de80 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65  eate the byte se
2de90 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72  quence used to r
2dea0 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20  epresent a cell 
2deb0 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a  on page pPage.**
2dec0 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20   and write that 
2ded0 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e  byte sequence in
2dee0 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65  to pCell[].  Ove
2def0 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a  rflow pages are.
2df00 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
2df10 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65   filled in as ne
2df20 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61  cessary.  The ca
2df30 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a  lling procedure.
2df40 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
2df50 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
2df60 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  e sufficient spa
2df70 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  ce has been allo
2df80 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65  cated.** for pCe
2df90 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ll[]..**.** Note
2dfa0 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73   that pCell does
2dfb0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e   not necessary n
2dfc0 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  eed to point to 
2dfd0 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
2dfe0 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c  .** area.  pCell
2dff0 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
2e000 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73  some temporary s
2e010 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c  torage.  The cel
2e020 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e  l will.** be con
2e030 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73  structed in this
2e040 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20   temporary area 
2e050 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f  then copied into
2e060 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a   pPage->aData.**
2e070 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   later..*/.stati
2e080 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c  c int fillInCell
2e090 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
2e0a0 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
2e0b0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
2e0c0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
2e0d0 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67   cell */.  unsig
2e0e0 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c  ned char *pCell,
2e0f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
2e100 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
2e110 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73  e cell */.  cons
2e120 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36  t void *pKey, i6
2e130 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68  4 nKey,    /* Th
2e140 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  e key */.  const
2e150 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74   void *pData,int
2e160 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65   nData,   /* The
2e170 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   data */.  int n
2e180 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Zero,           
2e190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
2e1a0 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f  ra zero bytes to
2e1b0 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61   append to pData
2e1c0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a   */.  int *pnSiz
2e1d0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
2e1e0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65       /* Write ce
2e1f0 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a  ll size here */.
2e200 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61  ){.  int nPayloa
2e210 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  d;.  const u8 *p
2e220 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c  Src;.  int nSrc,
2e230 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70   n, rc;.  int sp
2e240 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61  aceLeft;.  MemPa
2e250 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
2e260 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c   MemPage *pToRel
2e270 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69  ease = 0;.  unsi
2e280 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f  gned char *pPrio
2e290 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  r;.  unsigned ch
2e2a0 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *pPayload;.  
2e2b0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2e2c0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67  pPage->pBt;.  Pg
2e2d0 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b  no pgnoOvfl = 0;
2e2e0 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a  .  int nHeader;.
2e2f0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
2e300 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2e310 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2e320 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
2e330 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65  ) );..  /* pPage
2e340 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
2e350 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73 69  ily writeable si
2e360 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  nce pCell might 
2e370 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a  be auxiliary.  *
2e380 2a 20 62 75 66 66 65 72 20 73 70 61 63 65 20 74  * buffer space t
2e390 68 61 74 20 69 73 20 73 65 70 61 72 61 74 65 20  hat is separate 
2e3a0 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62  from the pPage b
2e3b0 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20  uffer area */.  
2e3c0 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50  assert( pCell<pP
2e3d0 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43  age->aData || pC
2e3e0 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  ell>=&pPage->aDa
2e3f0 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
2e400 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
2e410 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2e420 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
2e430 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f  pDbPage) );..  /
2e440 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65  * Fill in the he
2e450 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64  ader. */.  nHead
2e460 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 70  er = 0;.  if( !p
2e470 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2e480 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a    nHeader += 4;.
2e490 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d    }.  if( pPage-
2e4a0 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
2e4b0 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
2e4c0 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48  rint32(&pCell[nH
2e4d0 65 61 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a  eader], nData+nZ
2e4e0 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ero);.  }else{. 
2e4f0 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f     nData = nZero
2e500 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61   = 0;.  }.  nHea
2e510 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
2e520 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
2e530 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b  , *(u64*)&nKey);
2e540 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  .  btreeParseCel
2e550 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
2e560 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73  l, &info);.  ass
2e570 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65  ert( info.nHeade
2e580 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20 20  r==nHeader );.  
2e590 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65  assert( info.nKe
2e5a0 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73  y==nKey );.  ass
2e5b0 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d  ert( info.nData=
2e5c0 3d 28 75 33 32 29 28 6e 44 61 74 61 2b 6e 5a 65  =(u32)(nData+nZe
2e5d0 72 6f 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46  ro) );.  .  /* F
2e5e0 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f  ill in the paylo
2e5f0 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64  ad */.  nPayload
2e600 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f   = nData + nZero
2e610 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
2e620 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72  ntKey ){.    pSr
2e630 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e  c = pData;.    n
2e640 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
2e650 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65   nData = 0;.  }e
2e660 6c 73 65 7b 20 0a 20 20 20 20 69 66 28 20 4e 45  lse{ .    if( NE
2e670 56 45 52 28 6e 4b 65 79 3e 30 78 37 66 66 66 66  VER(nKey>0x7ffff
2e680 66 66 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 29 20  fff || pKey==0) 
2e690 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2e6a0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2e6b0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  KPT;.    }.    n
2e6c0 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69 6e 74 29  Payload += (int)
2e6d0 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d  nKey;.    pSrc =
2e6e0 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20   pKey;.    nSrc 
2e6f0 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d  = (int)nKey;.  }
2e700 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66  .  *pnSize = inf
2e710 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63 65  o.nSize;.  space
2e720 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63  Left = info.nLoc
2e730 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d  al;.  pPayload =
2e740 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d   &pCell[nHeader]
2e750 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43  ;.  pPrior = &pC
2e760 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
2e770 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e  ow];..  while( n
2e780 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20  Payload>0 ){.   
2e790 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d   if( spaceLeft==
2e7a0 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
2e7b0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2e7c0 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  UUM.      Pgno p
2e7d0 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f  gnoPtrmap = pgno
2e7e0 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f  Ovfl; /* Overflo
2e7f0 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d  w page pointer-m
2e800 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f  ap entry page */
2e810 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
2e820 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
2e830 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
2e840 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a      pgnoOvfl++;.
2e850 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28          } while(
2e860 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d   .          PTRM
2e870 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70  AP_ISPAGE(pBt, p
2e880 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f  gnoOvfl) || pgno
2e890 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Ovfl==PENDING_BY
2e8a0 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20  TE_PAGE(pBt) .  
2e8b0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
2e8c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63  .#endif.      rc
2e8d0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
2e8e0 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c  Page(pBt, &pOvfl
2e8f0 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e  , &pgnoOvfl, pgn
2e900 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64  oOvfl, 0);.#ifnd
2e910 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2e920 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
2e930 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
2e940 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
2e950 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65  -vacuum, and the
2e960 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65   second or subse
2e970 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f  quent.      ** o
2e980 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
2e990 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c  being allocated,
2e9a0 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   add an entry to
2e9b0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2e9c0 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  .      ** for th
2e9d0 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20  at page now. .  
2e9e0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2e9f0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
2ea00 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
2ea10 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61  ge, then write a
2ea20 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a   partial entry .
2ea30 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20        ** to the 
2ea40 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20  pointer-map. If 
2ea50 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67  we write nothing
2ea60 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72   to this pointer
2ea70 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20  -map slot,.     
2ea80 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74   ** then the opt
2ea90 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77  imistic overflow
2eaa0 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e   chain processin
2eab0 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29  g in clearCell()
2eac0 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69  .      ** may mi
2ead0 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20 75  sinterpret the u
2eae0 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 76 61 6c  ninitialized val
2eaf0 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ues and delete t
2eb00 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e  he.      ** wron
2eb10 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  g pages from the
2eb20 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
2eb30 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
2eb40 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
2eb50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2eb60 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79  {.        u8 eTy
2eb70 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70  pe = (pgnoPtrmap
2eb80 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  ?PTRMAP_OVERFLOW
2eb90 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  2:PTRMAP_OVERFLO
2eba0 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  W1);.        ptr
2ebb0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
2ebc0 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e  Ovfl, eType, pgn
2ebd0 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20  oPtrmap, &rc);. 
2ebe0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
2ebf0 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
2ec00 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20  sePage(pOvfl);. 
2ec10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2ec20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
2ec30 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2ec40 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
2ec50 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20  elease);.       
2ec60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2ec70 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
2ec80 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
2ec90 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72  ot zero than pPr
2eca0 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  ior points into 
2ecb0 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
2ecc0 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
2ecd0 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
2ece0 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
2ecf0 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
2ed00 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
2ed10 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c   pToRelease==0 |
2ed20 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
2ed30 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c  writeable(pToRel
2ed40 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29  ease->pDbPage) )
2ed50 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  ;..      /* If p
2ed60 50 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66  Prior is part of
2ed70 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f   the data area o
2ed80 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61  f pPage, then ma
2ed90 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20  ke sure pPage.  
2eda0 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
2edb0 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20  writeable */.   
2edc0 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f     assert( pPrio
2edd0 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  r<pPage->aData |
2ede0 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65  | pPrior>=&pPage
2edf0 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
2ee00 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
2ee10 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
2ee20 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2ee30 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
2ee40 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ..      put4byte
2ee50 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66  (pPrior, pgnoOvf
2ee60 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  l);.      releas
2ee70 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
2ee80 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65  );.      pToRele
2ee90 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20  ase = pOvfl;.   
2eea0 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66     pPrior = pOvf
2eeb0 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  l->aData;.      
2eec0 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
2eed0 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c   0);.      pPayl
2eee0 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44  oad = &pOvfl->aD
2eef0 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70  ata[4];.      sp
2ef00 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75  aceLeft = pBt->u
2ef10 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
2ef20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61     }.    n = nPa
2ef30 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e  yload;.    if( n
2ef40 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d  >spaceLeft ) n =
2ef50 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20   spaceLeft;..   
2ef60 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
2ef70 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
2ef80 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e  an pPayload poin
2ef90 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
2efa0 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20   area.    ** of 
2efb0 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
2efc0 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
2efd0 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
2efe0 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  able. */.    ass
2eff0 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d  ert( pToRelease=
2f000 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  =0 || sqlite3Pag
2f010 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
2f020 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67  oRelease->pDbPag
2f030 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  e) );..    /* If
2f040 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72   pPayload is par
2f050 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72  t of the data ar
2f060 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  ea of pPage, the
2f070 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67  n make sure pPag
2f080 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c  e.    ** is stil
2f090 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20  l writeable */. 
2f0a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 79 6c     assert( pPayl
2f0b0 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  oad<pPage->aData
2f0c0 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70   || pPayload>=&p
2f0d0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
2f0e0 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
2f0f0 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
2f100 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2f110 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2f120 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53  ) );..    if( nS
2f130 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66  rc>0 ){.      if
2f140 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e  ( n>nSrc ) n = n
2f150 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Src;.      asser
2f160 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20  t( pSrc );.     
2f170 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
2f180 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20  , pSrc, n);.    
2f190 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
2f1a0 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c  set(pPayload, 0,
2f1b0 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e   n);.    }.    n
2f1c0 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20  Payload -= n;.  
2f1d0 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b    pPayload += n;
2f1e0 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a  .    pSrc += n;.
2f1f0 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20      nSrc -= n;. 
2f200 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20     spaceLeft -= 
2f210 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d  n;.    if( nSrc=
2f220 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63  =0 ){.      nSrc
2f230 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20   = nData;.      
2f240 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
2f250 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73    }.  }.  releas
2f260 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
2f270 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
2f280 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2f290 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20  Remove the i-th 
2f2a0 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
2f2b0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65    This routine e
2f2c0 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c  ffects pPage onl
2f2d0 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63  y..** The cell c
2f2e0 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72  ontent is not fr
2f2f0 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  eed or deallocat
2f300 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d  ed.  It is assum
2f310 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
2f320 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20  ell content has 
2f330 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65  been copied some
2f340 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69  place else.  Thi
2f350 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a  s routine just.*
2f360 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65  * removes the re
2f370 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
2f380 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a  ell from pPage..
2f390 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20  **.** "sz" must 
2f3a0 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
2f3b0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65   bytes in the ce
2f3c0 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ll..*/.static vo
2f3d0 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50  id dropCell(MemP
2f3e0 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
2f3f0 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74  idx, int sz, int
2f400 20 2a 70 52 43 29 7b 0a 20 20 75 33 32 20 70 63   *pRC){.  u32 pc
2f410 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  ;         /* Off
2f420 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74  set to cell cont
2f430 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e  ent of cell bein
2f440 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75  g deleted */.  u
2f450 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f  8 *data;       /
2f460 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  * pPage->aData *
2f470 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
2f480 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d      /* Used to m
2f490 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64  ove bytes around
2f4a0 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a   within data[] *
2f4b0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
2f4c0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
2f4d0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
2f4e0 68 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 42  hdr;        /* B
2f4f0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
2f500 68 65 61 64 65 72 2e 20 20 30 20 6d 6f 73 74 20  header.  0 most 
2f510 70 61 67 65 73 2e 20 20 31 30 30 20 70 61 67 65  pages.  100 page
2f520 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52   1 */..  if( *pR
2f530 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  C ) return;..  a
2f540 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26  ssert( idx>=0 &&
2f550 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c   idx<pPage->nCel
2f560 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  l );.  assert( s
2f570 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67  z==cellSize(pPag
2f580 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73  e, idx) );.  ass
2f590 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2f5a0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2f5b0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
2f5c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2f5d0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
2f5e0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
2f5f0 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  );.  data = pPag
2f600 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20  e->aData;.  ptr 
2f610 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49  = &pPage->aCellI
2f620 64 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20  dx[2*idx];.  pc 
2f630 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b  = get2byte(ptr);
2f640 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
2f650 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73  hdrOffset;.  tes
2f660 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62  tcase( pc==get2b
2f670 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
2f680 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ) );.  testcase(
2f690 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70   pc+sz==pPage->p
2f6a0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
2f6b0 3b 0a 20 20 69 66 28 20 70 63 20 3c 20 28 75 33  ;.  if( pc < (u3
2f6c0 32 29 67 65 74 32 62 79 74 65 28 26 64 61 74 61  2)get2byte(&data
2f6d0 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73  [hdr+5]) || pc+s
2f6e0 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  z > pPage->pBt->
2f6f0 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
2f700 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
2f710 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2f720 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
2f730 72 63 20 3d 20 66 72 65 65 53 70 61 63 65 28 70  rc = freeSpace(p
2f740 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20  Page, pc, sz);. 
2f750 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
2f760 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  pRC = rc;.    re
2f770 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 50 61 67  turn;.  }.  pPag
2f780 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 6d 65  e->nCell--;.  me
2f790 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74 72 2b 32  mmove(ptr, ptr+2
2f7a0 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c  , 2*(pPage->nCel
2f7b0 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20 70 75 74  l - idx));.  put
2f7c0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
2f7d0 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
2f7e0 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
2f7f0 65 20 2b 3d 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e += 2;.}../*.**
2f800 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65   Insert a new ce
2f810 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63  ll on pPage at c
2f820 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20  ell index "i".  
2f830 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20  pCell points to 
2f840 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  the.** content o
2f850 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a  f the cell..**.*
2f860 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
2f870 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f  ntent will fit o
2f880 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e  n the page, then
2f890 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20   put it there.  
2f8a0 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  If it.** will no
2f8b0 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65  t fit, then make
2f8c0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
2f8d0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f  ell content into
2f8e0 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65   pTemp if.** pTe
2f8f0 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20  mp is not null. 
2f900 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70   Regardless of p
2f910 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61  Temp, allocate a
2f920 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e   new entry.** in
2f930 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d   pPage->apOvfl[]
2f940 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69   and make it poi
2f950 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  nt to the cell c
2f960 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a  ontent (either.*
2f970 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68  * in pTemp or th
2f980 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c  e original pCell
2f990 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72  ) and also recor
2f9a0 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a  d its index. .**
2f9b0 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   Allocating a ne
2f9c0 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65  w entry in pPage
2f9d0 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65  ->aCell[] implie
2f9e0 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65  s that .** pPage
2f9f0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69  ->nOverflow is i
2fa00 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a  ncremented..**.*
2fa10 2a 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f  * If nSkip is no
2fa20 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20  n-zero, then do 
2fa30 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69 72  not copy the fir
2fa40 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f  st nSkip bytes o
2fa50 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54  f the.** cell. T
2fa60 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f  he caller will o
2fa70 76 65 72 77 72 69 74 65 20 74 68 65 6d 20 61 66  verwrite them af
2fa80 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
2fa90 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a  n returns. If.**
2faa0 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   nSkip is non-ze
2fab0 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d  ro, then pCell m
2fac0 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20  ay not point to 
2fad0 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72  an invalid memor
2fae0 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28  y location .** (
2faf0 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20  but pCell+nSkip 
2fb00 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29  is always valid)
2fb10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2fb20 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d   insertCell(.  M
2fb30 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
2fb40 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68   /* Page into wh
2fb50 69 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69  ich we are copyi
2fb60 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20  ng */.  int i,  
2fb70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
2fb80 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68   cell becomes th
2fb90 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74  e i-th cell of t
2fba0 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  he page */.  u8 
2fbb0 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f  *pCell,        /
2fbc0 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * Content of the
2fbd0 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   new cell */.  i
2fbe0 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20  nt sz,          
2fbf0 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e   /* Bytes of con
2fc00 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f  tent in pCell */
2fc10 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20  .  u8 *pTemp,   
2fc20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f       /* Temp sto
2fc30 72 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70  rage space for p
2fc40 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20  Cell, if needed 
2fc50 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64  */.  Pgno iChild
2fc60 2c 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e  ,      /* If non
2fc70 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66  -zero, replace f
2fc80 69 72 73 74 20 34 20 62 79 74 65 73 20 77 69 74  irst 4 bytes wit
2fc90 68 20 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a  h this value */.
2fca0 20 20 69 6e 74 20 2a 70 52 43 20 20 20 20 20 20    int *pRC      
2fcb0 20 20 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20      /* Read and 
2fcc0 77 72 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64  write return cod
2fcd0 65 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29  e from here */.)
2fce0 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d 20 30 3b  {.  int idx = 0;
2fcf0 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
2fd00 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c  o write new cell
2fd10 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61   content in data
2fd20 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20  [] */.  int j;  
2fd30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
2fd40 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
2fd50 6e 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20  nt end;         
2fd60 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70   /* First byte p
2fd70 61 73 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c  ast the last cel
2fd80 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74  l pointer in dat
2fd90 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73  a[] */.  int ins
2fda0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ;          /* In
2fdb0 64 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68  dex in data[] wh
2fdc0 65 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69  ere new cell poi
2fdd0 6e 74 65 72 20 69 73 20 69 6e 73 65 72 74 65 64  nter is inserted
2fde0 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66   */.  int cellOf
2fdf0 66 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65  fset;   /* Addre
2fe00 73 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  ss of first cell
2fe10 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61   pointer in data
2fe20 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  [] */.  u8 *data
2fe30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
2fe40 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
2fe50 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20  whole page */.  
2fe60 69 6e 74 20 6e 53 6b 69 70 20 3d 20 28 69 43 68  int nSkip = (iCh
2fe70 69 6c 64 20 3f 20 34 20 3a 20 30 29 3b 0a 0a 20  ild ? 4 : 0);.. 
2fe80 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
2fe90 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  rn;..  assert( i
2fea0 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d  >=0 && i<=pPage-
2feb0 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f  >nCell+pPage->nO
2fec0 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73  verflow );.  ass
2fed0 65 72 74 28 20 4d 58 5f 43 45 4c 4c 28 70 50 61  ert( MX_CELL(pPa
2fee0 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 20  ge->pBt)<=10921 
2fef0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2ff00 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45  ge->nCell<=MX_CE
2ff10 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 7c  LL(pPage->pBt) |
2ff20 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
2ff30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2ff40 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61  >nOverflow<=Arra
2ff50 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f  ySize(pPage->apO
2ff60 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  vfl) );.  assert
2ff70 28 20 41 72 72 61 79 53 69 7a 65 28 70 50 61 67  ( ArraySize(pPag
2ff80 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41 72 72 61  e->apOvfl)==Arra
2ff90 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 69 4f  ySize(pPage->aiO
2ffa0 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  vfl) );.  assert
2ffb0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2ffc0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2ffd0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20  >mutex) );.  /* 
2ffe0 54 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20  The cell should 
2fff0 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65  normally be size
30000 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f  d correctly.  Ho
30010 77 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69  wever, when movi
30020 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72  ng a.  ** malfor
30030 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20  med cell from a 
30040 6c 65 61 66 20 70 61 67 65 20 74 6f 20 61 6e 20  leaf page to an 
30050 69 6e 74 65 72 69 6f 72 20 70 61 67 65 2c 20 69  interior page, i
30060 66 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a  f the cell size.
30070 20 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20 62    ** wanted to b
30080 65 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 75  e less than 4 bu
30090 74 20 67 6f 74 20 72 6f 75 6e 64 65 64 20 75 70  t got rounded up
300a0 20 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65 61   to 4 on the lea
300b0 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a  f, then size.  *
300c0 2a 20 6d 69 67 68 74 20 62 65 20 6c 65 73 73 20  * might be less 
300d0 74 68 61 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a  than 8 (leaf-siz
300e0 65 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20  e + pointer) on 
300f0 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64  the interior nod
30100 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74  e.  Hence.  ** t
30110 68 65 20 74 65 72 6d 20 61 66 74 65 72 20 74 68  he term after th
30120 65 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c  e || in the foll
30130 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20  owing assert(). 
30140 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d  */.  assert( sz=
30150 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61  =cellSizePtr(pPa
30160 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73  ge, pCell) || (s
30170 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30  z==8 && iChild>0
30180 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
30190 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73  ->nOverflow || s
301a0 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65  z+2>pPage->nFree
301b0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d   ){.    if( pTem
301c0 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  p ){.      memcp
301d0 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70  y(pTemp+nSkip, p
301e0 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e  Cell+nSkip, sz-n
301f0 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65  Skip);.      pCe
30200 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20  ll = pTemp;.    
30210 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64  }.    if( iChild
30220 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79   ){.      put4by
30230 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64  te(pCell, iChild
30240 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d  );.    }.    j =
30250 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
30260 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  w++;.    assert(
30270 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28   j<(int)(sizeof(
30280 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2f 73  pPage->apOvfl)/s
30290 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f  izeof(pPage->apO
302a0 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20  vfl[0])) );.    
302b0 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d  pPage->apOvfl[j]
302c0 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50   = pCell;.    pP
302d0 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d  age->aiOvfl[j] =
302e0 20 28 75 31 36 29 69 3b 0a 20 20 7d 65 6c 73 65   (u16)i;.  }else
302f0 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
30300 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
30310 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
30320 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
30330 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30340 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
30350 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
30360 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
30370 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
30380 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
30390 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20  ge) );.    data 
303a0 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
303b0 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d      cellOffset =
303c0 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
303d0 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65  et;.    end = ce
303e0 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
303f0 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69  ge->nCell;.    i
30400 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  ns = cellOffset 
30410 2b 20 32 2a 69 3b 0a 20 20 20 20 72 63 20 3d 20  + 2*i;.    rc = 
30420 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50  allocateSpace(pP
30430 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a  age, sz, &idx);.
30440 20 20 20 20 69 66 28 20 72 63 20 29 7b 20 2a 70      if( rc ){ *p
30450 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b  RC = rc; return;
30460 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 6c   }.    /* The al
30470 6c 6f 63 61 74 65 53 70 61 63 65 28 29 20 72 6f  locateSpace() ro
30480 75 74 69 6e 65 20 67 75 61 72 61 6e 74 65 65 73  utine guarantees
30490 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
304a0 77 6f 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20  wo properties.  
304b0 20 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72    ** if it retur
304c0 6e 73 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20  ns success */.  
304d0 20 20 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d    assert( idx >=
304e0 20 65 6e 64 2b 32 20 29 3b 0a 20 20 20 20 61 73   end+2 );.    as
304f0 73 65 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20  sert( idx+sz <= 
30500 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
30510 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
30520 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b     pPage->nCell+
30530 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  +;.    pPage->nF
30540 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32 20 2b  ree -= (u16)(2 +
30550 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79   sz);.    memcpy
30560 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70  (&data[idx+nSkip
30570 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20  ], pCell+nSkip, 
30580 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 69  sz-nSkip);.    i
30590 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
305a0 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74     put4byte(&dat
305b0 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b  a[idx], iChild);
305c0 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 6d 6f  .    }.    memmo
305d0 76 65 28 26 64 61 74 61 5b 69 6e 73 2b 32 5d 2c  ve(&data[ins+2],
305e0 20 26 64 61 74 61 5b 69 6e 73 5d 2c 20 65 6e 64   &data[ins], end
305f0 2d 69 6e 73 29 3b 0a 20 20 20 20 70 75 74 32 62  -ins);.    put2b
30600 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20  yte(&data[ins], 
30610 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62 79  idx);.    put2by
30620 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e  te(&data[pPage->
30630 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50  hdrOffset+3], pP
30640 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66  age->nCell);.#if
30650 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
30660 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
30670 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
30680 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
30690 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
306a0 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f  may contain a po
306b0 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72  inter to an over
306c0 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f  flow page. If so
306d0 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  , write.      **
306e0 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
306f0 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
30700 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
30710 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a  r map..      */.
30720 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f        ptrmapPutO
30730 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
30740 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d  ell, pRC);.    }
30750 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f  .#endif.  }.}../
30760 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73 74 20  *.** Add a list 
30770 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 20 70 61  of cells to a pa
30780 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 73 68  ge.  The page sh
30790 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 6c  ould be initiall
307a0 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20  y empty..** The 
307b0 63 65 6c 6c 73 20 61 72 65 20 67 75 61 72 61 6e  cells are guaran
307c0 74 65 65 64 20 74 6f 20 66 69 74 20 6f 6e 20 74  teed to fit on t
307d0 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
307e0 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62 6c 65  ic void assemble
307f0 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20  Page(.  MemPage 
30800 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54 68 65  *pPage,   /* The
30810 20 70 61 67 65 20 74 6f 20 62 65 20 61 73 73 65   page to be asse
30820 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20  mblied */.  int 
30830 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a  nCell,        /*
30840 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   The number of c
30850 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 74  ells to add to t
30860 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  his page */.  u8
30870 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20   **apCell,      
30880 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f 20 63  /* Pointers to c
30890 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20  ell bodies */.  
308a0 75 31 36 20 2a 61 53 69 7a 65 20 20 20 20 20 20  u16 *aSize      
308b0 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74 68    /* Sizes of th
308c0 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20  e cells */.){.  
308d0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
308e0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
308f0 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  r */.  u8 *pCell
30900 70 74 72 3b 20 20 20 20 20 2f 2a 20 41 64 64 72  ptr;     /* Addr
30910 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c  ess of next cell
30920 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   pointer */.  in
30930 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20  t cellbody;     
30940 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65  /* Address of ne
30950 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a  xt cell body */.
30960 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74    u8 * const dat
30970 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
30980 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
30990 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   Pointer to data
309a0 20 66 6f 72 20 70 50 61 67 65 20 2a 2f 0a 20 20   for pPage */.  
309b0 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
309c0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
309d0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ;           /* O
309e0 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20  ffset of header 
309f0 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f  on pPage */.  co
30a00 6e 73 74 20 69 6e 74 20 6e 55 73 61 62 6c 65 20  nst int nUsable 
30a10 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
30a20 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61  ableSize; /* Usa
30a30 62 6c 65 20 73 69 7a 65 20 6f 66 20 70 61 67 65  ble size of page
30a40 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
30a50 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
30a60 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
30a70 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
30a80 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
30a90 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
30aa0 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26 26 20 6e  t( nCell>=0 && n
30ab0 43 65 6c 6c 3c 3d 28 69 6e 74 29 4d 58 5f 43 45  Cell<=(int)MX_CE
30ac0 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 0a 20  LL(pPage->pBt). 
30ad0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 69             && (i
30ae0 6e 74 29 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  nt)MX_CELL(pPage
30af0 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 29 3b 0a  ->pBt)<=10921);.
30b00 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
30b10 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
30b20 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
30b30 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ) );..  /* Check
30b40 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 68   that the page h
30b50 61 73 20 6a 75 73 74 20 62 65 65 6e 20 7a 65 72  as just been zer
30b60 6f 65 64 20 62 79 20 7a 65 72 6f 50 61 67 65 28  oed by zeroPage(
30b70 29 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  ) */.  assert( p
30b80 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
30b90 3b 0a 20 20 61 73 73 65 72 74 28 20 67 65 74 32  ;.  assert( get2
30ba0 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
30bb0 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55 73 61 62  a[hdr+5])==nUsab
30bc0 6c 65 20 29 3b 0a 0a 20 20 70 43 65 6c 6c 70 74  le );..  pCellpt
30bd0 72 20 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c  r = &pPage->aCel
30be0 6c 49 64 78 5b 6e 43 65 6c 6c 2a 32 5d 3b 0a 20  lIdx[nCell*2];. 
30bf0 20 63 65 6c 6c 62 6f 64 79 20 3d 20 6e 55 73 61   cellbody = nUsa
30c00 62 6c 65 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 65  ble;.  for(i=nCe
30c10 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ll-1; i>=0; i--)
30c20 7b 0a 20 20 20 20 75 31 36 20 73 7a 20 3d 20 61  {.    u16 sz = a
30c30 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 70 43 65  Size[i];.    pCe
30c40 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20  llptr -= 2;.    
30c50 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 73 7a 3b 0a  cellbody -= sz;.
30c60 20 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65      put2byte(pCe
30c70 6c 6c 70 74 72 2c 20 63 65 6c 6c 62 6f 64 79 29  llptr, cellbody)
30c80 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
30c90 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70  ta[cellbody], ap
30ca0 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20  Cell[i], sz);.  
30cb0 7d 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  }.  put2byte(&da
30cc0 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c  ta[hdr+3], nCell
30cd0 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
30ce0 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 65 6c 6c  ata[hdr+5], cell
30cf0 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e  body);.  pPage->
30d00 6e 46 72 65 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a  nFree -= (nCell*
30d10 32 20 2b 20 6e 55 73 61 62 6c 65 20 2d 20 63 65  2 + nUsable - ce
30d20 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65  llbody);.  pPage
30d30 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e  ->nCell = (u16)n
30d40 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Cell;.}../*.** T
30d50 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72  he following par
30d60 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e  ameters determin
30d70 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63  e how many adjac
30d80 65 6e 74 20 70 61 67 65 73 20 67 65 74 20 69 6e  ent pages get in
30d90 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62  volved.** in a b
30da0 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
30db0 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e  on.  NN is the n
30dc0 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f  umber of neighbo
30dd0 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  rs on either sid
30de0 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  e.** of the page
30df0 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74   that participat
30e00 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  e in the balanci
30e10 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e  ng operation.  N
30e20 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61  B is the.** tota
30e30 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
30e40 73 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61  s that participa
30e50 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  te, including th
30e60 65 20 74 61 72 67 65 74 20 70 61 67 65 20 61 6e  e target page an
30e70 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72  d.** NN neighbor
30e80 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
30e90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69  ..**.** The mini
30ea0 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20  mum value of NN 
30eb0 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29  is 1 (of course)
30ec0 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e  .  Increasing NN
30ed0 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20   above 1.** (to 
30ee0 32 20 6f 72 20 33 29 20 67 69 76 65 73 20 61 20  2 or 3) gives a 
30ef0 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65  modest improveme
30f00 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64  nt in SELECT and
30f10 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61   DELETE performa
30f20 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e  nce.** in exchan
30f30 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20  ge for a larger 
30f40 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49  degradation in I
30f50 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45  NSERT and UPDATE
30f60 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a   performance..**
30f70 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e   The value of NN
30f80 20 61 70 70 65 61 72 73 20 74 6f 20 67 69 76 65   appears to give
30f90 20 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74   the best result
30fa0 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64  s overall..*/.#d
30fb0 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20  efine NN 1      
30fc0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
30fd0 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   of neighbors on
30fe0 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
30ff0 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65  pPage */.#define
31000 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20   NB (NN*2+1)    
31010 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73    /* Total pages
31020 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
31030 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69   balance */...#i
31040 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
31050 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f  T_QUICKBALANCE./
31060 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f  *.** This versio
31070 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68  n of balance() h
31080 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f  andles the commo
31090 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77  n special case w
310a0 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e  here.** a new en
310b0 74 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73  try is being ins
310c0 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74  erted on the ext
310d0 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f  reme right-end o
310e0 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69  f the.** tree, i
310f0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  n other words, w
31100 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72  hen the new entr
31110 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  y will become th
31120 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74  e largest.** ent
31130 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a  ry in the tree..
31140 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66  **.** Instead of
31150 20 74 72 79 69 6e 67 20 74 6f 20 62 61 6c 61 6e   trying to balan
31160 63 65 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d  ce the 3 right-m
31170 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20  ost leaf pages, 
31180 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65  just add.** a ne
31190 77 20 70 61 67 65 20 74 6f 20 74 68 65 20 72 69  w page to the ri
311a0 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e  ght-hand side an
311b0 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65  d put the one ne
311c0 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68  w entry in.** th
311d0 61 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c  at page.  This l
311e0 65 61 76 65 73 20 74 68 65 20 72 69 67 68 74 20  eaves the right 
311f0 73 69 64 65 20 6f 66 20 74 68 65 20 74 72 65 65  side of the tree
31200 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62   somewhat.** unb
31210 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64  alanced.  But od
31220 64 73 20 61 72 65 20 74 68 61 74 20 77 65 20 77  ds are that we w
31230 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67  ill be inserting
31240 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20   new entries.** 
31250 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20  at the end soon 
31260 61 66 74 65 72 77 61 72 64 73 20 73 6f 20 74 68  afterwards so th
31270 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70  e nearly empty p
31280 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79  age will quickly
31290 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e  .** fill up.  On
312a0 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20   average..**.** 
312b0 70 50 61 67 65 20 69 73 20 74 68 65 20 6c 65 61  pPage is the lea
312c0 66 20 70 61 67 65 20 77 68 69 63 68 20 69 73 20  f page which is 
312d0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70  the right-most p
312e0 61 67 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e  age in the tree.
312f0 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69  .** pParent is i
31300 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67  ts parent.  pPag
31310 65 20 6d 75 73 74 20 68 61 76 65 20 61 20 73 69  e must have a si
31320 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e  ngle overflow en
31330 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20  try.** which is 
31340 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  also the right-m
31350 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65  ost entry on the
31360 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
31370 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 69   pSpace buffer i
31380 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  s used to store 
31390 61 20 74 65 6d 70 6f 72 61 72 79 20 63 6f 70 79  a temporary copy
313a0 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 0a   of the divider.
313b0 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20 77 69 6c  ** cell that wil
313c0 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e  l be inserted in
313d0 74 6f 20 70 50 61 72 65 6e 74 2e 20 53 75 63 68  to pParent. Such
313e0 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73   a cell consists
313f0 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79 74 65 20   of a 4.** byte 
31400 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 6c 6c  page number foll
31410 6f 77 65 64 20 62 79 20 61 20 76 61 72 69 61 62  owed by a variab
31420 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le length intege
31430 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77  r. In other.** w
31440 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74 20 31 33  ords, at most 13
31450 20 62 79 74 65 73 2e 20 48 65 6e 63 65 20 74 68   bytes. Hence th
31460 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  e pSpace buffer 
31470 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a 20 6c 65  must be at.** le
31480 61 73 74 20 31 33 20 62 79 74 65 73 20 69 6e 20  ast 13 bytes in 
31490 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
314a0 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  int balance_quic
314b0 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65  k(MemPage *pPare
314c0 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  nt, MemPage *pPa
314d0 67 65 2c 20 75 38 20 2a 70 53 70 61 63 65 29 7b  ge, u8 *pSpace){
314e0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 63 6f 6e  .  BtShared *con
314f0 73 74 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  st pBt = pPage->
31500 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d 54 72 65  pBt;    /* B-Tre
31510 65 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e Database */.  
31520 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 20 20  MemPage *pNew;  
31530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31540 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c       /* Newly al
31550 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a  located page */.
31560 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
31570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31580 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
31590 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   Code */.  Pgno 
315a0 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20 20 20 20  pgnoNew;        
315b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
315c0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
315d0 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20 61 73 73  f pNew */..  ass
315e0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
315f0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
31600 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
31610 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
31620 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
31630 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
31640 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
31650 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
31660 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  =1 );..  /* This
31670 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   error condition
31680 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70   is now caught p
31690 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67  rior to reaching
316a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
316b0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  /.  if( pPage->n
316c0 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  Cell==0 ) return
316d0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
316e0 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  BKPT;..  /* Allo
316f0 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e  cate a new page.
31700 20 54 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20   This page will 
31710 62 65 63 6f 6d 65 20 74 68 65 20 72 69 67 68 74  become the right
31720 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a 20 20 2a  -sibling of .  *
31730 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65 20 74 68  * pPage. Make th
31740 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77 72  e parent page wr
31750 69 74 61 62 6c 65 2c 20 73 6f 20 74 68 61 74 20  itable, so that 
31760 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20  the new divider 
31770 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20 62 65  cell.  ** may be
31780 20 69 6e 73 65 72 74 65 64 2e 20 49 66 20 62 6f   inserted. If bo
31790 74 68 20 74 68 65 73 65 20 6f 70 65 72 61 74 69  th these operati
317a0 6f 6e 73 20 61 72 65 20 73 75 63 63 65 73 73 66  ons are successf
317b0 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a  ul, proceed..  *
317c0 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74  /.  rc = allocat
317d0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
317e0 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c  &pNew, &pgnoNew,
317f0 20 30 2c 20 30 29 3b 0a 0a 20 20 69 66 28 20 72   0, 0);..  if( r
31800 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
31810 0a 20 20 20 20 75 38 20 2a 70 4f 75 74 20 3d 20  .    u8 *pOut = 
31820 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20 20 20 20  &pSpace[4];.    
31830 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70 50 61 67  u8 *pCell = pPag
31840 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 3b 0a 20 20  e->apOvfl[0];.  
31850 20 20 75 31 36 20 73 7a 43 65 6c 6c 20 3d 20 63    u16 szCell = c
31860 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
31870 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 75 38  , pCell);.    u8
31880 20 2a 70 53 74 6f 70 3b 0a 0a 20 20 20 20 61 73   *pStop;..    as
31890 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
318a0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 4e  erIswriteable(pN
318b0 65 77 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ew->pDbPage) );.
318c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
318d0 65 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d 28 50 54  e->aData[0]==(PT
318e0 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
318f0 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 20  FDATA|PTF_LEAF) 
31900 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28  );.    zeroPage(
31910 70 4e 65 77 2c 20 50 54 46 5f 49 4e 54 4b 45 59  pNew, PTF_INTKEY
31920 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54  |PTF_LEAFDATA|PT
31930 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20 61 73 73  F_LEAF);.    ass
31940 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20  emblePage(pNew, 
31950 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65  1, &pCell, &szCe
31960 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ll);..    /* If 
31970 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
31980 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
31990 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   update the poin
319a0 74 65 72 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77  ter map.    ** w
319b0 69 74 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ith entries for 
319c0 74 68 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e  the new page, an
319d0 64 20 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72  d any pointer fr
319e0 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63  om the .    ** c
319f0 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ell on the page 
31a00 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
31a10 61 67 65 2e 20 49 66 20 65 69 74 68 65 72 20 6f  age. If either o
31a20 66 20 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 6f  f these.    ** o
31a30 70 65 72 61 74 69 6f 6e 73 20 66 61 69 6c 73 2c  perations fails,
31a40 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
31a50 20 69 73 20 73 65 74 2c 20 62 75 74 20 74 68 65   is set, but the
31a60 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20 2a 2a   contents.    **
31a70 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 70   of the parent p
31a80 61 67 65 20 61 72 65 20 73 74 69 6c 6c 20 6d 61  age are still ma
31a90 6e 69 70 75 6c 61 74 65 64 20 62 79 20 74 68 68  nipulated by thh
31aa0 20 63 6f 64 65 20 62 65 6c 6f 77 2e 0a 20 20 20   code below..   
31ab0 20 2a 2a 20 54 68 61 74 20 69 73 20 4f 6b 2c 20   ** That is Ok, 
31ac0 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  at this point th
31ad0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 69 73  e parent page is
31ae0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a 20   guaranteed to. 
31af0 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20     ** be marked 
31b00 61 73 20 64 69 72 74 79 2e 20 52 65 74 75 72 6e  as dirty. Return
31b10 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ing an error cod
31b20 65 20 77 69 6c 6c 20 63 61 75 73 65 20 61 0a 20  e will cause a. 
31b30 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20     ** rollback, 
31b40 75 6e 64 6f 69 6e 67 20 61 6e 79 20 63 68 61 6e  undoing any chan
31b50 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20  ges made to the 
31b60 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20  parent page..   
31b70 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55   */.    if( ISAU
31b80 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
31b90 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
31ba0 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50   pgnoNew, PTRMAP
31bb0 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d  _BTREE, pParent-
31bc0 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20  >pgno, &rc);.   
31bd0 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 3e 70 4e     if( szCell>pN
31be0 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a  ew->minLocal ){.
31bf0 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
31c00 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c 20 70  tOvflPtr(pNew, p
31c10 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20  Cell, &rc);.    
31c20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
31c30 20 2f 2a 20 43 72 65 61 74 65 20 61 20 64 69 76   /* Create a div
31c40 69 64 65 72 20 63 65 6c 6c 20 74 6f 20 69 6e 73  ider cell to ins
31c50 65 72 74 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  ert into pParent
31c60 2e 20 54 68 65 20 64 69 76 69 64 65 72 20 63 65  . The divider ce
31c70 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73  ll.    ** consis
31c80 74 73 20 6f 66 20 61 20 34 2d 62 79 74 65 20 70  ts of a 4-byte p
31c90 61 67 65 20 6e 75 6d 62 65 72 20 28 74 68 65 20  age number (the 
31ca0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70  page number of p
31cb0 50 61 67 65 29 20 61 6e 64 0a 20 20 20 20 2a 2a  Page) and.    **
31cc0 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67   a variable leng
31cd0 74 68 20 6b 65 79 20 76 61 6c 75 65 20 28 77 68  th key value (wh
31ce0 69 63 68 20 6d 75 73 74 20 62 65 20 74 68 65 20  ich must be the 
31cf0 73 61 6d 65 20 76 61 6c 75 65 20 61 73 20 74 68  same value as th
31d00 65 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 73 74  e.    ** largest
31d10 20 6b 65 79 20 6f 6e 20 70 50 61 67 65 29 2e 0a   key on pPage)..
31d20 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f      **.    ** To
31d30 20 66 69 6e 64 20 74 68 65 20 6c 61 72 67 65 73   find the larges
31d40 74 20 6b 65 79 20 76 61 6c 75 65 20 6f 6e 20 70  t key value on p
31d50 50 61 67 65 2c 20 66 69 72 73 74 20 66 69 6e 64  Page, first find
31d60 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
31d70 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20  .    ** cell on 
31d80 70 50 61 67 65 2e 20 54 68 65 20 66 69 72 73 74  pPage. The first
31d90 20 74 77 6f 20 66 69 65 6c 64 73 20 6f 66 20 74   two fields of t
31da0 68 69 73 20 63 65 6c 6c 20 61 72 65 20 74 68 65  his cell are the
31db0 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 2d   .    ** record-
31dc0 6c 65 6e 67 74 68 20 28 61 20 76 61 72 69 61 62  length (a variab
31dd0 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le length intege
31de0 72 20 61 74 20 6d 6f 73 74 20 33 32 2d 62 69 74  r at most 32-bit
31df0 73 20 69 6e 20 73 69 7a 65 29 0a 20 20 20 20 2a  s in size).    *
31e00 2a 20 61 6e 64 20 74 68 65 20 6b 65 79 20 76 61  * and the key va
31e10 6c 75 65 20 28 61 20 76 61 72 69 61 62 6c 65 20  lue (a variable 
31e20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2c 20  length integer, 
31e30 6d 61 79 20 68 61 76 65 20 61 6e 79 20 76 61 6c  may have any val
31e40 75 65 29 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ue)..    ** The 
31e50 66 69 72 73 74 20 6f 66 20 74 68 65 20 77 68 69  first of the whi
31e60 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62 65  le(...) loops be
31e70 6c 6f 77 20 73 6b 69 70 73 20 6f 76 65 72 20 74  low skips over t
31e80 68 65 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68  he record-length
31e90 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 2e 20 54  .    ** field. T
31ea0 68 65 20 73 65 63 6f 6e 64 20 77 68 69 6c 65 28  he second while(
31eb0 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70 69 65 73  ...) loop copies
31ec0 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 66   the key value f
31ed0 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  rom the.    ** c
31ee0 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 69 6e 74  ell on pPage int
31ef0 6f 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  o the pSpace buf
31f00 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  fer..    */.    
31f10 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
31f20 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e  (pPage, pPage->n
31f30 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 70 53 74  Cell-1);.    pSt
31f40 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a  op = &pCell[9];.
31f50 20 20 20 20 77 68 69 6c 65 28 20 28 2a 28 70 43      while( (*(pC
31f60 65 6c 6c 2b 2b 29 26 30 78 38 30 29 20 26 26 20  ell++)&0x80) && 
31f70 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 20  pCell<pStop );. 
31f80 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c     pStop = &pCel
31f90 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  l[9];.    while(
31fa0 20 28 28 2a 28 70 4f 75 74 2b 2b 29 20 3d 20 2a   ((*(pOut++) = *
31fb0 28 70 43 65 6c 6c 2b 2b 29 29 26 30 78 38 30 29  (pCell++))&0x80)
31fc0 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20   && pCell<pStop 
31fd0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72  );..    /* Inser
31fe0 74 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65  t the new divide
31ff0 72 20 63 65 6c 6c 20 69 6e 74 6f 20 70 50 61 72  r cell into pPar
32000 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 73 65  ent. */.    inse
32010 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  rtCell(pParent, 
32020 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 20  pParent->nCell, 
32030 70 53 70 61 63 65 2c 20 28 69 6e 74 29 28 70 4f  pSpace, (int)(pO
32040 75 74 2d 70 53 70 61 63 65 29 2c 0a 20 20 20 20  ut-pSpace),.    
32050 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 50             0, pP
32060 61 67 65 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b  age->pgno, &rc);
32070 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
32080 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69   right-child poi
32090 6e 74 65 72 20 6f 66 20 70 50 61 72 65 6e 74 20  nter of pParent 
320a0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
320b0 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  new page. */.   
320c0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 72 65   put4byte(&pPare
320d0 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
320e0 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  t->hdrOffset+8],
320f0 20 70 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20   pgnoNew);.  .  
32100 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
32110 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
32120 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20  e new page. */. 
32130 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
32140 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  New);.  }..  ret
32150 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
32160 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
32170 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a  QUICKBALANCE */.
32180 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69  .#if 0./*.** Thi
32190 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
321a0 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20 61  not contribute a
321b0 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 6f  nything to the o
321c0 70 65 72 61 74 69 6f 6e 20 6f 66 20 53 51 4c 69  peration of SQLi
321d0 74 65 2e 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d  te..** it is som
321e0 65 74 69 6d 65 73 20 61 63 74 69 76 61 74 65 64  etimes activated
321f0 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 77 68 69   temporarily whi
32200 6c 65 20 64 65 62 75 67 67 69 6e 67 20 63 6f 64  le debugging cod
32210 65 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 0a 2a  e responsible .*
32220 2a 20 66 6f 72 20 73 65 74 74 69 6e 67 20 70 6f  * for setting po
32230 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
32240 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
32250 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65   ptrmapCheckPage
32260 73 28 4d 65 6d 50 61 67 65 20 2a 2a 61 70 50 61  s(MemPage **apPa
32270 67 65 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a  ge, int nPage){.
32280 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f    int i, j;.  fo
32290 72 28 69 3d 30 3b 20 69 3c 6e 50 61 67 65 3b 20  r(i=0; i<nPage; 
322a0 69 2b 2b 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  i++){.    Pgno n
322b0 3b 0a 20 20 20 20 75 38 20 65 3b 0a 20 20 20 20  ;.    u8 e;.    
322c0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
322d0 20 61 70 50 61 67 65 5b 69 5d 3b 0a 20 20 20 20   apPage[i];.    
322e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
322f0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 20 20  pPage->pBt;.    
32300 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
32310 73 49 6e 69 74 20 29 3b 0a 0a 20 20 20 20 66 6f  sInit );..    fo
32320 72 28 6a 3d 30 3b 20 6a 3c 70 50 61 67 65 2d 3e  r(j=0; j<pPage->
32330 6e 43 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nCell; j++){.   
32340 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
32350 3b 0a 20 20 20 20 20 20 75 38 20 2a 7a 3b 0a 20  ;.      u8 *z;. 
32360 20 20 20 20 0a 20 20 20 20 20 20 7a 20 3d 20 66      .      z = f
32370 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6a  indCell(pPage, j
32380 29 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50 61  );.      btreePa
32390 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
323a0 2c 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  , z, &info);.   
323b0 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65     if( info.iOve
323c0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
323d0 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74   Pgno ovfl = get
323e0 34 62 79 74 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f  4byte(&z[info.iO
323f0 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20  verflow]);.     
32400 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74     ptrmapGet(pBt
32410 2c 20 6f 76 66 6c 2c 20 26 65 2c 20 26 6e 29 3b  , ovfl, &e, &n);
32420 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
32430 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20   n==pPage->pgno 
32440 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  && e==PTRMAP_OVE
32450 52 46 4c 4f 57 31 20 29 3b 0a 20 20 20 20 20 20  RFLOW1 );.      
32460 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  }.      if( !pPa
32470 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
32480 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d      Pgno child =
32490 20 67 65 74 34 62 79 74 65 28 7a 29 3b 0a 20 20   get4byte(z);.  
324a0 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28        ptrmapGet(
324b0 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20  pBt, child, &e, 
324c0 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  &n);.        ass
324d0 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70  ert( n==pPage->p
324e0 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50  gno && e==PTRMAP
324f0 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 20 20  _BTREE );.      
32500 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
32510 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
32520 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
32530 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
32540 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
32550 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
32560 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28        ptrmapGet(
32570 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20  pBt, child, &e, 
32580 26 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  &n);.      asser
32590 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  t( n==pPage->pgn
325a0 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42  o && e==PTRMAP_B
325b0 54 52 45 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20  TREE );.    }.  
325c0 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
325d0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
325e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
325f0 73 65 64 20 74 6f 20 63 6f 70 79 20 74 68 65 20  sed to copy the 
32600 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
32610 62 2d 74 72 65 65 20 6e 6f 64 65 20 73 74 6f 72  b-tree node stor
32620 65 64 20 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 70  ed .** on page p
32630 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f  From to page pTo
32640 2e 20 49 66 20 70 61 67 65 20 70 46 72 6f 6d 20  . If page pFrom 
32650 77 61 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 70  was not a leaf p
32660 61 67 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  age, then.** the
32670 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
32680 72 69 65 73 20 66 6f 72 20 65 61 63 68 20 63 68  ries for each ch
32690 69 6c 64 20 70 61 67 65 20 61 72 65 20 75 70 64  ild page are upd
326a0 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  ated so that the
326b0 0a 2a 2a 20 70 61 72 65 6e 74 20 70 61 67 65 20  .** parent page 
326c0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 6f  stored in the po
326d0 69 6e 74 65 72 20 6d 61 70 20 69 73 20 70 61 67  inter map is pag
326e0 65 20 70 54 6f 2e 20 49 66 20 70 46 72 6f 6d 20  e pTo. If pFrom 
326f0 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 79  contained.** any
32700 20 63 65 6c 6c 73 20 77 69 74 68 20 6f 76 65 72   cells with over
32710 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
32720 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 72  rs, then the cor
32730 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 69 6e 74  responding point
32740 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65  er.** map entrie
32750 73 20 61 72 65 20 61 6c 73 6f 20 75 70 64 61 74  s are also updat
32760 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  ed so that the p
32770 61 72 65 6e 74 20 70 61 67 65 20 69 73 20 70 61  arent page is pa
32780 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66  ge pTo..**.** If
32790 20 70 46 72 6f 6d 20 69 73 20 63 75 72 72 65 6e   pFrom is curren
327a0 74 6c 79 20 63 61 72 72 79 69 6e 67 20 61 6e 79  tly carrying any
327b0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20   overflow cells 
327c0 28 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 0a  (entries in the.
327d0 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 70 4f 76 66  ** MemPage.apOvf
327e0 6c 5b 5d 20 61 72 72 61 79 29 2c 20 74 68 65 79  l[] array), they
327f0 20 61 72 65 20 6e 6f 74 20 63 6f 70 69 65 64 20   are not copied 
32800 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42  to pTo. .**.** B
32810 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
32820 20 70 61 67 65 20 70 54 6f 20 69 73 20 72 65 69   page pTo is rei
32830 6e 69 74 69 61 6c 69 7a 65 64 20 75 73 69 6e 67  nitialized using
32840 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
32850 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 65 72 66  ..**.** The perf
32860 6f 72 6d 61 6e 63 65 20 6f 66 20 74 68 69 73 20  ormance of this 
32870 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20  function is not 
32880 63 72 69 74 69 63 61 6c 2e 20 49 74 20 69 73 20  critical. It is 
32890 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 0a 2a 2a  only used by .**
328a0 20 74 68 65 20 62 61 6c 61 6e 63 65 5f 73 68 61   the balance_sha
328b0 6c 6c 6f 77 65 72 28 29 20 61 6e 64 20 62 61 6c  llower() and bal
328c0 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20 70 72  ance_deeper() pr
328d0 6f 63 65 64 75 72 65 73 2c 20 6e 65 69 74 68 65  ocedures, neithe
328e0 72 20 6f 66 0a 2a 2a 20 77 68 69 63 68 20 61 72  r of.** which ar
328f0 65 20 63 61 6c 6c 65 64 20 6f 66 74 65 6e 20 75  e called often u
32900 6e 64 65 72 20 6e 6f 72 6d 61 6c 20 63 69 72 63  nder normal circ
32910 75 6d 73 74 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74  umstances..*/.st
32920 61 74 69 63 20 76 6f 69 64 20 63 6f 70 79 4e 6f  atic void copyNo
32930 64 65 43 6f 6e 74 65 6e 74 28 4d 65 6d 50 61 67  deContent(MemPag
32940 65 20 2a 70 46 72 6f 6d 2c 20 4d 65 6d 50 61 67  e *pFrom, MemPag
32950 65 20 2a 70 54 6f 2c 20 69 6e 74 20 2a 70 52 43  e *pTo, int *pRC
32960 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d  ){.  if( (*pRC)=
32970 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32980 20 20 42 74 53 68 61 72 65 64 20 2a 20 63 6f 6e    BtShared * con
32990 73 74 20 70 42 74 20 3d 20 70 46 72 6f 6d 2d 3e  st pBt = pFrom->
329a0 70 42 74 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f  pBt;.    u8 * co
329b0 6e 73 74 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f  nst aFrom = pFro
329c0 6d 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 75 38  m->aData;.    u8
329d0 20 2a 20 63 6f 6e 73 74 20 61 54 6f 20 3d 20 70   * const aTo = p
329e0 54 6f 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69  To->aData;.    i
329f0 6e 74 20 63 6f 6e 73 74 20 69 46 72 6f 6d 48 64  nt const iFromHd
32a00 72 20 3d 20 70 46 72 6f 6d 2d 3e 68 64 72 4f 66  r = pFrom->hdrOf
32a10 66 73 65 74 3b 0a 20 20 20 20 69 6e 74 20 63 6f  fset;.    int co
32a20 6e 73 74 20 69 54 6f 48 64 72 20 3d 20 28 28 70  nst iToHdr = ((p
32a30 54 6f 2d 3e 70 67 6e 6f 3d 3d 31 29 20 3f 20 31  To->pgno==1) ? 1
32a40 30 30 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74  00 : 0);.    int
32a50 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 69 44 61   rc;.    int iDa
32a60 74 61 3b 0a 20 20 0a 20 20 0a 20 20 20 20 61 73  ta;.  .  .    as
32a70 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73 49  sert( pFrom->isI
32a80 6e 69 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72  nit );.    asser
32a90 74 28 20 70 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e  t( pFrom->nFree>
32aa0 3d 69 54 6f 48 64 72 20 29 3b 0a 20 20 20 20 61  =iToHdr );.    a
32ab0 73 73 65 72 74 28 20 67 65 74 32 62 79 74 65 28  ssert( get2byte(
32ac0 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b  &aFrom[iFromHdr+
32ad0 35 5d 29 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  5]) <= (int)pBt-
32ae0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
32af0 20 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68   .    /* Copy th
32b00 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f  e b-tree node co
32b10 6e 74 65 6e 74 20 66 72 6f 6d 20 70 61 67 65 20  ntent from page 
32b20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54  pFrom to page pT
32b30 6f 2e 20 2a 2f 0a 20 20 20 20 69 44 61 74 61 20  o. */.    iData 
32b40 3d 20 67 65 74 32 62 79 74 65 28 26 61 46 72 6f  = get2byte(&aFro
32b50 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a  m[iFromHdr+5]);.
32b60 20 20 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b      memcpy(&aTo[
32b70 69 44 61 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69  iData], &aFrom[i
32b80 44 61 74 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62  Data], pBt->usab
32b90 6c 65 53 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20  leSize-iData);. 
32ba0 20 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69     memcpy(&aTo[i
32bb0 54 6f 48 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69  ToHdr], &aFrom[i
32bc0 46 72 6f 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d  FromHdr], pFrom-
32bd0 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
32be0 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  pFrom->nCell);. 
32bf0 20 0a 20 20 20 20 2f 2a 20 52 65 69 6e 69 74 69   .    /* Reiniti
32c00 61 6c 69 7a 65 20 70 61 67 65 20 70 54 6f 20 73  alize page pTo s
32c10 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  o that the conte
32c20 6e 74 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  nts of the MemPa
32c30 67 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 20  ge structure.   
32c40 20 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 65   ** match the ne
32c50 77 20 64 61 74 61 2e 20 54 68 65 20 69 6e 69 74  w data. The init
32c60 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54  ialization of pT
32c70 6f 20 63 61 6e 20 61 63 74 75 61 6c 6c 79 20 66  o can actually f
32c80 61 69 6c 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a  ail under.    **
32c90 20 66 61 69 72 6c 79 20 6f 62 73 63 75 72 65 20   fairly obscure 
32ca0 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 65  circumstances, e
32cb0 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73  ven though it is
32cc0 20 61 20 63 6f 70 79 20 6f 66 20 69 6e 69 74 69   a copy of initi
32cd0 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 70  alized .    ** p
32ce0 61 67 65 20 70 46 72 6f 6d 2e 0a 20 20 20 20 2a  age pFrom..    *
32cf0 2f 0a 20 20 20 20 70 54 6f 2d 3e 69 73 49 6e 69  /.    pTo->isIni
32d00 74 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  t = 0;.    rc = 
32d10 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 54  btreeInitPage(pT
32d20 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  o);.    if( rc!=
32d30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32d40 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
32d50 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
32d60 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
32d70 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  his is an auto-v
32d80 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20  acuum database, 
32d90 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  update the point
32da0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 0a 20  er-map entries. 
32db0 20 20 20 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d     ** for any b-
32dc0 74 72 65 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77  tree or overflow
32dd0 20 70 61 67 65 73 20 74 68 61 74 20 70 54 6f 20   pages that pTo 
32de0 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  now contains the
32df0 20 70 6f 69 6e 74 65 72 73 20 74 6f 2e 0a 20 20   pointers to..  
32e00 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41    */.    if( ISA
32e10 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
32e20 20 20 20 2a 70 52 43 20 3d 20 73 65 74 43 68 69     *pRC = setChi
32e30 6c 64 50 74 72 6d 61 70 73 28 70 54 6f 29 3b 0a  ldPtrmaps(pTo);.
32e40 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
32e50 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
32e60 72 65 64 69 73 74 72 69 62 75 74 65 73 20 63 65  redistributes ce
32e70 6c 6c 73 20 6f 6e 20 74 68 65 20 69 50 61 72 65  lls on the iPare
32e80 6e 74 49 64 78 27 74 68 20 63 68 69 6c 64 20 6f  ntIdx'th child o
32e90 66 20 70 50 61 72 65 6e 74 0a 2a 2a 20 28 68 65  f pParent.** (he
32ea0 72 65 61 66 74 65 72 20 22 74 68 65 20 70 61 67  reafter "the pag
32eb0 65 22 29 20 61 6e 64 20 75 70 20 74 6f 20 32 20  e") and up to 2 
32ec0 73 69 62 6c 69 6e 67 73 20 73 6f 20 74 68 61 74  siblings so that
32ed0 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20   all pages have 
32ee0 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20 73 61 6d  about the.** sam
32ef0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65  e amount of free
32f00 20 73 70 61 63 65 2e 20 55 73 75 61 6c 6c 79 20   space. Usually 
32f10 61 20 73 69 6e 67 6c 65 20 73 69 62 6c 69 6e 67  a single sibling
32f20 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20   on either side 
32f30 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 61  of the.** page a
32f40 72 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 62  re used in the b
32f50 61 6c 61 6e 63 69 6e 67 2c 20 74 68 6f 75 67 68  alancing, though
32f60 20 62 6f 74 68 20 73 69 62 6c 69 6e 67 73 20 6d   both siblings m
32f70 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f  ight come from o
32f80 6e 65 0a 2a 2a 20 73 69 64 65 20 69 66 20 74 68  ne.** side if th
32f90 65 20 70 61 67 65 20 69 73 20 74 68 65 20 66 69  e page is the fi
32fa0 72 73 74 20 6f 72 20 6c 61 73 74 20 63 68 69 6c  rst or last chil
32fb0 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e  d of its parent.
32fc0 20 49 66 20 74 68 65 20 70 61 67 65 20 0a 2a 2a   If the page .**
32fd0 20 68 61 73 20 66 65 77 65 72 20 74 68 61 6e 20   has fewer than 
32fe0 32 20 73 69 62 6c 69 6e 67 73 20 28 73 6f 6d 65  2 siblings (some
32ff0 74 68 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20  thing which can 
33000 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74  only happen if t
33010 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 20  he page.** is a 
33020 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20 63  root page or a c
33030 68 69 6c 64 20 6f 66 20 61 20 72 6f 6f 74 20 70  hild of a root p
33040 61 67 65 29 20 74 68 65 6e 20 61 6c 6c 20 61 76  age) then all av
33050 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73  ailable siblings
33060 0a 2a 2a 20 70 61 72 74 69 63 69 70 61 74 65 20  .** participate 
33070 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
33080 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  ..**.** The numb
33090 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f  er of siblings o
330a0 66 20 74 68 65 20 70 61 67 65 20 6d 69 67 68 74  f the page might
330b0 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 6f 72   be increased or
330c0 20 64 65 63 72 65 61 73 65 64 20 62 79 20 0a 2a   decreased by .*
330d0 2a 20 6f 6e 65 20 6f 72 20 74 77 6f 20 69 6e 20  * one or two in 
330e0 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65  an effort to kee
330f0 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79 20 66  p pages nearly f
33100 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65 72  ull but not over
33110 20 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f   full. .**.** No
33120 74 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69  te that when thi
33130 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
33140 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65  led, some of the
33150 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
33160 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20  ge.** might not 
33170 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74 6f 72  actually be stor
33180 65 64 20 69 6e 20 4d 65 6d 50 61 67 65 2e 61 44  ed in MemPage.aD
33190 61 74 61 5b 5d 2e 20 54 68 69 73 20 63 61 6e 20  ata[]. This can 
331a0 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65  happen.** if the
331b0 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c   page is overful
331c0 6c 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  l. This routine 
331d0 65 6e 73 75 72 65 73 20 74 68 61 74 20 61 6c 6c  ensures that all
331e0 20 63 65 6c 6c 73 20 61 6c 6c 6f 63 61 74 65 64   cells allocated
331f0 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
33200 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73  and its siblings
33210 20 66 69 74 20 69 6e 74 6f 20 4d 65 6d 50 61 67   fit into MemPag
33220 65 2e 61 44 61 74 61 5b 5d 20 62 65 66 6f 72 65  e.aData[] before
33230 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
33240 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73 65 20  * In the course 
33250 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65  of balancing the
33260 20 70 61 67 65 20 61 6e 64 20 69 74 73 20 73 69   page and its si
33270 62 6c 69 6e 67 73 2c 20 63 65 6c 6c 73 20 6d 61  blings, cells ma
33280 79 20 62 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64  y be.** inserted
33290 20 69 6e 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64   into or removed
332a0 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74   from the parent
332b0 20 70 61 67 65 20 28 70 50 61 72 65 6e 74 29 2e   page (pParent).
332c0 20 44 6f 69 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79   Doing so.** may
332d0 20 63 61 75 73 65 20 74 68 65 20 70 61 72 65 6e   cause the paren
332e0 74 20 70 61 67 65 20 74 6f 20 62 65 63 6f 6d 65  t page to become
332f0 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64   overfull or und
33300 65 72 66 75 6c 6c 2e 20 49 66 20 74 68 69 73 0a  erfull. If this.
33310 2a 2a 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69  ** happens, it i
33320 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
33330 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
33340 65 72 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65  er to invoke the
33350 20 63 6f 72 72 65 63 74 0a 2a 2a 20 62 61 6c 61   correct.** bala
33360 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 20 74 6f  ncing routine to
33370 20 66 69 78 20 74 68 69 73 20 70 72 6f 62 6c 65   fix this proble
33380 6d 20 28 73 65 65 20 74 68 65 20 62 61 6c 61 6e  m (see the balan
33390 63 65 28 29 20 72 6f 75 74 69 6e 65 29 2e 20 0a  ce() routine). .
333a0 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f  **.** If this ro
333b0 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20  utine fails for 
333c0 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d  any reason, it m
333d0 69 67 68 74 20 6c 65 61 76 65 20 74 68 65 20 64  ight leave the d
333e0 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20  atabase.** in a 
333f0 63 6f 72 72 75 70 74 65 64 20 73 74 61 74 65 2e  corrupted state.
33400 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
33410 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20 64  ine fails, the d
33420 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a  atabase should.*
33430 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  * be rolled back
33440 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72  ..**.** The thir
33450 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
33460 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 4f 76  is function, aOv
33470 66 6c 53 70 61 63 65 2c 20 69 73 20 61 20 70 6f  flSpace, is a po
33480 69 6e 74 65 72 20 74 6f 20 61 0a 2a 2a 20 62 75  inter to a.** bu
33490 66 66 65 72 20 62 69 67 20 65 6e 6f 75 67 68 20  ffer big enough 
334a0 74 6f 20 68 6f 6c 64 20 6f 6e 65 20 70 61 67 65  to hold one page
334b0 2e 20 49 66 20 77 68 69 6c 65 20 69 6e 73 65 72  . If while inser
334c0 74 69 6e 67 20 63 65 6c 6c 73 20 69 6e 74 6f 20  ting cells into 
334d0 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20 70 61  the parent.** pa
334e0 67 65 20 28 70 50 61 72 65 6e 74 29 20 74 68 65  ge (pParent) the
334f0 20 70 61 72 65 6e 74 20 70 61 67 65 20 62 65 63   parent page bec
33500 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74  omes overfull, t
33510 68 69 73 20 62 75 66 66 65 72 20 69 73 0a 2a 2a  his buffer is.**
33520 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
33530 68 65 20 70 61 72 65 6e 74 27 73 20 6f 76 65 72  he parent's over
33540 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 42 65 63 61  flow cells. Beca
33550 75 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  use this functio
33560 6e 20 69 6e 73 65 72 74 73 0a 2a 2a 20 61 20 6d  n inserts.** a m
33570 61 78 69 6d 75 6d 20 6f 66 20 66 6f 75 72 20 64  aximum of four d
33580 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74  ivider cells int
33590 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
335a0 65 2c 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d  e, and the maxim
335b0 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 61 20  um.** size of a 
335c0 63 65 6c 6c 20 73 74 6f 72 65 64 20 77 69 74 68  cell stored with
335d0 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e  in an internal n
335e0 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 6c 65  ode is always le
335f0 73 73 20 74 68 61 6e 20 31 2f 34 0a 2a 2a 20 6f  ss than 1/4.** o
33600 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c  f the page-size,
33610 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b   the aOvflSpace[
33620 5d 20 62 75 66 66 65 72 20 69 73 20 67 75 61 72  ] buffer is guar
33630 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 61 72  anteed to be lar
33640 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 66 6f 72  ge.** enough for
33650 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 63 65   all overflow ce
33660 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 4f  lls..**.** If aO
33670 76 66 6c 53 70 61 63 65 20 69 73 20 73 65 74 20  vflSpace is set 
33680 74 6f 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65  to a null pointe
33690 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  r, this function
336a0 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c   returns .** SQL
336b0 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 23 69  ITE_NOMEM..*/.#i
336c0 66 20 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56  f defined(_MSC_V
336d0 45 52 29 20 26 26 20 5f 4d 53 43 5f 56 45 52 20  ER) && _MSC_VER 
336e0 3e 3d 20 31 37 30 30 20 26 26 20 64 65 66 69 6e  >= 1700 && defin
336f0 65 64 28 5f 4d 5f 41 52 4d 29 0a 23 70 72 61 67  ed(_M_ARM).#prag
33700 6d 61 20 6f 70 74 69 6d 69 7a 65 28 22 22 2c 20  ma optimize("", 
33710 6f 66 66 29 0a 23 65 6e 64 69 66 0a 73 74 61 74  off).#endif.stat
33720 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e  ic int balance_n
33730 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d 50 61 67  onroot(.  MemPag
33740 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20  e *pParent,     
33750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
33760 65 6e 74 20 70 61 67 65 20 6f 66 20 73 69 62 6c  ent page of sibl
33770 69 6e 67 73 20 62 65 69 6e 67 20 62 61 6c 61 6e  ings being balan
33780 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ced */.  int iPa
33790 72 65 6e 74 49 64 78 2c 20 20 20 20 20 20 20 20  rentIdx,        
337a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
337b0 78 20 6f 66 20 22 74 68 65 20 70 61 67 65 22 20  x of "the page" 
337c0 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20  in pParent */.  
337d0 75 38 20 2a 61 4f 76 66 6c 53 70 61 63 65 2c 20  u8 *aOvflSpace, 
337e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
337f0 2f 2a 20 70 61 67 65 2d 73 69 7a 65 20 62 79 74  /* page-size byt
33800 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
33810 70 61 72 65 6e 74 20 6f 76 66 6c 20 2a 2f 0a 20  parent ovfl */. 
33820 20 69 6e 74 20 69 73 52 6f 6f 74 2c 20 20 20 20   int isRoot,    
33830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33840 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 72   /* True if pPar
33850 65 6e 74 20 69 73 20 61 20 72 6f 6f 74 2d 70 61  ent is a root-pa
33860 67 65 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75 6c  ge */.  int bBul
33870 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k               
33880 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
33890 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  if this call is 
338a0 70 61 72 74 20 6f 66 20 61 20 62 75 6c 6b 20 6c  part of a bulk l
338b0 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  oad */.){.  BtSh
338c0 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
338d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
338e0 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a  whole database *
338f0 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20  /.  int nCell = 
33900 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
33910 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
33920 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
33930 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c  */.  int nMaxCel
33940 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ls = 0;         
33950 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73    /* Allocated s
33960 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73  ize of apCell, s
33970 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f  zCell, aFrom. */
33980 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b  .  int nNew = 0;
33990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
339a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
339b0 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f  es in apNew[] */
339c0 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20  .  int nOld;    
339d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
339e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
339f0 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f  es in apOld[] */
33a00 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20  .  int i, j, k; 
33a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
33a30 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b   */.  int nxDiv;
33a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a50 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64     /* Next divid
33a60 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65  er slot in pPare
33a70 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  nt->aCell[] */. 
33a80 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
33a90 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
33aa0 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
33ab0 20 2a 2f 0a 20 20 75 31 36 20 6c 65 61 66 43 6f   */.  u16 leafCo
33ac0 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20  rrection;       
33ad0 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65     /* 4 if pPage
33ae0 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69   is a leaf.  0 i
33af0 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  f not */.  int l
33b00 65 61 66 44 61 74 61 3b 20 20 20 20 20 20 20 20  eafData;        
33b10 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
33b20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
33b30 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41  af of a LEAFDATA
33b40 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75   tree */.  int u
33b50 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20  sableSpace;     
33b60 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
33b70 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64   in pPage beyond
33b80 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
33b90 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20   int pageFlags; 
33ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33bb0 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d   Value of pPage-
33bc0 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69  >aData[0] */.  i
33bd0 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20  nt subtotal;    
33be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
33bf0 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73  ubtotal of bytes
33c00 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65   in cells on one
33c10 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
33c20 53 70 61 63 65 31 20 3d 20 30 3b 20 20 20 20 20  Space1 = 0;     
33c30 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
33c40 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20   unused byte of 
33c50 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69  aSpace1[] */.  i
33c60 6e 74 20 69 4f 76 66 6c 53 70 61 63 65 20 3d 20  nt iOvflSpace = 
33c70 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  0;          /* F
33c80 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65  irst unused byte
33c90 20 6f 66 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d   of aOvflSpace[]
33ca0 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72 61   */.  int szScra
33cb0 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  tch;            
33cc0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63     /* Size of sc
33cd0 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 72 65 71  ratch memory req
33ce0 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50  uested */.  MemP
33cf0 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20  age *apOld[NB]; 
33d00 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67           /* pPag
33d10 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f 20  e and up to two 
33d20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 4d 65  siblings */.  Me
33d30 6d 50 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42  mPage *apCopy[NB
33d40 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72  ];         /* Pr
33d50 69 76 61 74 65 20 63 6f 70 69 65 73 20 6f 66 20  ivate copies of 
33d60 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f  apOld[] pages */
33d70 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65  .  MemPage *apNe
33d80 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
33d90 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20  /* pPage and up 
33da0 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73 20 61  to NB siblings a
33db0 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a  fter balancing *
33dc0 2f 0a 20 20 75 38 20 2a 70 52 69 67 68 74 3b 20  /.  u8 *pRight; 
33dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33de0 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 69 6e 20   /* Location in 
33df0 70 61 72 65 6e 74 20 6f 66 20 72 69 67 68 74 2d  parent of right-
33e00 73 69 62 6c 69 6e 67 20 70 6f 69 6e 74 65 72 20  sibling pointer 
33e10 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e  */.  u8 *apDiv[N
33e20 42 2d 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20  B-1];           
33e30 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c    /* Divider cel
33e40 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f  ls in pParent */
33e50 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42  .  int cntNew[NB
33e60 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  +2];            
33e70 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c  /* Index in aCel
33e80 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65  l[] of cell afte
33e90 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20  r i-th page */. 
33ea0 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d   int szNew[NB+2]
33eb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
33ec0 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f   Combined size o
33ed0 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e  f cells place on
33ee0 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20   i-th page */.  
33ef0 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b  u8 **apCell = 0;
33f00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33f10 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20  All cells begin 
33f20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31  balanced */.  u1
33f30 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20  6 *szCell;      
33f40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
33f50 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20  cal size of all 
33f60 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
33f70 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63  ] */.  u8 *aSpac
33f80 65 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  e1;             
33f90 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
33fa0 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76 69 64   copies of divid
33fb0 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 50  ers cells */.  P
33fc0 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
33fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
33fe0 65 6d 70 20 76 61 72 20 74 6f 20 73 74 6f 72 65  emp var to store
33ff0 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69   a page number i
34000 6e 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50  n */..  pBt = pP
34010 61 72 65 6e 74 2d 3e 70 42 74 3b 0a 20 20 61 73  arent->pBt;.  as
34020 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
34030 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
34040 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
34050 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
34060 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
34070 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  t->pDbPage) );..
34080 23 69 66 20 30 0a 20 20 54 52 41 43 45 28 28 22  #if 0.  TRACE(("
34090 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70  BALANCE: begin p
340a0 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20  age %d child of 
340b0 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  %d\n", pPage->pg
340c0 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  no, pParent->pgn
340d0 6f 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  o));.#endif..  /
340e0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
340f0 70 50 61 72 65 6e 74 20 6d 61 79 20 68 61 76 65  pParent may have
34100 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 6f 76 65   at most one ove
34110 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 41 6e 64 20  rflow cell. And 
34120 69 66 0a 20 20 2a 2a 20 74 68 69 73 20 6f 76 65  if.  ** this ove
34130 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20 70 72  rflow cell is pr
34140 65 73 65 6e 74 2c 20 69 74 20 6d 75 73 74 20 62  esent, it must b
34150 65 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20  e the cell with 
34160 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 50 61 72  .  ** index iPar
34170 65 6e 74 49 64 78 2e 20 54 68 69 73 20 73 63 65  entIdx. This sce
34180 6e 61 72 69 6f 20 63 6f 6d 65 73 20 61 62 6f 75  nario comes abou
34190 74 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  t when this func
341a0 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 63 61 6c  tion.  ** is cal
341b0 6c 65 64 20 28 69 6e 64 69 72 65 63 74 6c 79 29  led (indirectly)
341c0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72   from sqlite3Btr
341d0 65 65 44 65 6c 65 74 65 28 29 2e 0a 20 20 2a 2f  eeDelete()..  */
341e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
341f0 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  nt->nOverflow==0
34200 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76   || pParent->nOv
34210 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 61  erflow==1 );.  a
34220 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
34230 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20  nOverflow==0 || 
34240 70 50 61 72 65 6e 74 2d 3e 61 69 4f 76 66 6c 5b  pParent->aiOvfl[
34250 30 5d 3d 3d 69 50 61 72 65 6e 74 49 64 78 20 29  0]==iParentIdx )
34260 3b 0a 0a 20 20 69 66 28 20 21 61 4f 76 66 6c 53  ;..  if( !aOvflS
34270 70 61 63 65 20 29 7b 0a 20 20 20 20 72 65 74 75  pace ){.    retu
34280 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
34290 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  .  }..  /* Find 
342a0 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
342b0 73 20 74 6f 20 62 61 6c 61 6e 63 65 2e 20 41 6c  s to balance. Al
342c0 73 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 63 65  so locate the ce
342d0 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 0a  lls in pParent .
342e0 20 20 2a 2a 20 74 68 61 74 20 64 69 76 69 64 65    ** that divide
342f0 20 74 68 65 20 73 69 62 6c 69 6e 67 73 2e 20 41   the siblings. A
34300 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
34310 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62  e to find NN sib
34320 6c 69 6e 67 73 20 6f 6e 20 0a 20 20 2a 2a 20 65  lings on .  ** e
34330 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50  ither side of pP
34340 61 67 65 2e 20 4d 6f 72 65 20 73 69 62 6c 69 6e  age. More siblin
34350 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f  gs are taken fro
34360 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77 65  m one side, howe
34370 76 65 72 2c 20 0a 20 20 2a 2a 20 69 66 20 74 68  ver, .  ** if th
34380 65 72 65 20 61 72 65 20 66 65 77 65 72 20 74 68  ere are fewer th
34390 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  an NN siblings o
343a0 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65  n the other side
343b0 2e 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a  . If pParent.  *
343c0 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65  * has NB or fewe
343d0 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20  r children then 
343e0 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
343f0 70 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65  pParent are take
34400 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  n.  .  **.  ** T
34410 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 64 72  his loop also dr
34420 6f 70 73 20 74 68 65 20 64 69 76 69 64 65 72 20  ops the divider 
34430 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68 65 20 70  cells from the p
34440 61 72 65 6e 74 20 70 61 67 65 2e 20 54 68 69 73  arent page. This
34450 0a 20 20 2a 2a 20 77 61 79 2c 20 74 68 65 20 72  .  ** way, the r
34460 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20  emainder of the 
34470 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
34480 74 20 68 61 76 65 20 74 6f 20 64 65 61 6c 20 77  t have to deal w
34490 69 74 68 20 61 6e 79 0a 20 20 2a 2a 20 6f 76 65  ith any.  ** ove
344a0 72 66 6c 6f 77 20 63 65 6c 6c 73 20 69 6e 20 74  rflow cells in t
344b0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20  he parent page, 
344c0 73 69 6e 63 65 20 69 66 20 61 6e 79 20 65 78 69  since if any exi
344d0 73 74 65 64 20 74 68 65 79 20 77 69 6c 6c 0a 20  sted they will. 
344e0 20 2a 2a 20 68 61 76 65 20 61 6c 72 65 61 64 79   ** have already
344f0 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e 0a 20   been removed.. 
34500 20 2a 2f 0a 20 20 69 20 3d 20 70 50 61 72 65 6e   */.  i = pParen
34510 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 2b 20 70  t->nOverflow + p
34520 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a 20  Parent->nCell;. 
34530 20 69 66 28 20 69 3c 32 20 29 7b 0a 20 20 20 20   if( i<2 ){.    
34540 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d 65 6c  nxDiv = 0;.  }el
34550 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
34560 62 42 75 6c 6b 3d 3d 30 20 7c 7c 20 62 42 75 6c  bBulk==0 || bBul
34570 6b 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20  k==1 );.    if( 
34580 69 50 61 72 65 6e 74 49 64 78 3d 3d 30 20 29 7b  iParentIdx==0 ){
34590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
345a0 20 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20   .      nxDiv = 
345b0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
345c0 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 69 20 29   iParentIdx==i )
345d0 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20  {.      nxDiv = 
345e0 69 2d 32 2b 62 42 75 6c 6b 3b 0a 20 20 20 20 7d  i-2+bBulk;.    }
345f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
34600 72 74 28 20 62 42 75 6c 6b 3d 3d 30 20 29 3b 0a  rt( bBulk==0 );.
34610 20 20 20 20 20 20 6e 78 44 69 76 20 3d 20 69 50        nxDiv = iP
34620 61 72 65 6e 74 49 64 78 2d 31 3b 0a 20 20 20 20  arentIdx-1;.    
34630 7d 0a 20 20 20 20 69 20 3d 20 32 2d 62 42 75 6c  }.    i = 2-bBul
34640 6b 3b 0a 20 20 7d 0a 20 20 6e 4f 6c 64 20 3d 20  k;.  }.  nOld = 
34650 69 2b 31 3b 0a 20 20 69 66 28 20 28 69 2b 6e 78  i+1;.  if( (i+nx
34660 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  Div-pParent->nOv
34670 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65 6e 74  erflow)==pParent
34680 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70  ->nCell ){.    p
34690 52 69 67 68 74 20 3d 20 26 70 50 61 72 65 6e 74  Right = &pParent
346a0 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
346b0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b 0a 20  >hdrOffset+8];. 
346c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 69 67   }else{.    pRig
346d0 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ht = findCell(pP
346e0 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70  arent, i+nxDiv-p
346f0 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
34700 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f 20 3d  w);.  }.  pgno =
34710 20 67 65 74 34 62 79 74 65 28 70 52 69 67 68 74   get4byte(pRight
34720 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  );.  while( 1 ){
34730 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64  .    rc = getAnd
34740 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67  InitPage(pBt, pg
34750 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c 20 30  no, &apOld[i], 0
34760 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
34770 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70  .      memset(ap
34780 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69  Old, 0, (i+1)*si
34790 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b  zeof(MemPage*));
347a0 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61  .      goto bala
347b0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
347c0 20 7d 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73   }.    nMaxCells
347d0 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e   += 1+apOld[i]->
347e0 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e  nCell+apOld[i]->
347f0 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69  nOverflow;.    i
34800 66 28 20 28 69 2d 2d 29 3d 3d 30 20 29 20 62 72  f( (i--)==0 ) br
34810 65 61 6b 3b 0a 0a 20 20 20 20 69 66 28 20 69 2b  eak;..    if( i+
34820 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e  nxDiv==pParent->
34830 61 69 4f 76 66 6c 5b 30 5d 20 26 26 20 70 50 61  aiOvfl[0] && pPa
34840 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  rent->nOverflow 
34850 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69  ){.      apDiv[i
34860 5d 20 3d 20 70 50 61 72 65 6e 74 2d 3e 61 70 4f  ] = pParent->apO
34870 76 66 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 70 67  vfl[0];.      pg
34880 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61 70  no = get4byte(ap
34890 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73  Div[i]);.      s
348a0 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69  zNew[i] = cellSi
348b0 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61  zePtr(pParent, a
348c0 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  pDiv[i]);.      
348d0 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
348e0 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ow = 0;.    }els
348f0 65 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69  e{.      apDiv[i
34900 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ] = findCell(pPa
34910 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50  rent, i+nxDiv-pP
34920 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
34930 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20  );.      pgno = 
34940 67 65 74 34 62 79 74 65 28 61 70 44 69 76 5b 69  get4byte(apDiv[i
34950 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b  ]);.      szNew[
34960 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  i] = cellSizePtr
34970 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b  (pParent, apDiv[
34980 69 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44  i]);..      /* D
34990 72 6f 70 20 74 68 65 20 63 65 6c 6c 20 66 72 6f  rop the cell fro
349a0 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  m the parent pag
349b0 65 2e 20 61 70 44 69 76 5b 69 5d 20 73 74 69 6c  e. apDiv[i] stil
349c0 6c 20 70 6f 69 6e 74 73 20 74 6f 0a 20 20 20 20  l points to.    
349d0 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 20 77 69    ** the cell wi
349e0 74 68 69 6e 20 74 68 65 20 70 61 72 65 6e 74 2c  thin the parent,
349f0 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20   even though it 
34a00 68 61 73 20 62 65 65 6e 20 64 72 6f 70 70 65 64  has been dropped
34a10 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  ..      ** This 
34a20 69 73 20 73 61 66 65 20 62 65 63 61 75 73 65 20  is safe because 
34a30 64 72 6f 70 70 69 6e 67 20 61 20 63 65 6c 6c 20  dropping a cell 
34a40 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74 65 73 20  only overwrites 
34a50 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20  the first.      
34a60 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66  ** four bytes of
34a70 20 69 74 2c 20 61 6e 64 20 74 68 69 73 20 66 75   it, and this fu
34a80 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
34a90 6e 65 65 64 20 74 68 65 20 66 69 72 73 74 0a 20  need the first. 
34aa0 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74       ** four byt
34ab0 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  es of the divide
34ac0 72 20 63 65 6c 6c 2e 20 53 6f 20 74 68 65 20 70  r cell. So the p
34ad0 6f 69 6e 74 65 72 20 69 73 20 73 61 66 65 20 74  ointer is safe t
34ae0 6f 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 6c  o use.      ** l
34af0 61 74 65 72 20 6f 6e 2e 20 20 0a 20 20 20 20 20  ater on.  .     
34b00 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42 75 74   **.      ** But
34b10 20 6e 6f 74 20 69 66 20 77 65 20 61 72 65 20 69   not if we are i
34b20 6e 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20  n secure-delete 
34b30 6d 6f 64 65 2e 20 49 6e 20 73 65 63 75 72 65 2d  mode. In secure-
34b40 64 65 6c 65 74 65 20 6d 6f 64 65 2c 0a 20 20 20  delete mode,.   
34b50 20 20 20 2a 2a 20 74 68 65 20 64 72 6f 70 43 65     ** the dropCe
34b60 6c 6c 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  ll() routine wil
34b70 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 20  l overwrite the 
34b80 65 6e 74 69 72 65 20 63 65 6c 6c 20 77 69 74 68  entire cell with
34b90 20 7a 65 72 6f 65 73 2e 0a 20 20 20 20 20 20 2a   zeroes..      *
34ba0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
34bb0 74 65 6d 70 6f 72 61 72 69 6c 79 20 63 6f 70 79  temporarily copy
34bc0 20 74 68 65 20 63 65 6c 6c 20 69 6e 74 6f 20 74   the cell into t
34bd0 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 0a  he aOvflSpace[].
34be0 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e        ** buffer.
34bf0 20 49 74 20 77 69 6c 6c 20 62 65 20 63 6f 70 69   It will be copi
34c00 65 64 20 6f 75 74 20 61 67 61 69 6e 20 61 73 20  ed out again as 
34c10 73 6f 6f 6e 20 61 73 20 74 68 65 20 61 53 70 61  soon as the aSpa
34c20 63 65 5b 5d 20 62 75 66 66 65 72 0a 20 20 20 20  ce[] buffer.    
34c30 20 20 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65    ** is allocate
34c40 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  d.  */.      if(
34c50 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
34c60 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
34c70 54 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  TE ){.        in
34c80 74 20 69 4f 66 66 3b 0a 0a 20 20 20 20 20 20 20  t iOff;..       
34c90 20 69 4f 66 66 20 3d 20 53 51 4c 49 54 45 5f 50   iOff = SQLITE_P
34ca0 54 52 5f 54 4f 5f 49 4e 54 28 61 70 44 69 76 5b  TR_TO_INT(apDiv[
34cb0 69 5d 29 20 2d 20 53 51 4c 49 54 45 5f 50 54 52  i]) - SQLITE_PTR
34cc0 5f 54 4f 5f 49 4e 54 28 70 50 61 72 65 6e 74 2d  _TO_INT(pParent-
34cd0 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20  >aData);.       
34ce0 20 69 66 28 20 28 69 4f 66 66 2b 73 7a 4e 65 77   if( (iOff+szNew
34cf0 5b 69 5d 29 3e 28 69 6e 74 29 70 42 74 2d 3e 75  [i])>(int)pBt->u
34d00 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
34d10 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
34d20 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
34d30 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65  .          memse
34d40 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31  t(apOld, 0, (i+1
34d50 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  )*sizeof(MemPage
34d60 2a 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  *));.          g
34d70 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
34d80 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  nup;.        }el
34d90 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  se{.          me
34da0 6d 63 70 79 28 26 61 4f 76 66 6c 53 70 61 63 65  mcpy(&aOvflSpace
34db0 5b 69 4f 66 66 5d 2c 20 61 70 44 69 76 5b 69 5d  [iOff], apDiv[i]
34dc0 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20  , szNew[i]);.   
34dd0 20 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20         apDiv[i] 
34de0 3d 20 26 61 4f 76 66 6c 53 70 61 63 65 5b 61 70  = &aOvflSpace[ap
34df0 44 69 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e  Div[i]-pParent->
34e00 61 44 61 74 61 5d 3b 0a 20 20 20 20 20 20 20 20  aData];.        
34e10 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
34e20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74  dropCell(pParent
34e30 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e  , i+nxDiv-pParen
34e40 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20 73 7a  t->nOverflow, sz
34e50 4e 65 77 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20  New[i], &rc);.  
34e60 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61    }.  }..  /* Ma
34e70 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d  ke nMaxCells a m
34e80 75 6c 74 69 70 6c 65 20 6f 66 20 34 20 69 6e 20  ultiple of 4 in 
34e90 6f 72 64 65 72 20 74 6f 20 70 72 65 73 65 72 76  order to preserv
34ea0 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c  e 8-byte.  ** al
34eb0 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61  ignment */.  nMa
34ec0 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65  xCells = (nMaxCe
34ed0 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20  lls + 3)&~3;..  
34ee0 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  /*.  ** Allocate
34ef0 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72   space for memor
34f00 79 20 73 74 72 75 63 74 75 72 65 73 0a 20 20 2a  y structures.  *
34f10 2f 0a 20 20 6b 20 3d 20 70 42 74 2d 3e 70 61 67  /.  k = pBt->pag
34f20 65 53 69 7a 65 20 2b 20 52 4f 55 4e 44 38 28 73  eSize + ROUND8(s
34f30 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b  izeof(MemPage));
34f40 0a 20 20 73 7a 53 63 72 61 74 63 68 20 3d 0a 20  .  szScratch =. 
34f50 20 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a        nMaxCells*
34f60 73 69 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20  sizeof(u8*)     
34f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34f80 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20    /* apCell */. 
34f90 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a      + nMaxCells*
34fa0 73 69 7a 65 6f 66 28 75 31 36 29 20 20 20 20 20  sizeof(u16)     
34fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34fc0 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20    /* szCell */. 
34fd0 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67 65 53      + pBt->pageS
34fe0 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
34ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35000 20 20 2f 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a    /* aSpace1 */.
35010 20 20 20 20 20 2b 20 6b 2a 6e 4f 6c 64 3b 20 20       + k*nOld;  
35020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35040 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 70 69 65     /* Page copie
35050 73 20 28 61 70 43 6f 70 79 29 20 2a 2f 0a 20 20  s (apCopy) */.  
35060 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33  apCell = sqlite3
35070 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73  ScratchMalloc( s
35080 7a 53 63 72 61 74 63 68 20 29 3b 20 0a 20 20 69  zScratch ); .  i
35090 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a  f( apCell==0 ){.
350a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
350b0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
350c0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
350d0 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20  .  }.  szCell = 
350e0 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d  (u16*)&apCell[nM
350f0 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 53 70 61  axCells];.  aSpa
35100 63 65 31 20 3d 20 28 75 38 2a 29 26 73 7a 43 65  ce1 = (u8*)&szCe
35110 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20  ll[nMaxCells];. 
35120 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
35130 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 61 53  YTE_ALIGNMENT(aS
35140 70 61 63 65 31 29 20 29 3b 0a 0a 20 20 2f 2a 0a  pace1) );..  /*.
35150 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65    ** Load pointe
35160 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20  rs to all cells 
35170 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  on sibling pages
35180 20 61 6e 64 20 74 68 65 20 64 69 76 69 64 65 72   and the divider
35190 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f   cells.  ** into
351a0 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c   the local apCel
351b0 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b 65  l[] array.  Make
351c0 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 64   copies of the d
351d0 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a  ivider cells.  *
351e0 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  * into space obt
351f0 61 69 6e 65 64 20 66 72 6f 6d 20 61 53 70 61 63  ained from aSpac
35200 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20  e1[] and remove 
35210 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
35220 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72  s.  ** from pPar
35230 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ent..  **.  ** I
35240 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  f the siblings a
35250 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73  re on leaf pages
35260 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64  , then the child
35270 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65   pointers of the
35280 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65  .  ** divider ce
35290 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70 65 64  lls are stripped
352a0 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20   from the cells 
352b0 62 65 66 6f 72 65 20 74 68 65 79 20 61 72 65 20  before they are 
352c0 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f  copied.  ** into
352d0 20 61 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20   aSpace1[].  In 
352e0 74 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65  this way, all ce
352f0 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
35300 61 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a  are without.  **
35310 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e   child pointers.
35320 20 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72    If siblings ar
35330 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68  e not leaves, th
35340 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20  en all cell in. 
35350 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63   ** apCell[] inc
35360 6c 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  lude child point
35370 65 72 73 2e 20 20 45 69 74 68 65 72 20 77 61 79  ers.  Either way
35380 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  , all cells in a
35390 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65  pCell[].  ** are
353a0 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a   alike..  **.  *
353b0 2a 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  * leafCorrection
353c0 3a 20 20 34 20 69 66 20 70 50 61 67 65 20 69 73  :  4 if pPage is
353d0 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70   a leaf.  0 if p
353e0 50 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65  Page is not a le
353f0 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c  af..  **       l
35400 65 61 66 44 61 74 61 3a 20 20 31 20 69 66 20 70  eafData:  1 if p
35410 50 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64  Page holds key+d
35420 61 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20  ata and pParent 
35430 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e  holds only keys.
35440 0a 20 20 2a 2f 0a 20 20 6c 65 61 66 43 6f 72 72  .  */.  leafCorr
35450 65 63 74 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30  ection = apOld[0
35460 5d 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61  ]->leaf*4;.  lea
35470 66 44 61 74 61 20 3d 20 61 70 4f 6c 64 5b 30 5d  fData = apOld[0]
35480 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20 66 6f 72  ->hasData;.  for
35490 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
354a0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69  +){.    int limi
354b0 74 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 42  t;.    .    /* B
354c0 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74  efore doing anyt
354d0 68 69 6e 67 20 65 6c 73 65 2c 20 74 61 6b 65 20  hing else, take 
354e0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 27  a copy of the i'
354f0 74 68 20 6f 72 69 67 69 6e 61 6c 20 73 69 62 6c  th original sibl
35500 69 6e 67 0a 20 20 20 20 2a 2a 20 54 68 65 20 72  ing.    ** The r
35510 65 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63  est of this func
35520 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61  tion will use da
35530 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69  ta from the copi
35540 65 73 20 72 61 74 68 65 72 0a 20 20 20 20 2a 2a  es rather.    **
35550 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
35560 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20 74  al pages since t
35570 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
35580 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65  s will be in the
35590 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  .    ** process 
355a0 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69  of being overwri
355b0 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d 65  tten.  */.    Me
355c0 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70  mPage *pOld = ap
355d0 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61  Copy[i] = (MemPa
355e0 67 65 2a 29 26 61 53 70 61 63 65 31 5b 70 42 74  ge*)&aSpace1[pBt
355f0 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 6b 2a 69  ->pageSize + k*i
35600 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f  ];.    memcpy(pO
35610 6c 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69  ld, apOld[i], si
35620 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a  zeof(MemPage));.
35630 20 20 20 20 70 4f 6c 64 2d 3e 61 44 61 74 61 20      pOld->aData 
35640 3d 20 28 76 6f 69 64 2a 29 26 70 4f 6c 64 5b 31  = (void*)&pOld[1
35650 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f  ];.    memcpy(pO
35660 6c 64 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64  ld->aData, apOld
35670 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d  [i]->aData, pBt-
35680 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20  >pageSize);..   
35690 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e   limit = pOld->n
356a0 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72  Cell+pOld->nOver
356b0 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20 70 4f  flow;.    if( pO
356c0 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ld->nOverflow>0 
356d0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  ){.      for(j=0
356e0 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b  ; j<limit; j++){
356f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
35700 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73   nCell<nMaxCells
35710 20 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43 65   );.        apCe
35720 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64  ll[nCell] = find
35730 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c  OverflowCell(pOl
35740 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20 20 73  d, j);.        s
35750 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63  zCell[nCell] = c
35760 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c  ellSizePtr(pOld,
35770 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b   apCell[nCell]);
35780 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b  .        nCell++
35790 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
357a0 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 61  lse{.      u8 *a
357b0 44 61 74 61 20 3d 20 70 4f 6c 64 2d 3e 61 44 61  Data = pOld->aDa
357c0 74 61 3b 0a 20 20 20 20 20 20 75 31 36 20 6d 61  ta;.      u16 ma
357d0 73 6b 50 61 67 65 20 3d 20 70 4f 6c 64 2d 3e 6d  skPage = pOld->m
357e0 61 73 6b 50 61 67 65 3b 0a 20 20 20 20 20 20 75  askPage;.      u
357f0 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  16 cellOffset = 
35800 70 4f 6c 64 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  pOld->cellOffset
35810 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
35820 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a   j<limit; j++){.
35830 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
35840 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20  nCell<nMaxCells 
35850 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43 65 6c  );.        apCel
35860 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 43  l[nCell] = findC
35870 65 6c 6c 76 32 28 61 44 61 74 61 2c 20 6d 61 73  ellv2(aData, mas
35880 6b 50 61 67 65 2c 20 63 65 6c 6c 4f 66 66 73 65  kPage, cellOffse
35890 74 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20 20 73  t, j);.        s
358a0 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63  zCell[nCell] = c
358b0 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c  ellSizePtr(pOld,
358c0 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b   apCell[nCell]);
358d0 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b  .        nCell++
358e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
358f0 20 20 20 20 20 20 0a 20 20 20 20 69 66 28 20 69        .    if( i
35900 3c 6e 4f 6c 64 2d 31 20 26 26 20 21 6c 65 61 66  <nOld-1 && !leaf
35910 44 61 74 61 29 7b 0a 20 20 20 20 20 20 75 31 36  Data){.      u16
35920 20 73 7a 20 3d 20 28 75 31 36 29 73 7a 4e 65 77   sz = (u16)szNew
35930 5b 69 5d 3b 0a 20 20 20 20 20 20 75 38 20 2a 70  [i];.      u8 *p
35940 54 65 6d 70 3b 0a 20 20 20 20 20 20 61 73 73 65  Temp;.      asse
35950 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65  rt( nCell<nMaxCe
35960 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 73 7a 43  lls );.      szC
35970 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b  ell[nCell] = sz;
35980 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26  .      pTemp = &
35990 61 53 70 61 63 65 31 5b 69 53 70 61 63 65 31 5d  aSpace1[iSpace1]
359a0 3b 0a 20 20 20 20 20 20 69 53 70 61 63 65 31 20  ;.      iSpace1 
359b0 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73  += sz;.      ass
359c0 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 6d 61  ert( sz<=pBt->ma
359d0 78 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a 20 20 20  xLocal+23 );.   
359e0 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63     assert( iSpac
359f0 65 31 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  e1 <= (int)pBt->
35a00 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
35a10 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20    memcpy(pTemp, 
35a20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20  apDiv[i], sz);. 
35a30 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
35a40 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43  l] = pTemp+leafC
35a50 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
35a60 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
35a70 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65  rection==0 || le
35a80 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20  afCorrection==4 
35a90 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  );.      szCell[
35aa0 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c 6c 5b  nCell] = szCell[
35ab0 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66 43 6f 72  nCell] - leafCor
35ac0 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69  rection;.      i
35ad0 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29  f( !pOld->leaf )
35ae0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
35af0 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
35b00 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==0 );.        a
35b10 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68 64 72  ssert( pOld->hdr
35b20 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20  Offset==0 );.   
35b30 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
35b40 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  t pointer of the
35b50 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64   child page pOld
35b60 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66   becomes the lef
35b70 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69  t.        ** poi
35b80 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76 69  nter of the divi
35b90 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20  der cell */.    
35ba0 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43 65 6c      memcpy(apCel
35bb0 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d  l[nCell], &pOld-
35bc0 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20  >aData[8], 4);. 
35bd0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
35be0 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
35bf0 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b  Correction==4 );
35c00 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43  .        if( szC
35c10 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a  ell[nCell]<4 ){.
35c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
35c30 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65  not allow any ce
35c40 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  lls smaller than
35c50 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20   4 bytes. */.   
35c60 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
35c70 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20  ell] = 4;.      
35c80 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
35c90 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d    nCell++;.    }
35ca0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
35cb0 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e  Figure out the n
35cc0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e  umber of pages n
35cd0 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c  eeded to hold al
35ce0 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20  l nCell cells.. 
35cf0 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e   ** Store this n
35d00 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41  umber in "k".  A
35d10 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65  lso compute szNe
35d20 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65  w[] which is the
35d30 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65   total.  ** size
35d40 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e   of all cells on
35d50 20 74 68 65 20 69 2d 74 68 20 70 61 67 65 20 61   the i-th page a
35d60 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63  nd cntNew[] whic
35d70 68 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20  h is the index. 
35d80 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20   ** in apCell[] 
35d90 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74  of the cell that
35da0 20 64 69 76 69 64 65 73 20 70 61 67 65 20 69 20   divides page i 
35db0 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20  from page i+1.  
35dc0 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20  .  ** cntNew[k] 
35dd0 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65  should equal nCe
35de0 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61  ll..  **.  ** Va
35df0 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79  lues computed by
35e00 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a   this block:.  *
35e10 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  *.  **          
35e20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75   k: The total nu
35e30 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20  mber of sibling 
35e40 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a  pages.  **    sz
35e50 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75  New[i]: Spaced u
35e60 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20  sed on the i-th 
35e70 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20  sibling page..  
35e80 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20  **   cntNew[i]: 
35e90 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b  Index in apCell[
35ea0 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66  ] and szCell[] f
35eb0 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  or the first cel
35ec0 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20  l to.  **       
35ed0 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74         the right
35ee0 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69 62   of the i-th sib
35ef0 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20  ling page..  ** 
35f00 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d  usableSpace: Num
35f10 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
35f20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  space available 
35f30 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e  on each sibling.
35f40 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73  .  ** .  */.  us
35f50 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d  ableSpace = pBt-
35f60 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32  >usableSize - 12
35f70 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   + leafCorrectio
35f80 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61  n;.  for(subtota
35f90 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  l=k=i=0; i<nCell
35fa0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
35fb0 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( i<nMaxCells 
35fc0 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20  );.    subtotal 
35fd0 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32  += szCell[i] + 2
35fe0 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f 74  ;.    if( subtot
35ff0 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65  al > usableSpace
36000 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b   ){.      szNew[
36010 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20  k] = subtotal - 
36020 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  szCell[i];.     
36030 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a   cntNew[k] = i;.
36040 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61        if( leafDa
36050 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20  ta ){ i--; }.   
36060 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b     subtotal = 0;
36070 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20  .      k++;.    
36080 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20 29 7b 20    if( k>NB+1 ){ 
36090 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
360a0 55 50 54 5f 42 4b 50 54 3b 20 67 6f 74 6f 20 62  UPT_BKPT; goto b
360b0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 20  alance_cleanup; 
360c0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a  }.    }.  }.  sz
360d0 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61  New[k] = subtota
360e0 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d  l;.  cntNew[k] =
360f0 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a   nCell;.  k++;..
36100 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61    /*.  ** The pa
36110 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62  cking computed b
36120 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62  y the previous b
36130 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64 20 74  lock is biased t
36140 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e  oward the siblin
36150 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c  gs.  ** on the l
36160 65 66 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c  eft side.  The l
36170 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65  eft siblings are
36180 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66   always nearly f
36190 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20  ull, while the. 
361a0 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73   ** right-most s
361b0 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20  ibling might be 
361c0 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54  nearly empty.  T
361d0 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  his block of cod
361e0 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20  e attempts.  ** 
361f0 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 70 61  to adjust the pa
36200 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67  cking of sibling
36210 73 20 74 6f 20 67 65 74 20 61 20 62 65 74 74 65  s to get a bette
36220 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a  r balance..  **.
36230 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74    ** This adjust
36240 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61  ment is more tha
36250 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  n an optimizatio
36260 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20  n.  The packing 
36270 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a  above might.  **
36280 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61   be so out of ba
36290 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69  lance as to be i
362a0 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61  llegal.  For exa
362b0 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d  mple, the right-
362c0 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e  most.  ** siblin
362d0 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c  g might be compl
362e0 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68  etely empty.  Th
362f0 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73  is adjustment is
36300 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20   not optional.. 
36310 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b   */.  for(i=k-1;
36320 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   i>0; i--){.    
36330 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a  int szRight = sz
36340 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65  New[i];  /* Size
36350 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74   of sibling on t
36360 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20  he right */.    
36370 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e  int szLeft = szN
36380 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65  ew[i-1]; /* Size
36390 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74   of sibling on t
363a0 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69  he left */.    i
363b0 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20 20 20  nt r;           
363c0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72     /* Index of r
363d0 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69  ight-most cell i
363e0 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a  n left sibling *
363f0 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20  /.    int d;    
36400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
36410 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  ex of first cell
36420 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
36430 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f  right sibling */
36440 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77  ..    r = cntNew
36450 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64  [i-1] - 1;.    d
36460 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44   = r + 1 - leafD
36470 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ata;.    assert(
36480 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   d<nMaxCells );.
36490 20 20 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d      assert( r<nM
364a0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77  axCells );.    w
364b0 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30  hile( szRight==0
364c0 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 21 62 42   .       || (!bB
364d0 75 6c 6b 20 26 26 20 73 7a 52 69 67 68 74 2b 73  ulk && szRight+s
364e0 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65  zCell[d]+2<=szLe
364f0 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29  ft-(szCell[r]+2)
36500 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ) .    ){.      
36510 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c  szRight += szCel
36520 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20  l[d] + 2;.      
36530 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c  szLeft -= szCell
36540 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63  [r] + 2;.      c
36550 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20  ntNew[i-1]--;.  
36560 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69      r = cntNew[i
36570 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64  -1] - 1;.      d
36580 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44   = r + 1 - leafD
36590 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ata;.    }.    s
365a0 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68  zNew[i] = szRigh
365b0 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31  t;.    szNew[i-1
365c0 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a  ] = szLeft;.  }.
365d0 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20  .  /* Either we 
365e0 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  found one or mor
365f0 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b  e cells (cntnew[
36600 30 5d 29 3e 30 29 20 6f 72 20 70 50 61 67 65 20  0])>0) or pPage 
36610 69 73 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 61  is.  ** a virtua
36620 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 41 20  l root page.  A 
36630 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
36640 65 20 69 73 20 77 68 65 6e 20 74 68 65 20 72 65  e is when the re
36650 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67  al root.  ** pag
36660 65 20 69 73 20 70 61 67 65 20 31 20 61 6e 64 20  e is page 1 and 
36670 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20  we are the only 
36680 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20 70 61  child of that pa
36690 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 50  ge..  **.  ** UP
366a0 44 41 54 45 3a 20 20 54 68 65 20 61 73 73 65 72  DATE:  The asser
366b0 74 28 29 20 62 65 6c 6f 77 20 69 73 20 6e 6f 74  t() below is not
366c0 20 6e 65 63 65 73 73 61 72 69 6c 79 20 74 72 75   necessarily tru
366d0 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
366e0 65 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 63  e.  ** file is c
366f0 6f 72 72 75 70 74 2e 20 20 54 68 65 20 63 6f 72  orrupt.  The cor
36700 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  ruption will be 
36710 64 65 74 65 63 74 65 64 20 61 6e 64 20 72 65 70  detected and rep
36720 6f 72 74 65 64 20 6c 61 74 65 72 0a 20 20 2a 2a  orted later.  **
36730 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 64 75   in this procedu
36740 72 65 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e  re so there is n
36750 6f 20 6e 65 65 64 20 74 6f 20 61 63 74 20 75 70  o need to act up
36760 6f 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  on it now..  */.
36770 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20  #if 0.  assert( 
36780 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28  cntNew[0]>0 || (
36790 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31  pParent->pgno==1
367a0 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65   && pParent->nCe
367b0 6c 6c 3d 3d 30 29 20 29 3b 0a 23 65 6e 64 69 66  ll==0) );.#endif
367c0 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  ..  TRACE(("BALA
367d0 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20  NCE: old: %d %d 
367e0 25 64 20 20 22 2c 0a 20 20 20 20 61 70 4f 6c 64  %d  ",.    apOld
367f0 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  [0]->pgno, .    
36800 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f 6c 64 5b  nOld>=2 ? apOld[
36810 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 0a 20 20  1]->pgno : 0,.  
36820 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61 70 4f 6c    nOld>=3 ? apOl
36830 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 0a 20  d[2]->pgno : 0. 
36840 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20   ));..  /*.  ** 
36850 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70  Allocate k new p
36860 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64  ages.  Reuse old
36870 20 70 61 67 65 73 20 77 68 65 72 65 20 70 6f 73   pages where pos
36880 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  sible..  */.  if
36890 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f  ( apOld[0]->pgno
368a0 3c 3d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  <=1 ){.    rc = 
368b0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
368c0 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61  KPT;.    goto ba
368d0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
368e0 20 7d 0a 20 20 70 61 67 65 46 6c 61 67 73 20 3d   }.  pageFlags =
368f0 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61 44 61 74 61   apOld[0]->aData
36900 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  [0];.  for(i=0; 
36910 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d  i<k; i++){.    M
36920 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20  emPage *pNew;.  
36930 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a    if( i<nOld ){.
36940 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e        pNew = apN
36950 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d  ew[i] = apOld[i]
36960 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d  ;.      apOld[i]
36970 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
36980 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
36990 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65  te(pNew->pDbPage
369a0 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b  );.      nNew++;
369b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
369c0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
369d0 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  anup;.    }else{
369e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
369f0 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  >0 );.      rc =
36a00 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
36a10 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26  ge(pBt, &pNew, &
36a20 70 67 6e 6f 2c 20 28 62 42 75 6c 6b 20 3f 20 31  pgno, (bBulk ? 1
36a30 20 3a 20 70 67 6e 6f 29 2c 20 30 29 3b 0a 20 20   : pgno), 0);.  
36a40 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
36a50 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
36a60 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69  p;.      apNew[i
36a70 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  ] = pNew;.      
36a80 6e 4e 65 77 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f  nNew++;..      /
36a90 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65  * Set the pointe
36aa0 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r-map entry for 
36ab0 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20  the new sibling 
36ac0 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  page. */.      i
36ad0 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
36ae0 29 7b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  ){.        ptrma
36af0 70 50 75 74 28 70 42 74 2c 20 70 4e 65 77 2d 3e  pPut(pBt, pNew->
36b00 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
36b10 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  EE, pParent->pgn
36b20 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  o, &rc);.       
36b30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
36b40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
36b50 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
36b60 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a  anup;.        }.
36b70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
36b80 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79  }..  /* Free any
36b90 20 6f 6c 64 20 70 61 67 65 73 20 74 68 61 74 20   old pages that 
36ba0 77 65 72 65 20 6e 6f 74 20 72 65 75 73 65 64 20  were not reused 
36bb0 61 73 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20  as new pages..  
36bc0 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f  */.  while( i<nO
36bd0 6c 64 20 29 7b 0a 20 20 20 20 66 72 65 65 50 61  ld ){.    freePa
36be0 67 65 28 61 70 4f 6c 64 5b 69 5d 2c 20 26 72 63  ge(apOld[i], &rc
36bf0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
36c00 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
36c10 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65 61 73  anup;.    releas
36c20 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b  ePage(apOld[i]);
36c30 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20  .    apOld[i] = 
36c40 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a  0;.    i++;.  }.
36c50 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74  .  /*.  ** Put t
36c60 68 65 20 6e 65 77 20 70 61 67 65 73 20 69 6e 20  he new pages in 
36c70 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  accending order.
36c80 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 6f 0a    This helps to.
36c90 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69 65    ** keep entrie
36ca0 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s in the disk fi
36cb0 6c 65 20 69 6e 20 6f 72 64 65 72 20 73 6f 20 74  le in order so t
36cc0 68 61 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20  hat a scan.  ** 
36cd0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  of the table is 
36ce0 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68  a linear scan th
36cf0 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65 2e 20  rough the file. 
36d00 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75   That.  ** in tu
36d10 72 6e 20 68 65 6c 70 73 20 74 68 65 20 6f 70 65  rn helps the ope
36d20 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 74 6f  rating system to
36d30 20 64 65 6c 69 76 65 72 20 70 61 67 65 73 0a 20   deliver pages. 
36d40 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 69 73   ** from the dis
36d50 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a  k more rapidly..
36d60 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e    **.  ** An O(n
36d70 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f  ^2) insertion so
36d80 72 74 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20  rt algorithm is 
36d90 75 73 65 64 2c 20 62 75 74 20 73 69 6e 63 65 0a  used, but since.
36da0 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72 20    ** n is never 
36db0 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20 28 61 20  more than NB (a 
36dc0 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c  small constant),
36dd0 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a   that should.  *
36de0 2a 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c  * not be a probl
36df0 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  em..  **.  ** Wh
36e00 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f  en NB==3, this o
36e10 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ne optimization 
36e20 6d 61 6b 65 73 20 74 68 65 20 64 61 74 61 62 61  makes the databa
36e30 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32 35  se.  ** about 25
36e40 25 20 66 61 73 74 65 72 20 66 6f 72 20 6c 61 72  % faster for lar
36e50 67 65 20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e  ge insertions an
36e60 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a  d deletions..  *
36e70 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b  /.  for(i=0; i<k
36e80 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  -1; i++){.    in
36e90 74 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 69  t minV = apNew[i
36ea0 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 6e 74  ]->pgno;.    int
36eb0 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66   minI = i;.    f
36ec0 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a  or(j=i+1; j<k; j
36ed0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
36ee0 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3c 28 75  pNew[j]->pgno<(u
36ef0 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a  nsigned)minV ){.
36f00 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a          minI = j
36f10 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56 20 3d  ;.        minV =
36f20 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b   apNew[j]->pgno;
36f30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
36f40 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b     if( minI>i ){
36f50 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
36f60 70 54 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61  pT;.      pT = a
36f70 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 61  pNew[i];.      a
36f80 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b  pNew[i] = apNew[
36f90 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e  minI];.      apN
36fa0 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20  ew[minI] = pT;. 
36fb0 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45     }.  }.  TRACE
36fc0 28 28 22 6e 65 77 3a 20 25 64 28 25 64 29 20 25  (("new: %d(%d) %
36fd0 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
36fe0 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20  %d) %d(%d)\n",. 
36ff0 20 20 20 61 70 4e 65 77 5b 30 5d 2d 3e 70 67 6e     apNew[0]->pgn
37000 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20  o, szNew[0],.   
37010 20 6e 4e 65 77 3e 3d 32 20 3f 20 61 70 4e 65 77   nNew>=2 ? apNew
37020 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e  [1]->pgno : 0, n
37030 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31  New>=2 ? szNew[1
37040 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
37050 3d 33 20 3f 20 61 70 4e 65 77 5b 32 5d 2d 3e 70  =3 ? apNew[2]->p
37060 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33  gno : 0, nNew>=3
37070 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c   ? szNew[2] : 0,
37080 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 61  .    nNew>=4 ? a
37090 70 4e 65 77 5b 33 5d 2d 3e 70 67 6e 6f 20 3a 20  pNew[3]->pgno : 
370a0 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e  0, nNew>=4 ? szN
370b0 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[3] : 0,.    n
370c0 4e 65 77 3e 3d 35 20 3f 20 61 70 4e 65 77 5b 34  New>=5 ? apNew[4
370d0 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65  ]->pgno : 0, nNe
370e0 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20  w>=5 ? szNew[4] 
370f0 3a 20 30 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  : 0));..  assert
37100 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
37110 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
37120 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  t->pDbPage) );. 
37130 20 70 75 74 34 62 79 74 65 28 70 52 69 67 68 74   put4byte(pRight
37140 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d  , apNew[nNew-1]-
37150 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20  >pgno);..  /*.  
37160 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69  ** Evenly distri
37170 62 75 74 65 20 74 68 65 20 64 61 74 61 20 69 6e  bute the data in
37180 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73   apCell[] across
37190 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a   the new pages..
371a0 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69    ** Insert divi
371b0 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70  der cells into p
371c0 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73  Parent as necess
371d0 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20  ary..  */.  j = 
371e0 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
371f0 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
37200 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20  /* Assemble the 
37210 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65  new sibling page
37220 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65  . */.    MemPage
37230 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69   *pNew = apNew[i
37240 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  ];.    assert( j
37250 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
37260 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c    zeroPage(pNew,
37270 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 20   pageFlags);.   
37280 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e   assemblePage(pN
37290 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c  ew, cntNew[i]-j,
372a0 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a   &apCell[j], &sz
372b0 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73  Cell[j]);.    as
372c0 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c  sert( pNew->nCel
372d0 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20  l>0 || (nNew==1 
372e0 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29  && cntNew[0]==0)
372f0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
37300 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  pNew->nOverflow=
37310 3d 30 20 29 3b 0a 0a 20 20 20 20 6a 20 3d 20 63  =0 );..    j = c
37320 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f  ntNew[i];..    /
37330 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  * If the sibling
37340 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20   page assembled 
37350 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20 74 68  above was not th
37360 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  e right-most sib
37370 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73  ling,.    ** ins
37380 65 72 74 20 61 20 64 69 76 69 64 65 72 20 63 65  ert a divider ce
37390 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ll into the pare
373a0 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  nt page..    */.
373b0 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4e      assert( i<nN
373c0 65 77 2d 31 20 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c  ew-1 || j==nCell
373d0 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3c 6e 43   );.    if( j<nC
373e0 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20  ell ){.      u8 
373f0 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38  *pCell;.      u8
37400 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69   *pTemp;.      i
37410 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73  nt sz;..      as
37420 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c  sert( j<nMaxCell
37430 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  s );.      pCell
37440 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20   = apCell[j];.  
37450 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b      sz = szCell[
37460 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74  j] + leafCorrect
37470 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70  ion;.      pTemp
37480 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65 5b 69   = &aOvflSpace[i
37490 4f 76 66 6c 53 70 61 63 65 5d 3b 0a 20 20 20 20  OvflSpace];.    
374a0 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61    if( !pNew->lea
374b0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  f ){.        mem
374c0 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61  cpy(&pNew->aData
374d0 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a  [8], pCell, 4);.
374e0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
374f0 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20  leafData ){.    
37500 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 72      /* If the tr
37510 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64 61 74  ee is a leaf-dat
37520 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20  a tree, and the 
37530 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c 65 61  siblings are lea
37540 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a  ves, .        **
37550 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
37560 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  o divider cell i
37570 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74  n apCell[]. Inst
37580 65 61 64 2c 20 74 68 65 20 64 69 76 69 64 65 72  ead, the divider
37590 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c   .        ** cel
375a0 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68  l consists of th
375b0 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 66 6f  e integer key fo
375c0 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  r the right-most
375d0 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20   cell of .      
375e0 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67    ** the sibling
375f0 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20  -page assembled 
37600 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20  above only..    
37610 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 43      */.        C
37620 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
37630 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20        j--;.     
37640 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
37650 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c  lPtr(pNew, apCel
37660 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  l[j], &info);.  
37670 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
37680 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 73 7a 20  emp;.        sz 
37690 3d 20 34 20 2b 20 70 75 74 56 61 72 69 6e 74 28  = 4 + putVarint(
376a0 26 70 43 65 6c 6c 5b 34 5d 2c 20 69 6e 66 6f 2e  &pCell[4], info.
376b0 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 70  nKey);.        p
376c0 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  Temp = 0;.      
376d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
376e0 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20  Cell -= 4;.     
376f0 20 20 20 2f 2a 20 4f 62 73 63 75 72 65 20 63 61     /* Obscure ca
37700 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d  se for non-leaf-
37710 64 61 74 61 20 74 72 65 65 73 3a 20 49 66 20 74  data trees: If t
37720 68 65 20 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c  he cell at pCell
37730 20 77 61 73 0a 20 20 20 20 20 20 20 20 2a 2a 20   was.        ** 
37740 70 72 65 76 69 6f 75 73 6c 79 20 73 74 6f 72 65  previously store
37750 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65  d on a leaf node
37760 2c 20 61 6e 64 20 69 74 73 20 72 65 70 6f 72 74  , and its report
37770 65 64 20 73 69 7a 65 20 77 61 73 20 34 0a 20 20  ed size was 4.  
37780 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 2c 20        ** bytes, 
37790 74 68 65 6e 20 69 74 20 6d 61 79 20 61 63 74 75  then it may actu
377a0 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72 20  ally be smaller 
377b0 74 68 61 6e 20 74 68 69 73 20 0a 20 20 20 20 20  than this .     
377c0 20 20 20 2a 2a 20 28 73 65 65 20 62 74 72 65 65     ** (see btree
377d0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20  ParseCellPtr(), 
377e0 34 20 62 79 74 65 73 20 69 73 20 74 68 65 20 6d  4 bytes is the m
377f0 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20  inimum size of. 
37800 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20 63 65         ** any ce
37810 6c 6c 29 2e 20 42 75 74 20 69 74 20 69 73 20 69  ll). But it is i
37820 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 61 73 73  mportant to pass
37830 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 69 7a   the correct siz
37840 65 20 74 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a  e to .        **
37850 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20 73   insertCell(), s
37860 6f 20 72 65 70 61 72 73 65 20 74 68 65 20 63 65  o reparse the ce
37870 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20  ll now..        
37880 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f  **.        ** No
37890 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6e  te that this can
378a0 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 69 6e   never happen in
378b0 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 20   an SQLite data 
378c0 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20  file, as all.   
378d0 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72       ** cells ar
378e0 65 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74  e at least 4 byt
378f0 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70 70  es. It only happ
37900 65 6e 73 20 69 6e 20 62 2d 74 72 65 65 73 20 75  ens in b-trees u
37910 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  sed.        ** t
37920 6f 20 65 76 61 6c 75 61 74 65 20 22 49 4e 20 28  o evaluate "IN (
37930 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64  SELECT ...)" and
37940 20 73 69 6d 69 6c 61 72 20 63 6c 61 75 73 65 73   similar clauses
37950 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
37960 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b       if( szCell[
37970 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20  j]==4 ){.       
37980 20 20 20 61 73 73 65 72 74 28 6c 65 61 66 43 6f     assert(leafCo
37990 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20  rrection==4);.  
379a0 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c          sz = cel
379b0 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74  lSizePtr(pParent
379c0 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20  , pCell);.      
379d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
379e0 20 20 69 4f 76 66 6c 53 70 61 63 65 20 2b 3d 20    iOvflSpace += 
379f0 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  sz;.      assert
37a00 28 20 73 7a 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f  ( sz<=pBt->maxLo
37a10 63 61 6c 2b 32 33 20 29 3b 0a 20 20 20 20 20 20  cal+23 );.      
37a20 61 73 73 65 72 74 28 20 69 4f 76 66 6c 53 70 61  assert( iOvflSpa
37a30 63 65 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  ce <= (int)pBt->
37a40 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
37a50 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61    insertCell(pPa
37a60 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43 65  rent, nxDiv, pCe
37a70 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20 70  ll, sz, pTemp, p
37a80 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b  New->pgno, &rc);
37a90 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
37aa0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
37ab0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
37ac0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
37ad0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
37ae0 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e  teable(pParent->
37af0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
37b00 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78     j++;.      nx
37b10 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  Div++;.    }.  }
37b20 0a 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43  .  assert( j==nC
37b30 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
37b40 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73   nOld>0 );.  ass
37b50 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20  ert( nNew>0 );. 
37b60 20 69 66 28 20 28 70 61 67 65 46 6c 61 67 73 20   if( (pageFlags 
37b70 26 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29  & PTF_LEAF)==0 )
37b80 7b 0a 20 20 20 20 75 38 20 2a 7a 43 68 69 6c 64  {.    u8 *zChild
37b90 20 3d 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d   = &apCopy[nOld-
37ba0 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 3b 0a 20 20  1]->aData[8];.  
37bb0 20 20 6d 65 6d 63 70 79 28 26 61 70 4e 65 77 5b    memcpy(&apNew[
37bc0 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38  nNew-1]->aData[8
37bd0 5d 2c 20 7a 43 68 69 6c 64 2c 20 34 29 3b 0a 20  ], zChild, 4);. 
37be0 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 6f 6f 74   }..  if( isRoot
37bf0 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65   && pParent->nCe
37c00 6c 6c 3d 3d 30 20 26 26 20 70 50 61 72 65 6e 74  ll==0 && pParent
37c10 2d 3e 68 64 72 4f 66 66 73 65 74 3c 3d 61 70 4e  ->hdrOffset<=apN
37c20 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 29 7b 0a  ew[0]->nFree ){.
37c30 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20      /* The root 
37c40 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72  page of the b-tr
37c50 65 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20  ee now contains 
37c60 6e 6f 20 63 65 6c 6c 73 2e 20 54 68 65 20 6f 6e  no cells. The on
37c70 6c 79 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 2a  ly sibling.    *
37c80 2a 20 70 61 67 65 20 69 73 20 74 68 65 20 72 69  * page is the ri
37c90 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 74 68 65  ght-child of the
37ca0 20 70 61 72 65 6e 74 2e 20 43 6f 70 79 20 74 68   parent. Copy th
37cb0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
37cc0 65 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 20 70  e.    ** child p
37cd0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 72  age into the par
37ce0 65 6e 74 2c 20 64 65 63 72 65 61 73 69 6e 67 20  ent, decreasing 
37cf0 74 68 65 20 6f 76 65 72 61 6c 6c 20 68 65 69 67  the overall heig
37d00 68 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ht of the.    **
37d10 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
37d20 65 20 62 79 20 6f 6e 65 2e 20 54 68 69 73 20 69  e by one. This i
37d30 73 20 64 65 73 63 72 69 62 65 64 20 61 73 20 74  s described as t
37d40 68 65 20 22 62 61 6c 61 6e 63 65 2d 73 68 61 6c  he "balance-shal
37d50 6c 6f 77 65 72 22 0a 20 20 20 20 2a 2a 20 73 75  lower".    ** su
37d60 62 2d 61 6c 67 6f 72 69 74 68 6d 20 69 6e 20 73  b-algorithm in s
37d70 6f 6d 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  ome documentatio
37d80 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  n..    **.    **
37d90 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
37da0 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
37db0 61 73 65 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f  ase, the call to
37dc0 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74   copyNodeContent
37dd0 28 29 20 0a 20 20 20 20 2a 2a 20 73 65 74 73 20  () .    ** sets 
37de0 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  all pointer-map 
37df0 65 6e 74 72 69 65 73 20 63 6f 72 72 65 73 70 6f  entries correspo
37e00 6e 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73  nding to databas
37e10 65 20 69 6d 61 67 65 20 70 61 67 65 73 20 0a 20  e image pages . 
37e20 20 20 20 2a 2a 20 66 6f 72 20 77 68 69 63 68 20     ** for which 
37e30 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 73  the pointer is s
37e40 74 6f 72 65 64 20 77 69 74 68 69 6e 20 74 68 65  tored within the
37e50 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 63   content being c
37e60 6f 70 69 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  opied..    **.  
37e70 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20    ** The second 
37e80 61 73 73 65 72 74 20 62 65 6c 6f 77 20 76 65 72  assert below ver
37e90 69 66 69 65 73 20 74 68 61 74 20 74 68 65 20 63  ifies that the c
37ea0 68 69 6c 64 20 70 61 67 65 20 69 73 20 64 65 66  hild page is def
37eb0 72 61 67 6d 65 6e 74 65 64 0a 20 20 20 20 2a 2a  ragmented.    **
37ec0 20 28 69 74 20 6d 75 73 74 20 62 65 2c 20 61 73   (it must be, as
37ed0 20 69 74 20 77 61 73 20 6a 75 73 74 20 72 65 63   it was just rec
37ee0 6f 6e 73 74 72 75 63 74 65 64 20 75 73 69 6e 67  onstructed using
37ef0 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 29 29   assemblePage())
37f00 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73  . This.    ** is
37f10 20 69 6d 70 6f 72 74 61 6e 74 20 69 66 20 74 68   important if th
37f20 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 68 61  e parent page ha
37f30 70 70 65 6e 73 20 74 6f 20 62 65 20 70 61 67 65  ppens to be page
37f40 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61   1 of the databa
37f50 73 65 0a 20 20 20 20 2a 2a 20 69 6d 61 67 65 2e  se.    ** image.
37f60 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
37f70 20 6e 4e 65 77 3d 3d 31 20 29 3b 0a 20 20 20 20   nNew==1 );.    
37f80 61 73 73 65 72 74 28 20 61 70 4e 65 77 5b 30 5d  assert( apNew[0]
37f90 2d 3e 6e 46 72 65 65 20 3d 3d 20 0a 20 20 20 20  ->nFree == .    
37fa0 20 20 20 20 28 67 65 74 32 62 79 74 65 28 26 61      (get2byte(&a
37fb0 70 4e 65 77 5b 30 5d 2d 3e 61 44 61 74 61 5b 35  pNew[0]->aData[5
37fc0 5d 29 2d 61 70 4e 65 77 5b 30 5d 2d 3e 63 65 6c  ])-apNew[0]->cel
37fd0 6c 4f 66 66 73 65 74 2d 61 70 4e 65 77 5b 30 5d  lOffset-apNew[0]
37fe0 2d 3e 6e 43 65 6c 6c 2a 32 29 20 0a 20 20 20 20  ->nCell*2) .    
37ff0 29 3b 0a 20 20 20 20 63 6f 70 79 4e 6f 64 65 43  );.    copyNodeC
38000 6f 6e 74 65 6e 74 28 61 70 4e 65 77 5b 30 5d 2c  ontent(apNew[0],
38010 20 70 50 61 72 65 6e 74 2c 20 26 72 63 29 3b 0a   pParent, &rc);.
38020 20 20 20 20 66 72 65 65 50 61 67 65 28 61 70 4e      freePage(apN
38030 65 77 5b 30 5d 2c 20 26 72 63 29 3b 0a 20 20 7d  ew[0], &rc);.  }
38040 65 6c 73 65 20 69 66 28 20 49 53 41 55 54 4f 56  else if( ISAUTOV
38050 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 2f 2a 20  ACUUM ){.    /* 
38060 46 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  Fix the pointer-
38070 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
38080 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73 20 74 68  all the cells th
38090 61 74 20 77 65 72 65 20 73 68 69 66 74 65 64 20  at were shifted 
380a0 61 72 6f 75 6e 64 2e 20 0a 20 20 20 20 2a 2a 20  around. .    ** 
380b0 54 68 65 72 65 20 61 72 65 20 73 65 76 65 72 61  There are severa
380c0 6c 20 64 69 66 66 65 72 65 6e 74 20 74 79 70 65  l different type
380d0 73 20 6f 66 20 70 6f 69 6e 74 65 72 2d 6d 61 70  s of pointer-map
380e0 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6e 65   entries that ne
380f0 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ed to.    ** be 
38100 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74 68  dealt with by th
38110 69 73 20 72 6f 75 74 69 6e 65 2e 20 53 6f 6d 65  is routine. Some
38120 20 6f 66 20 74 68 65 73 65 20 68 61 76 65 20 62   of these have b
38130 65 65 6e 20 73 65 74 20 61 6c 72 65 61 64 79 2c  een set already,
38140 20 62 75 74 0a 20 20 20 20 2a 2a 20 6d 61 6e 79   but.    ** many
38150 20 68 61 76 65 20 6e 6f 74 2e 20 54 68 65 20 66   have not. The f
38160 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20 73 75  ollowing is a su
38170 6d 6d 61 72 79 3a 0a 20 20 20 20 2a 2a 0a 20 20  mmary:.    **.  
38180 20 20 2a 2a 20 20 20 31 29 20 54 68 65 20 65 6e    **   1) The en
38190 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64  tries associated
381a0 20 77 69 74 68 20 6e 65 77 20 73 69 62 6c 69 6e   with new siblin
381b0 67 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72  g pages that wer
381c0 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 20 20 20  e not.    **    
381d0 20 20 73 69 62 6c 69 6e 67 73 20 77 68 65 6e 20    siblings when 
381e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61  this function wa
381f0 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 73 65 20  s called. These 
38200 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 20  have already.   
38210 20 2a 2a 20 20 20 20 20 20 62 65 65 6e 20 73 65   **      been se
38220 74 2e 20 57 65 20 64 6f 6e 27 74 20 6e 65 65 64  t. We don't need
38230 20 74 6f 20 77 6f 72 72 79 20 61 62 6f 75 74 20   to worry about 
38240 6f 6c 64 20 73 69 62 6c 69 6e 67 73 20 74 68 61  old siblings tha
38250 74 20 77 65 72 65 0a 20 20 20 20 2a 2a 20 20 20  t were.    **   
38260 20 20 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20     moved to the 
38270 66 72 65 65 2d 6c 69 73 74 20 2d 20 74 68 65 20  free-list - the 
38280 66 72 65 65 50 61 67 65 28 29 20 63 6f 64 65 20  freePage() code 
38290 68 61 73 20 74 61 6b 65 6e 20 63 61 72 65 0a 20  has taken care. 
382a0 20 20 20 2a 2a 20 20 20 20 20 20 6f 66 20 74 68     **      of th
382b0 6f 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ose..    **.    
382c0 2a 2a 20 20 20 32 29 20 54 68 65 20 70 6f 69 6e  **   2) The poin
382d0 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
382e0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
382f0 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
38300 6f 77 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 70  ow.    **      p
38310 61 67 65 20 69 6e 20 61 6e 79 20 6f 76 65 72 66  age in any overf
38320 6c 6f 77 20 63 68 61 69 6e 73 20 75 73 65 64 20  low chains used 
38330 62 79 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  by new divider c
38340 65 6c 6c 73 2e 20 54 68 65 73 65 20 0a 20 20 20  ells. These .   
38350 20 2a 2a 20 20 20 20 20 20 68 61 76 65 20 61 6c   **      have al
38360 73 6f 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  so already been 
38370 74 61 6b 65 6e 20 63 61 72 65 20 6f 66 20 62 79  taken care of by
38380 20 74 68 65 20 69 6e 73 65 72 74 43 65 6c 6c 28   the insertCell(
38390 29 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20  ) code..    **. 
383a0 20 20 20 2a 2a 20 20 20 33 29 20 49 66 20 74 68     **   3) If th
383b0 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
383c0 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20  are not leaves, 
383d0 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70  then the child p
383e0 61 67 65 73 20 6f 66 0a 20 20 20 20 2a 2a 20 20  ages of.    **  
383f0 20 20 20 20 63 65 6c 6c 73 20 73 74 6f 72 65 64      cells stored
38400 20 6f 6e 20 74 68 65 20 73 69 62 6c 69 6e 67 20   on the sibling 
38410 70 61 67 65 73 20 6d 61 79 20 6e 65 65 64 20 74  pages may need t
38420 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20  o be updated..  
38430 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 34 29    **.    **   4)
38440 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20   If the sibling 
38450 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 69 6e  pages are not in
38460 74 65 72 6e 61 6c 20 69 6e 74 6b 65 7