/ Hex Artifact Content
Login

Artifact 32b552d5388fa27adf99b9d7e09f4746a08da4e7:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a  xffff)+1)../*.**
05c0: 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20 61   Values passed a
05d0: 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d 65  s the 5th argume
05e0: 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42 74  nt to allocateBt
05f0: 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64 65  reePage().*/.#de
0600: 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  fine BTALLOC_ANY
0610: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 2f     0           /
0620: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20 70  * Allocate any p
0630: 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 42  age */.#define B
0640: 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20 20  TALLOC_EXACT 1  
0650: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
0660: 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65 20  cate exact page 
0670: 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 23  if possible */.#
0680: 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 4c  define BTALLOC_L
0690: 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20  E    2          
06a0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79   /* Allocate any
06b0: 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61 72   page <= the par
06c0: 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ameter */../*.**
06d0: 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69 74   Macro IfNotOmit
06e0: 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28 78  AV(x) returns (x
06f0: 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ) if SQLITE_OMIT
0700: 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 6e  _AUTOVACUUM is n
0710: 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c 20  ot .** defined, 
0720: 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20 46  or 0 if it is. F
0730: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
0740: 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d 20  *   bIncrVacuum 
0750: 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  = IfNotOmitAV(pB
0760: 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61 63  tShared->incrVac
0770: 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65 66  uum);.*/.#ifndef
0780: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
0790: 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65 20  OVACUUM.#define 
07a0: 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70 72  IfNotOmitAV(expr
07b0: 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a 23  ) (expr).#else.#
07c0: 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69 74  define IfNotOmit
07d0: 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64 69  AV(expr) 0.#endi
07e0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
07f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0800: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74  CHE./*.** A list
0810: 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62 6a   of BtShared obj
0820: 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6c  ects that are el
0830: 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74 69  igible for parti
0840: 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 73  cipation.** in s
0850: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
0860: 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73 20  is variable has 
0870: 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69 6e  file scope durin
0880: 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2c  g normal builds,
0890: 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73 74  .** but the test
08a0: 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20 74   harness needs t
08b0: 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20 77  o access it so w
08c0: 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61 6c  e make it global
08d0: 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62 75   for .** test bu
08e0: 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63 65  ilds..**.** Acce
08f0: 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69 61  ss to this varia
0900: 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65 64  ble is protected
0910: 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45 58   by SQLITE_MUTEX
0920: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e 0a  _STATIC_MASTER..
0930: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
0940: 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20 2a  _TEST.BtShared *
0950: 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74  SQLITE_WSD sqlit
0960: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
0970: 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61  t = 0;.#else.sta
0980: 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53 51  tic BtShared *SQ
0990: 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65 33  LITE_WSD sqlite3
09a0: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20  SharedCacheList 
09b0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64  = 0;.#endif.#end
09c0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
09d0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
09e0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
09f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0a00: 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  CHE./*.** Enable
0a10: 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
0a20: 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e 64  shared pager and
0a30: 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65 73   schema features
0a40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
0a50: 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66 65  tine has no effe
0a60: 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20 64  ct on existing d
0a70: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
0a80: 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72  ons..** The shar
0a90: 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e 67  ed cache setting
0aa0: 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66 75   effects only fu
0ab0: 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  ture calls to.**
0ac0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2c   sqlite3_open(),
0ad0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
0ae0: 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70  ), or sqlite3_op
0af0: 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20  en_v2()..*/.int 
0b00: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
0b10: 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74 20  hared_cache(int 
0b20: 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69 74  enable){.  sqlit
0b30: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
0b40: 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
0b50: 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65  d = enable;.  re
0b60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0b70: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66 64  }.#endif....#ifd
0b80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
0b90: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
0ba0: 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  .  ** The functi
0bb0: 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64 43  ons querySharedC
0bc0: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 2c  acheTableLock(),
0bd0: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
0be0: 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a 2a  ableLock(),.  **
0bf0: 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68 61   and clearAllSha
0c00: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c10: 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75  ks().  ** manipu
0c20: 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  late entries in 
0c30: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
0c40: 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75  ck linked list u
0c50: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a  sed to store.  *
0c60: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
0c70: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73  able level locks
0c80: 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79  . If the library
0c90: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
0ca0: 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65  h the.  ** share
0cb0: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
0cc0: 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
0cd0: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
0ce0: 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20  r one user.  ** 
0cf0: 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64  of each BtShared
0d00: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73   structure and s
0d10: 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69  o this locking i
0d20: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
0d30: 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65   .  ** So define
0d40: 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65   the lock relate
0d50: 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e  d functions as n
0d60: 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64  o-ops..  */.  #d
0d70: 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72 65  efine queryShare
0d80: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0d90: 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b  a,b,c) SQLITE_OK
0da0: 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53 68  .  #define setSh
0db0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0dc0: 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45  ck(a,b,c) SQLITE
0dd0: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63 6c  _OK.  #define cl
0de0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0df0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e00: 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72 61   #define downgra
0e10: 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
0e20: 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20 20  TableLocks(a).  
0e30: 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72 65  #define hasShare
0e40: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0e50: 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64 65  a,b,c,d) 1.  #de
0e60: 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e 66  fine hasReadConf
0e70: 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23 65  licts(a, b) 0.#e
0e80: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0e90: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0ea0: 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20 53  _CACHE..#ifdef S
0eb0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
0ec0: 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  *** This functio
0ed0: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
0ee0: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73  s part of an ass
0ef0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2e  ert() statement.
0f00: 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b   ***.**.** Check
0f10: 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72 65   to see if pBtre
0f20: 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71 75  e holds the requ
0f30: 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72 65  ired locks to re
0f40: 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74  ad or write to t
0f50: 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69 74  he .** table wit
0f60: 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f  h root page iRoo
0f70: 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69 66  t.   Return 1 if
0f80: 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20 69   it does and 0 i
0f90: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  f not..**.** For
0fa0: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 77   example, when w
0fb0: 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c  riting to a tabl
0fc0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
0fd0: 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20 42   iRoot via .** B
0fe0: 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  tree connection 
0ff0: 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  pBtree:.**.**   
1000: 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
1010: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1020: 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c 20  (pBtree, iRoot, 
1030: 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 29  0, WRITE_LOCK) )
1040: 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72 69  ;.**.** When wri
1050: 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78  ting to an index
1060: 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69 6e   that resides in
1070: 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74 61   a sharable data
1080: 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63 61  base, the .** ca
1090: 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65  ller should have
10a0: 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64 20   first obtained 
10b0: 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69 6e  a lock specifyin
10c0: 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  g the root page 
10d0: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73  of.** the corres
10e0: 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20 54  ponding table. T
10f0: 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67 73  his makes things
1100: 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d 70   a bit more comp
1110: 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20 74  licated,.** as t
1120: 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61 74  his module treat
1130: 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73 20  s each table as 
1140: 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75 63  a separate struc
1150: 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d 69  ture. To determi
1160: 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  ne.** the table 
1170: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
1180: 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
1190: 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a 2a   written, this.*
11a0: 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74  * function has t
11b0: 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67 68  o search through
11c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
11d0: 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  hema..**.** Inst
11e0: 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f 6e  ead of a lock on
11f0: 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
1200: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1210: 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c 65  iRoot, the calle
1220: 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61 20  r may.** hold a 
1230: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
1240: 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20 28  e schema table (
1250: 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54 68  root page 1). Th
1260: 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61 63  is is also.** ac
1270: 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ceptable..*/.sta
1280: 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72 65  tic int hasShare
1290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
12a0: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
12b0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e  ,         /* Han
12c0: 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68 6f  dle that must ho
12d0: 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67 6e  ld lock */.  Pgn
12e0: 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20  o iRoot,        
12f0: 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
1300: 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20   of b-tree */.  
1310: 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20 20  int isIndex,    
1320: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1330: 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20 72  f iRoot is the r
1340: 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  oot of an index 
1350: 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  b-tree */.  int 
1360: 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20 20  eLockType       
1370: 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6c     /* Required l
1380: 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f 4c  ock type (READ_L
1390: 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43  OCK or WRITE_LOC
13a0: 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65 6d  K) */.){.  Schem
13b0: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53 63  a *pSchema = (Sc
13c0: 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e 70  hema *)pBtree->p
13d0: 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 50  Bt->pSchema;.  P
13e0: 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20 20  gno iTab = 0;.  
13f0: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a  BtLock *pLock;..
1400: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
1410: 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68 61  abase is not sha
1420: 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74 68  reable, or if th
1430: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1440: 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61 73  ing.  ** and has
1450: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
1460: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20  itted flag set, 
1470: 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73 20  then no lock is 
1480: 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a 20  required. .  ** 
1490: 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d 65  Return true imme
14a0: 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  diately..  */.  
14b0: 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68 61  if( (pBtree->sha
14c0: 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c 20  rable==0).   || 
14d0: 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41 44  (eLockType==READ
14e0: 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65 65  _LOCK && (pBtree
14f0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1500: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1510: 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20 20  tted)).  ){.    
1520: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
1530: 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65 6e   /* If the clien
1540: 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f 72  t is reading  or
1550: 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64 65   writing an inde
1560: 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61  x and the schema
1570: 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f 61   is.  ** not loa
1580: 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ded, then it is 
1590: 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74 6f  too difficult to
15a0: 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b 20   actually check 
15b0: 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20 74  to see if.  ** t
15c0: 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 73  he correct locks
15d0: 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20 64   are held.  So d
15e0: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20 6a  o not bother - j
15f0: 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e  ust return true.
1600: 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65 20  .  ** This case 
1610: 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75 70  does not come up
1620: 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79 68   very often anyh
1630: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ow..  */.  if( i
1640: 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63 68  sIndex && (!pSch
1650: 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61 2d  ema || (pSchema-
1660: 3e 66 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61  >flags&DB_Schema
1670: 4c 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20  Loaded)==0) ){. 
1680: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1690: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
16a0: 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  t the root-page 
16b0: 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68  that the lock sh
16c0: 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e  ould be held on.
16d0: 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20   For table.  ** 
16e0: 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73  b-trees, this is
16f0: 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70   just the root p
1700: 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
1710: 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a  e being read or.
1720: 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f    ** written. Fo
1730: 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c  r index b-trees,
1740: 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
1750: 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f  page of the asso
1760: 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c  ciated.  ** tabl
1770: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49  e.  */.  if( isI
1780: 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68  ndex ){.    Hash
1790: 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72  Elem *p;.    for
17a0: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
17b0: 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78  st(&pSchema->idx
17c0: 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69  Hash); p; p=sqli
17d0: 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a  teHashNext(p)){.
17e0: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
17f0: 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c  x = (Index *)sql
1800: 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a  iteHashData(p);.
1810: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
1820: 74 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74  tnum==(int)iRoot
1830: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 61 62   ){.        iTab
1840: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
1850: 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  >tnum;.      }. 
1860: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1870: 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a    iTab = iRoot;.
1880: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68    }..  /* Search
1890: 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65   for the require
18a0: 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61  d lock. Either a
18b0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72   write-lock on r
18c0: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61  oot-page iTab, a
18d0: 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63   .  ** write-loc
18e0: 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20  k on the schema 
18f0: 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68  table, or (if th
1900: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1910: 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64  ing) a.  ** read
1920: 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69  -lock on iTab wi
1930: 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75  ll suffice. Retu
1940: 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74  rn 1 if any of t
1950: 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20  hese are found. 
1960: 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d   */.  for(pLock=
1970: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f  pBtree->pBt->pLo
1980: 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  ck; pLock; pLock
1990: 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a  =pLock->pNext){.
19a0: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70      if( pLock->p
19b0: 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20  Btree==pBtree . 
19c0: 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69      && (pLock->i
19d0: 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28  Table==iTab || (
19e0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pLock->eLock==WR
19f0: 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63  ITE_LOCK && pLoc
1a00: 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20  k->iTable==1)). 
1a10: 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c      && pLock->eL
1a20: 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a  ock>=eLockType .
1a30: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1a40: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1a50: 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f  ..  /* Failed to
1a60: 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72   find the requir
1a70: 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65  ed lock. */.  re
1a80: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1a90: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
1aa0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
1ab0: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a  TE_DEBUG./*.****
1ac0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
1ad0: 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61  ay be used as pa
1ae0: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  rt of assert() s
1af0: 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20  tatements only. 
1b00: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ****.**.** Retur
1b10: 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75  n true if it wou
1b20: 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f  ld be illegal fo
1b30: 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74  r pBtree to writ
1b40: 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61  e into the.** ta
1b50: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f  ble or index roo
1b60: 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63  ted at iRoot bec
1b70: 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65  ause other share
1b80: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  d connections ar
1b90: 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75  e.** simultaneou
1ba0: 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74  sly reading that
1bb0: 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69   same table or i
1bc0: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ndex..**.** It i
1bd0: 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42  s illegal for pB
1be0: 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66  tree to write if
1bf0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65   some other Btre
1c00: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  e object that.**
1c10: 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65   shares the same
1c20: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
1c30: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65   is currently re
1c40: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1c50: 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61  .** the iRoot ta
1c60: 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66  ble.  Except, if
1c70: 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65   the other Btree
1c80: 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a   object has the.
1c90: 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  ** read-uncommit
1ca0: 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68  ted flag set, th
1cb0: 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20  en it is OK for 
1cc0: 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74  the other object
1cd0: 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65   to.** have a re
1ce0: 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  ad cursor..**.**
1cf0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65   For example, be
1d00: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
1d10: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1d20: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a  table or index.*
1d30: 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  * rooted at page
1d40: 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75   iRoot, one shou
1d50: 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20  ld call:.**.**  
1d60: 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65    assert( !hasRe
1d70: 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72  adConflicts(pBtr
1d80: 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f  ee, iRoot) );.*/
1d90: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52  .static int hasR
1da0: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72  eadConflicts(Btr
1db0: 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f  ee *pBtree, Pgno
1dc0: 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72   iRoot){.  BtCur
1dd0: 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  sor *p;.  for(p=
1de0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
1df0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
1e00: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  ext){.    if( p-
1e10: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
1e20: 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74   .     && p->pBt
1e30: 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20  ree!=pBtree.    
1e40: 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65   && 0==(p->pBtre
1e50: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1e60: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1e70: 69 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20  itted).    ){.  
1e80: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1e90: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1ea0: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20   0;.}.#endif    
1eb0: 2f 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  /* #ifdef SQLITE
1ec0: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
1ed0: 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66   Query to see if
1ee0: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20   Btree handle p 
1ef0: 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63  may obtain a loc
1f00: 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20  k of type eLock 
1f10: 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f  .** (READ_LOCK o
1f20: 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e  r WRITE_LOCK) on
1f30: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
1f40: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20  root-page iTab. 
1f50: 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  Return.** SQLITE
1f60: 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  _OK if the lock 
1f70: 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20  may be obtained 
1f80: 28 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  (by calling.** s
1f90: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
1fa0: 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51  leLock()), or SQ
1fb0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e  LITE_LOCKED if n
1fc0: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
1fd0: 74 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  t querySharedCac
1fe0: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65  heTableLock(Btre
1ff0: 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c  e *p, Pgno iTab,
2000: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2010: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2020: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2030: 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  pIter;..  assert
2040: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2050: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2060: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2070: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  READ_LOCK || eLo
2080: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  ck==WRITE_LOCK )
2090: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
20a0: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
20b0: 28 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  ( !(p->db->flags
20c0: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
20d0: 6d 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d  mmitted)||eLock=
20e0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61  =WRITE_LOCK||iTa
20f0: 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  b==1 );.  .  /* 
2100: 49 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  If requesting a 
2110: 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e  write-lock, then
2120: 20 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20   the Btree must 
2130: 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
2140: 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  te.  ** transact
2150: 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ion on this file
2160: 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79  . And, obviously
2170: 2c 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65  , for this to be
2180: 20 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20   so there .  ** 
2190: 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20  must be an open 
21a0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
21b0: 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74  n on the file it
21c0: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  self..  */.  ass
21d0: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
21e0: 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74  _LOCK || (p==pBt
21f0: 2d 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e  ->pWriter && p->
2200: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
2210: 52 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72  RITE) );.  asser
2220: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2230: 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  OCK || pBt->inTr
2240: 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
2250: 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f  _WRITE );.  .  /
2260: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2270: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
2280: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73   shared-cache is
2290: 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   not enabled */.
22a0: 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
22b0: 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  le ){.    return
22c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
22d0: 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74  .  /* If some ot
22e0: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  her connection i
22f0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63  s holding an exc
2300: 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65  lusive lock, the
2310: 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20  .  ** requested 
2320: 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20  lock may not be 
2330: 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20  obtained..  */. 
2340: 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65   if( pBt->pWrite
2350: 72 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74  r!=p && (pBt->bt
2360: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43  sFlags & BTS_EXC
2370: 4c 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20  LUSIVE)!=0 ){.  
2380: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2390: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
23a0: 2c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  , pBt->pWriter->
23b0: 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  db);.    return 
23c0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
23d0: 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a  AREDCACHE;.  }..
23e0: 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
23f0: 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
2400: 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
2410: 74 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  t){.    /* The c
2420: 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d  ondition (pIter-
2430: 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69  >eLock!=eLock) i
2440: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
2450: 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20  if(...) .    ** 
2460: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73  statement is a s
2470: 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66  implification of
2480: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
2490: 20 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f    (eLock==WRITE_
24a0: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
24b0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
24c0: 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
24d0: 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68  since we know th
24e0: 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49  at if eLock==WRI
24f0: 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f  TE_LOCK, then no
2500: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
2510: 6e 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c  n.    ** may hol
2520: 64 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f  d a WRITE_LOCK o
2530: 6e 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74  n any table in t
2540: 68 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20  his file (since 
2550: 74 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a  there can.    **
2560: 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c   only be a singl
2570: 65 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a  e writer)..    *
2580: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  /.    assert( pI
2590: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44  ter->eLock==READ
25a0: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  _LOCK || pIter->
25b0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
25c0: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
25d0: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
25e0: 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72  K || pIter->pBtr
25f0: 65 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e  ee==p || pIter->
2600: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2610: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
2620: 2d 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70  ->pBtree!=p && p
2630: 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Iter->iTable==iT
2640: 61 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f  ab && pIter->eLo
2650: 63 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck!=eLock ){.   
2660: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
2670: 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
2680: 62 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  b, pIter->pBtree
2690: 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ->db);.      if(
26a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
26b0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  CK ){.        as
26c0: 73 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57  sert( p==pBt->pW
26d0: 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20  riter );.       
26e0: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
26f0: 3d 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20  = BTS_PENDING;. 
2700: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2710: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
2720: 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
2730: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2740: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
2750: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
2760: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2770: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
2780: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
2790: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64  D_CACHE./*.** Ad
27a0: 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  d a lock on the 
27b0: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
27c0: 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74  page iTable to t
27d0: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  he shared-btree 
27e0: 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65  used.** by Btree
27f0: 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d   handle p. Param
2800: 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20  eter eLock must 
2810: 62 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c  be either READ_L
2820: 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45  OCK or .** WRITE
2830: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  _LOCK..**.** Thi
2840: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
2850: 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
2860: 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68  :.**.**   (a) Th
2870: 65 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65  e specified Btre
2880: 65 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f  e object p is co
2890: 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61  nnected to a sha
28a0: 72 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64  rable.**       d
28b0: 61 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74  atabase (one wit
28c0: 68 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73  h the BtShared.s
28d0: 68 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74  harable flag set
28e0: 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28  ), and.**.**   (
28f0: 62 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65  b) No other Btre
2900: 65 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61  e objects hold a
2910: 20 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c   lock that confl
2920: 69 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69  icts.**       wi
2930: 74 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64  th the requested
2940: 20 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72   lock (i.e. quer
2950: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
2960: 65 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20  eLock() has.**  
2970: 20 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65       already bee
2980: 6e 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74  n called and ret
2990: 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29  urned SQLITE_OK)
29a0: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
29b0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
29c0: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64   the lock is add
29d0: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
29e0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a   SQLITE_NOMEM .*
29f0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
2a00: 20 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70   a malloc attemp
2a10: 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  t fails..*/.stat
2a20: 69 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64  ic int setShared
2a30: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42  CacheTableLock(B
2a40: 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54  tree *p, Pgno iT
2a50: 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b  able, u8 eLock){
2a60: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2a70: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
2a80: 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a  ock *pLock = 0;.
2a90: 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
2aa0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2ab0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
2ac0: 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
2ad0: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2ae0: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  OCK || eLock==WR
2af0: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ITE_LOCK );.  as
2b00: 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29  sert( p->db!=0 )
2b10: 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63  ;..  /* A connec
2b20: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65  tion with the re
2b30: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
2b40: 6c 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76  lag set will nev
2b50: 65 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f  er try to.  ** o
2b60: 62 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63  btain a read-loc
2b70: 6b 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e  k using this fun
2b80: 63 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20  ction. The only 
2b90: 72 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e  read-lock obtain
2ba0: 65 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e  ed.  ** by a con
2bb0: 6e 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d  nection in read-
2bc0: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65  uncommitted mode
2bd0: 20 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74   is on the sqlit
2be0: 65 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74  e_master .  ** t
2bf0: 61 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c  able, and that l
2c00: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
2c10: 69 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61  in BtreeBeginTra
2c20: 6e 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ns().  */.  asse
2c30: 72 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66  rt( 0==(p->db->f
2c40: 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64  lags&SQLITE_Read
2c50: 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20  Uncommitted) || 
2c60: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
2c70: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  K );..  /* This 
2c80: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
2c90: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f  only be called o
2ca0: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74  n a sharable b-t
2cb0: 72 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20  ree after it .  
2cc0: 2a 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65  ** has been dete
2cd0: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f  rmined that no o
2ce0: 74 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64  ther b-tree hold
2cf0: 73 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20  s a conflicting 
2d00: 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65  lock.  */.  asse
2d10: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
2d20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
2d30: 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61  ITE_OK==querySha
2d40: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2d50: 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f  k(p, iTable, eLo
2d60: 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72  ck) );..  /* Fir
2d70: 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69  st search the li
2d80: 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  st for an existi
2d90: 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20  ng lock on this 
2da0: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28  table. */.  for(
2db0: 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
2dc0: 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
2dd0: 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
2de0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61    if( pIter->iTa
2df0: 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
2e00: 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Iter->pBtree==p 
2e10: 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d  ){.      pLock =
2e20: 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72   pIter;.      br
2e30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
2e40: 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76    /* If the abov
2e50: 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74  e search did not
2e60: 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73   find a BtLock s
2e70: 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e  truct associatin
2e80: 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77  g Btree p.  ** w
2e90: 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65  ith table iTable
2ea0: 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61  , allocate one a
2eb0: 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20  nd link it into 
2ec0: 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  the list..  */. 
2ed0: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
2ee0: 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f     pLock = (BtLo
2ef0: 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  ck *)sqlite3Mall
2f00: 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
2f10: 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20  Lock));.    if( 
2f20: 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  !pLock ){.      
2f30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2f40: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
2f50: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Lock->iTable = i
2f60: 54 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b  Table;.    pLock
2f70: 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
2f80: 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d    pLock->pNext =
2f90: 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
2fa0: 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c   pBt->pLock = pL
2fb0: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ock;.  }..  /* S
2fc0: 65 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c  et the BtLock.eL
2fd0: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
2fe0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74  the maximum of t
2ff0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a  he current lock.
3000: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71    ** and the req
3010: 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69  uested lock. Thi
3020: 73 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69  s means if a wri
3030: 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65  te-lock was alre
3040: 61 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e  ady held.  ** an
3050: 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65  d a read-lock re
3060: 71 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27  quested, we don'
3070: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f  t incorrectly do
3080: 77 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b  wngrade the lock
3090: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
30a0: 20 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44   WRITE_LOCK>READ
30b0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65  _LOCK );.  if( e
30c0: 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  Lock>pLock->eLoc
30d0: 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  k ){.    pLock->
30e0: 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20  eLock = eLock;. 
30f0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
3100: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
3110: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
3120: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
3130: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3140: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3150: 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  HE./*.** Release
3160: 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c   all the table l
3170: 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61  ocks (locks obta
3180: 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74  ined via calls t
3190: 6f 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72  o.** the setShar
31a0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
31b0: 28 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65  () procedure) he
31c0: 6c 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65  ld by Btree obje
31d0: 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ct p..**.** This
31e0: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
31f0: 73 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68  s that Btree p h
3200: 61 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20  as an open read 
3210: 6f 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61  or write .** tra
3220: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20  nsaction. If it 
3230: 64 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74  does not, then t
3240: 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66  he BTS_PENDING f
3250: 6c 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e  lag.** may be in
3260: 63 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65  correctly cleare
3270: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
3280: 64 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64  d clearAllShared
3290: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
32a0: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
32b0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
32c0: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a  pBt;.  BtLock **
32d0: 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70  ppIter = &pBt->p
32e0: 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lock;..  assert(
32f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
3300: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
3310: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
3320: 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ble || 0==*ppIte
3330: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
3340: 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a  ->inTrans>0 );..
3350: 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72    while( *ppIter
3360: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
3370: 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b  pLock = *ppIter;
3380: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
3390: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
33a0: 53 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20  S_EXCLUSIVE)==0 
33b0: 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d  || pBt->pWriter=
33c0: 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29  =pLock->pBtree )
33d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
33e0: 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54  ock->pBtree->inT
33f0: 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f  rans>=pLock->eLo
3400: 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ck );.    if( pL
3410: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ock->pBtree==p )
3420: 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20  {.      *ppIter 
3430: 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLock->pNext;.
3440: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
3450: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c  ock->iTable!=1 |
3460: 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63  | pLock==&p->loc
3470: 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  k );.      if( p
3480: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20  Lock->iTable!=1 
3490: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
34a0: 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  e3_free(pLock);.
34b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
34c0: 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20  e{.      ppIter 
34d0: 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b  = &pLock->pNext;
34e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
34f0: 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46  sert( (pBt->btsF
3500: 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49  lags & BTS_PENDI
3510: 4e 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  NG)==0 || pBt->p
3520: 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20  Writer );.  if( 
3530: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20  pBt->pWriter==p 
3540: 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69  ){.    pBt->pWri
3550: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ter = 0;.    pBt
3560: 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28  ->btsFlags &= ~(
3570: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54  BTS_EXCLUSIVE|BT
3580: 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65  S_PENDING);.  }e
3590: 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72  lse if( pBt->nTr
35a0: 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a  ansaction==2 ){.
35b0: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
35c0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
35d0: 68 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63  hen Btree p is c
35e0: 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20  oncluding its . 
35f0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
3600: 6e 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72  n. If there curr
3610: 65 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77  ently exists a w
3620: 72 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20  riter, and p is 
3630: 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  not.    ** that 
3640: 77 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65  writer, then the
3650: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   number of locks
3660: 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
3670: 69 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a  ions other.    *
3680: 2a 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65  * than the write
3690: 72 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20  r must be about 
36a0: 74 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e  to drop to zero.
36b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20   In this case.  
36c0: 20 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53    ** set the BTS
36d0: 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f  _PENDING flag to
36e0: 20 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   0..    **.    *
36f0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
3700: 74 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72  t currently a wr
3710: 69 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50  iter, then BTS_P
3720: 45 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20  ENDING must.    
3730: 2a 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61  ** be zero alrea
3740: 64 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74  dy. So this next
3750: 20 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73   line is harmles
3760: 73 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a  s in that case..
3770: 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e      */.    pBt->
3780: 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
3790: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a  _PENDING;.  }.}.
37a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
37b0: 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c  tion changes all
37c0: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c   write-locks hel
37d0: 64 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74  d by Btree p int
37e0: 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f  o read-locks..*/
37f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77  .static void dow
3800: 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
3810: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3820: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
3830: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
3840: 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  Bt;.  if( pBt->p
3850: 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20  Writer==p ){.   
3860: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
3870: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3880: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3890: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
38a0: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
38b0: 45 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72  ENDING);.    for
38c0: 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63  (pLock=pBt->pLoc
38d0: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
38e0: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
38f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3900: 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  ck->eLock==READ_
3910: 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70  LOCK || pLock->p
3920: 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20  Btree==p );.    
3930: 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d    pLock->eLock =
3940: 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20   READ_LOCK;.    
3950: 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20  }.  }.}..#endif 
3960: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
3970: 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a  HARED_CACHE */..
3980: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
3990: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
39a0: 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72  *pPage);  /* For
39b0: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
39c0: 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73  /../*.***** This
39d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
39e0: 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72   inside of asser
39f0: 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a  t() only ****.**
3a00: 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  .** Verify that 
3a10: 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73  the cursor holds
3a20: 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74   the mutex on it
3a30: 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69  s BtShared.*/.#i
3a40: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
3a50: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72  G.static int cur
3a60: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74  sorHoldsMutex(Bt
3a70: 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65  Cursor *p){.  re
3a80: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
3a90: 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
3aa0: 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66  mutex);.}.#endif
3ab0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61  ../*.** Invalida
3ac0: 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
3ad0: 63 61 63 68 65 20 6f 66 20 74 68 65 20 63 75 72  cache of the cur
3ae0: 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  sor passed as th
3af0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
3b00: 2e 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72  ..** on the shar
3b10: 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75  ed btree structu
3b20: 72 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69  re pBt..*/.#defi
3b30: 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65  ne invalidateOve
3b40: 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
3b50: 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
3b60: 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f   &= ~BTCF_ValidO
3b70: 76 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61  vfl)../*.** Inva
3b80: 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66  lidate the overf
3b90: 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
3ba0: 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73  che for all curs
3bb0: 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e  ors opened.** on
3bc0: 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65   the shared btre
3bd0: 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e  e structure pBt.
3be0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3bf0: 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
3c00: 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61  rflowCache(BtSha
3c10: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43  red *pBt){.  BtC
3c20: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65  ursor *p;.  asse
3c30: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
3c40: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
3c50: 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  x) );.  for(p=pB
3c60: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
3c70: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
3c80: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
3c90: 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a  owCache(p);.  }.
3ca0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
3cb0: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
3cc0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
3cd0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65  ion is called be
3ce0: 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74  fore modifying t
3cf0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  he contents of a
3d00: 20 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76   table.** to inv
3d10: 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72  alidate any incr
3d20: 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61  blob cursors tha
3d30: 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68  t are open on th
3d40: 65 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20  e.** row or one 
3d50: 6f 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e  of the rows bein
3d60: 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  g modified..**.*
3d70: 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73  * If argument is
3d80: 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72  ClearTable is tr
3d90: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74  ue, then the ent
3da0: 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
3db0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20  the.** table is 
3dc0: 61 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65  about to be dele
3dd0: 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ted. In this cas
3de0: 65 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  e invalidate all
3df0: 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72   incrblob.** cur
3e00: 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79  sors open on any
3e10: 20 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20   row within the 
3e20: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
3e30: 70 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a  page pgnoRoot..*
3e40: 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
3e50: 69 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c  if argument isCl
3e60: 65 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73  earTable is fals
3e70: 65 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20  e, then the row 
3e80: 77 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52  with.** rowid iR
3e90: 6f 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c  ow is being repl
3ea0: 61 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e  aced or deleted.
3eb0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e   In this case in
3ec0: 76 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79  validate.** only
3ed0: 20 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20   those incrblob 
3ee0: 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
3ef0: 74 68 61 74 20 73 70 65 63 69 66 69 63 20 72 6f  that specific ro
3f00: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  w..*/.static voi
3f10: 64 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72  d invalidateIncr
3f20: 62 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42  blobCursors(.  B
3f30: 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20  tree *pBtree,   
3f40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
3f50: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63  tabase file to c
3f60: 68 65 63 6b 20 2a 2f 0a 20 20 69 36 34 20 69 52  heck */.  i64 iR
3f70: 6f 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ow,             
3f80: 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74    /* The rowid t
3f90: 68 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61  hat might be cha
3fa0: 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  nging */.  int i
3fb0: 73 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20  sClearTable     
3fc0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c     /* True if al
3fd0: 6c 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67  l rows are being
3fe0: 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20   deleted */.){. 
3ff0: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
4000: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
4010: 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 61  pBtree->pBt;.  a
4020: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
4030: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42  reeHoldsMutex(pB
4040: 74 72 65 65 29 20 29 3b 0a 20 20 66 6f 72 28 70  tree) );.  for(p
4050: 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
4060: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
4070: 20 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46 6c     if( (p->curFl
4080: 61 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72 62  ags & BTCF_Incrb
4090: 6c 6f 62 29 21 3d 30 20 26 26 20 28 69 73 43 6c  lob)!=0 && (isCl
40a0: 65 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69  earTable || p->i
40b0: 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20  nfo.nKey==iRow) 
40c0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61  ){.      p->eSta
40d0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
40e0: 4c 49 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  LID;.    }.  }.}
40f0: 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75  ..#else.  /* Stu
4100: 62 20 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e 20  b function when 
4110: 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74  INCRBLOB is omit
4120: 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ted */.  #define
4130: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
4140: 6c 6f 62 43 75 72 73 6f 72 73 28 78 2c 79 2c 7a  lobCursors(x,y,z
4150: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
4160: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
4170: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62   */../*.** Set b
4180: 69 74 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 42  it pgno of the B
4190: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
41a0: 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73  ent bitvec. This
41b0: 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77   is called .** w
41c0: 68 65 6e 20 61 20 70 61 67 65 20 74 68 61 74 20  hen a page that 
41d0: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61  previously conta
41e0: 69 6e 65 64 20 64 61 74 61 20 62 65 63 6f 6d 65  ined data become
41f0: 73 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  s a free-list le
4200: 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a  af .** page..**.
4210: 2a 2a 20 54 68 65 20 42 74 53 68 61 72 65 64 2e  ** The BtShared.
4220: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
4230: 65 63 20 65 78 69 73 74 73 20 74 6f 20 77 6f 72  ec exists to wor
4240: 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63  k around an obsc
4250: 75 72 65 0a 2a 2a 20 62 75 67 20 63 61 75 73 65  ure.** bug cause
4260: 64 20 62 79 20 74 68 65 20 69 6e 74 65 72 61 63  d by the interac
4270: 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75 73 65 66  tion of two usef
4280: 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69  ul IO optimizati
4290: 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a  ons surrounding.
42a0: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  ** free-list lea
42b0: 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  f pages:.**.**  
42c0: 20 31 29 20 57 68 65 6e 20 61 6c 6c 20 64 61 74   1) When all dat
42d0: 61 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  a is deleted fro
42e0: 6d 20 61 20 70 61 67 65 20 61 6e 64 20 74 68 65  m a page and the
42f0: 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a   page becomes.**
4300: 20 20 20 20 20 20 61 20 66 72 65 65 2d 6c 69 73        a free-lis
4310: 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  t leaf page, the
4320: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 77 72 69   page is not wri
4330: 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
4340: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 28 61 73  base.**      (as
4350: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4360: 70 61 67 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f  pages contain no
4370: 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64 61 74 61   meaningful data
4380: 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  ). Sometimes.** 
4390: 20 20 20 20 20 73 75 63 68 20 61 20 70 61 67 65       such a page
43a0: 20 69 73 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75   is not even jou
43b0: 72 6e 61 6c 6c 65 64 20 28 61 73 20 69 74 20 77  rnalled (as it w
43c0: 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66  ill not be modif
43d0: 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79  ied,.**      why
43e0: 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c   bother journall
43f0: 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20  ing it?)..**.** 
4400: 20 20 32 29 20 57 68 65 6e 20 61 20 66 72 65 65    2) When a free
4410: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
4420: 69 73 20 72 65 75 73 65 64 2c 20 69 74 73 20 63  is reused, its c
4430: 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 72 65  ontent is not re
4440: 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ad.**      from 
4450: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
4460: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
4470: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 77 68 79  ournal file (why
4480: 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20   should it.**   
4490: 20 20 20 62 65 2c 20 69 66 20 69 74 20 69 73 20     be, if it is 
44a0: 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69  not at all meani
44b0: 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42  ngful?)..**.** B
44c0: 79 20 74 68 65 6d 73 65 6c 76 65 73 2c 20 74 68  y themselves, th
44d0: 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ese optimization
44e0: 73 20 77 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20  s work fine and 
44f0: 70 72 6f 76 69 64 65 20 61 20 68 61 6e 64 79 0a  provide a handy.
4500: 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62  ** performance b
4510: 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c  oost to bulk del
4520: 65 74 65 20 6f 72 20 69 6e 73 65 72 74 20 6f 70  ete or insert op
4530: 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65  erations. Howeve
4540: 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61 67 65 20  r, if.** a page 
4550: 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  is moved to the 
4560: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 74 68  free-list and th
4570: 65 6e 20 72 65 75 73 65 64 20 77 69 74 68 69 6e  en reused within
4580: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61   the same.** tra
4590: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62  nsaction, a prob
45a0: 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e 20 49 66  lem comes up. If
45b0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
45c0: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
45d0: 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76 65 64 20  .** it is moved 
45e0: 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  to the free-list
45f0: 20 61 6e 64 20 69 74 20 69 73 20 61 6c 73 6f 20   and it is also 
4600: 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77  not journalled w
4610: 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 65 78 74  hen it.** is ext
4620: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
4630: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 72 65  free-list and re
4640: 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6f  used, then the o
4650: 72 69 67 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20  riginal data.** 
4660: 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20  may be lost. In 
4670: 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72  the event of a r
4680: 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d 61 79 20  ollback, it may 
4690: 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a  not be possible.
46a0: 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ** to restore th
46b0: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
46c0: 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69  s original confi
46d0: 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  guration..**.** 
46e0: 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20  The solution is 
46f0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4700: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4710: 20 57 68 65 6e 65 76 65 72 20 61 20 70 61 67 65   Whenever a page
4720: 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f   is .** moved to
4730: 20 62 65 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c   become a free-l
4740: 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74  ist leaf page, t
4750: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
4760: 20 62 69 74 20 69 73 0a 2a 2a 20 73 65 74 20 69   bit is.** set i
4770: 6e 20 74 68 65 20 62 69 74 76 65 63 2e 20 57 68  n the bitvec. Wh
4780: 65 6e 65 76 65 72 20 61 20 6c 65 61 66 20 70 61  enever a leaf pa
4790: 67 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ge is extracted 
47a0: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
47b0: 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74  st,.** optimizat
47c0: 69 6f 6e 20 32 20 61 62 6f 76 65 20 69 73 20 6f  ion 2 above is o
47d0: 6d 69 74 74 65 64 20 69 66 20 74 68 65 20 63 6f  mitted if the co
47e0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
47f0: 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65  is already.** se
4800: 74 20 69 6e 20 42 74 53 68 61 72 65 64 2e 70 48  t in BtShared.pH
4810: 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63  asContent. The c
4820: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62  ontents of the b
4830: 69 74 76 65 63 20 61 72 65 20 63 6c 65 61 72 65  itvec are cleare
4840: 64 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  d.** at the end 
4850: 6f 66 20 65 76 65 72 79 20 74 72 61 6e 73 61 63  of every transac
4860: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
4870: 69 6e 74 20 62 74 72 65 65 53 65 74 48 61 73 43  int btreeSetHasC
4880: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
4890: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
48a0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
48b0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70  ITE_OK;.  if( !p
48c0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
48d0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
48e0: 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20  gno<=pBt->nPage 
48f0: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 48 61 73  );.    pBt->pHas
4900: 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74 65  Content = sqlite
4910: 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 42  3BitvecCreate(pB
4920: 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 69  t->nPage);.    i
4930: 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e  f( !pBt->pHasCon
4940: 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63  tent ){.      rc
4950: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
4960: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
4970: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
4980: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
4990: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
49a0: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
49b0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
49c0: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
49d0: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
49e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
49f0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
4a00: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
4a10: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
4a20: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
4a30: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
4a40: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
4a50: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4a60: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
4a70: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
4a80: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
4a90: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
4aa0: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
4ab0: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
4ac0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
4ad0: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
4ae0: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
4af0: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
4b00: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
4b10: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
4b20: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
4b30: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
4b40: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
4b50: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
4b60: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
4b70: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
4b80: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
4b90: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
4ba0: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
4bb0: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
4bc0: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
4bd0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4be0: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
4bf0: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
4c00: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
4c10: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
4c20: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
4c30: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
4c40: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
4c50: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
4c60: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
4c70: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
4c80: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
4c90: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
4ca0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
4cb0: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
4cc0: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
4cd0: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
4ce0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
4cf0: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
4d00: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
4d10: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
4d20: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
4d30: 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
4d40: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
4d50: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
4d60: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  ;.    pCur->apPa
4d70: 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  ge[i] = 0;.  }. 
4d80: 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
4d90: 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  1;.}.../*.** Sav
4da0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  e the current cu
4db0: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e  rsor position in
4dc0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 73 20 42   the variables B
4dd0: 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a  tCursor.nKey .**
4de0: 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b   and BtCursor.pK
4df0: 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73  ey. The cursor's
4e00: 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
4e10: 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
4e20: 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  EEK..**.** The c
4e30: 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
4e40: 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
4e50: 72 20 69 73 20 76 61 6c 69 64 20 28 68 61 73 20  r is valid (has 
4e60: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
4e70: 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72 20 74  ALID).** prior t
4e80: 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
4e90: 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61  outine.  .*/.sta
4ea0: 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73  tic int saveCurs
4eb0: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
4ec0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
4ed0: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
4ee0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
4ef0: 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20  Cur->eState );. 
4f00: 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72   assert( 0==pCur
4f10: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ->pKey );.  asse
4f20: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
4f30: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
4f40: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
4f50: 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
4f60: 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20  &pCur->nKey);.  
4f70: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
4f80: 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b 65 79  TE_OK );  /* Key
4f90: 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20 66 61  Size() cannot fa
4fa0: 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  il */..  /* If t
4fb0: 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65 79  his is an intKey
4fc0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65   table, then the
4fd0: 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42   above call to B
4fe0: 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20 20  treeKeySize().  
4ff0: 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e  ** stores the in
5000: 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43 75  teger key in pCu
5010: 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73  r->nKey. In this
5020: 20 63 61 73 65 20 74 68 69 73 20 76 61 6c 75 65   case this value
5030: 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61   is.  ** all tha
5040: 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 4f  t is required. O
5050: 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 75  therwise, if pCu
5060: 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e  r is not open on
5070: 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20   an intKey.  ** 
5080: 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c  table, then mall
5090: 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  oc space for and
50a0: 20 73 74 6f 72 65 20 74 68 65 20 70 43 75 72 2d   store the pCur-
50b0: 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b  >nKey bytes of k
50c0: 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20  ey .  ** data.. 
50d0: 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70 43 75   */.  if( 0==pCu
50e0: 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
50f0: 74 4b 65 79 20 29 7b 0a 20 20 20 20 76 6f 69 64  tKey ){.    void
5100: 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33   *pKey = sqlite3
5110: 4d 61 6c 6c 6f 63 28 20 28 69 6e 74 29 70 43 75  Malloc( (int)pCu
5120: 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20 69  r->nKey );.    i
5130: 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 20  f( pKey ){.     
5140: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
5150: 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 28  eeKey(pCur, 0, (
5160: 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20  int)pCur->nKey, 
5170: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28  pKey);.      if(
5180: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
5190: 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
51a0: 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20  pKey = pKey;.   
51b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
51c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
51d0: 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Key);.      }.  
51e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
51f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
5200: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
5210: 73 65 72 74 28 20 21 70 43 75 72 2d 3e 61 70 50  sert( !pCur->apP
5220: 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c  age[0]->intKey |
5230: 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b  | !pCur->pKey );
5240: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
5250: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72  TE_OK ){.    btr
5260: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
5270: 6f 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20  orPages(pCur);. 
5280: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
5290: 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  = CURSOR_REQUIRE
52a0: 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76  SEEK;.  }..  inv
52b0: 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
52c0: 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 72 65  ache(pCur);.  re
52d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
52e0: 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74  * Save the posit
52f0: 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73  ions of all curs
5300: 6f 72 73 20 28 65 78 63 65 70 74 20 70 45 78 63  ors (except pExc
5310: 65 70 74 29 20 74 68 61 74 20 61 72 65 20 6f 70  ept) that are op
5320: 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62  en on.** the tab
5330: 6c 65 20 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  le  with root-pa
5340: 67 65 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c  ge iRoot. Usuall
5350: 79 2c 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  y, this is calle
5360: 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75  d just before cu
5370: 72 73 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20  rsor.** pExcept 
5380: 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66  is used to modif
5390: 79 20 74 68 65 20 74 61 62 6c 65 20 28 42 74 72  y the table (Btr
53a0: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
53b0: 72 65 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f  reeInsert())..*/
53c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
53d0: 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61  AllCursors(BtSha
53e0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69  red *pBt, Pgno i
53f0: 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a  Root, BtCursor *
5400: 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75  pExcept){.  BtCu
5410: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
5420: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
5430: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
5440: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
5450: 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78  Except==0 || pEx
5460: 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29  cept->pBt==pBt )
5470: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
5480: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
5490: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
54a0: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
54b0: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
54c0: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
54d0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65  {.      if( p->e
54e0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
54f0: 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 69  LID ){.        i
5500: 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75 72 73  nt rc = saveCurs
5510: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
5520: 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
5530: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
5540: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
5550: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5560: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5570: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61  testcase( p->iPa
5580: 67 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ge>0 );.        
5590: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
55a0: 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20  ursorPages(p);. 
55b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
55c0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
55d0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
55e0: 65 61 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ear the current 
55f0: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
5600: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5610: 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
5620: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
5630: 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
5640: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
5650: 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  r) );.  sqlite3_
5660: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
5670: 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d  ;.  pCur->pKey =
5680: 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61   0;.  pCur->eSta
5690: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
56a0: 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  LID;.}../*.** In
56b0: 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   this version of
56c0: 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b   BtreeMoveto, pK
56d0: 65 79 20 69 73 20 61 20 70 61 63 6b 65 64 20 69  ey is a packed i
56e0: 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73  ndex record.** s
56f0: 75 63 68 20 61 73 20 69 73 20 67 65 6e 65 72 61  uch as is genera
5700: 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61  ted by the OP_Ma
5710: 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
5720: 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20    Unpack the.** 
5730: 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20  record and then 
5740: 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f  call BtreeMoveto
5750: 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f  Unpacked() to do
5760: 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74   the work..*/.st
5770: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 4d 6f  atic int btreeMo
5780: 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72  veto(.  BtCursor
5790: 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43   *pCur,     /* C
57a0: 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68  ursor open on th
57b0: 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 73 65  e btree to be se
57c0: 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  arched */.  cons
57d0: 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
57e0: 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66  /* Packed key if
57f0: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6e   the btree is an
5800: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20   index */.  i64 
5810: 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
5820: 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66  /* Integer key f
5830: 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65  or tables.  Size
5840: 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64   of pKey for ind
5850: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69  ices */.  int bi
5860: 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  as,           /*
5870: 20 42 69 61 73 20 73 65 61 72 63 68 20 74 6f 20   Bias search to 
5880: 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
5890: 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
58a0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
58b0: 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
58c0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
58d0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
58e0: 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20        /* Status 
58f0: 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  code */.  Unpack
5900: 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
5910: 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64  y;   /* Unpacked
5920: 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20   index key */.  
5930: 63 68 61 72 20 61 53 70 61 63 65 5b 32 30 30 5d  char aSpace[200]
5940: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  ;          /* Te
5950: 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70 49 64  mp space for pId
5960: 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69 64 20  xKey - to avoid 
5970: 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68  a malloc */.  ch
5980: 61 72 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a  ar *pFree = 0;..
5990: 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
59a0: 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d    assert( nKey==
59b0: 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29  (i64)(int)nKey )
59c0: 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20  ;.    pIdxKey = 
59d0: 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63  sqlite3VdbeAlloc
59e0: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a  UnpackedRecord(.
59f0: 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b          pCur->pK
5a00: 65 79 49 6e 66 6f 2c 20 61 53 70 61 63 65 2c 20  eyInfo, aSpace, 
5a10: 73 69 7a 65 6f 66 28 61 53 70 61 63 65 29 2c 20  sizeof(aSpace), 
5a20: 26 70 46 72 65 65 0a 20 20 20 20 29 3b 0a 20 20  &pFree.    );.  
5a30: 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30    if( pIdxKey==0
5a40: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
5a50: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 73 71 6c 69  _NOMEM;.    sqli
5a60: 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
5a70: 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ack(pCur->pKeyIn
5a80: 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70  fo, (int)nKey, p
5a90: 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  Key, pIdxKey);. 
5aa0: 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e     if( pIdxKey->
5ab0: 6e 46 69 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20  nField==0 ){.   
5ac0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
5ad0: 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d  (pCur->pKeyInfo-
5ae0: 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 20  >db, pFree);.   
5af0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5b00: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
5b10: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
5b20: 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20    pIdxKey = 0;. 
5b30: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
5b40: 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
5b50: 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b  cked(pCur, pIdxK
5b60: 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20  ey, nKey, bias, 
5b70: 70 52 65 73 29 3b 0a 20 20 69 66 28 20 70 46 72  pRes);.  if( pFr
5b80: 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ee ){.    sqlite
5b90: 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b  3DbFree(pCur->pK
5ba0: 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65  eyInfo->db, pFre
5bb0: 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
5bc0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
5bd0: 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72  store the cursor
5be0: 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   to the position
5bf0: 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20 61   it was in (or a
5c00: 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f  s close to as po
5c10: 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20  ssible).** when 
5c20: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
5c30: 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2e  on() was called.
5c40: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20   Note that this 
5c50: 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68 65  call deletes the
5c60: 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69 74   .** saved posit
5c70: 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64 20  ion info stored 
5c80: 62 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  by saveCursorPos
5c90: 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72  ition(), so ther
5ca0: 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d  e can be.** at m
5cb0: 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69 76  ost one effectiv
5cc0: 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  e restoreCursorP
5cd0: 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61  osition() call a
5ce0: 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61  fter each .** sa
5cf0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
5d00: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
5d10: 74 20 62 74 72 65 65 52 65 73 74 6f 72 65 43 75  t btreeRestoreCu
5d20: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
5d30: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5d40: 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
5d50: 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
5d60: 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
5d70: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
5d80: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
5d90: 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20  RESEEK );.  if( 
5da0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
5db0: 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
5dc0: 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
5dd0: 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70  kipNext;.  }.  p
5de0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
5df0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
5e00: 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f  rc = btreeMoveto
5e10: 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65  (pCur, pCur->pKe
5e20: 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30  y, pCur->nKey, 0
5e30: 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  , &pCur->skipNex
5e40: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
5e50: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
5e60: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
5e70: 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75  ->pKey);.    pCu
5e80: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20  r->pKey = 0;.   
5e90: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
5ea0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
5eb0: 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
5ec0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
5ed0: 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  LID );.    if( p
5ee0: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26  Cur->skipNext &&
5ef0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
5f00: 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
5f10: 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
5f20: 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e  e = CURSOR_SKIPN
5f30: 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  EXT;.    }.  }. 
5f40: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
5f50: 64 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75  define restoreCu
5f60: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20  rsorPosition(p) 
5f70: 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d  \.  (p->eState>=
5f80: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5f90: 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20  EK ? \.         
5fa0: 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73  btreeRestoreCurs
5fb0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20  orPosition(p) : 
5fc0: 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  \.         SQLIT
5fd0: 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74  E_OK)../*.** Det
5fe0: 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
5ff0: 72 20 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68  r not a cursor h
6000: 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68  as moved from th
6010: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a  e position it.**
6020: 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64   was last placed
6030: 20 61 74 2e 20 20 43 75 72 73 6f 72 73 20 63 61   at.  Cursors ca
6040: 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20  n move when the 
6050: 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69  row they are poi
6060: 6e 74 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64  nting.** at is d
6070: 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
6080: 75 6e 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a  under them..**.*
6090: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
60a0: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
60b0: 63 6f 64 65 20 69 66 20 73 6f 6d 65 74 68 69 6e  code if somethin
60c0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54  g goes wrong.  T
60d0: 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70  he.** integer *p
60e0: 48 61 73 4d 6f 76 65 64 20 69 73 20 73 65 74 20  HasMoved is set 
60f0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
6100: 2a 20 20 20 20 30 3a 20 20 20 54 68 65 20 63 75  *    0:   The cu
6110: 72 73 6f 72 20 69 73 20 75 6e 63 68 61 6e 67 65  rsor is unchange
6120: 64 0a 2a 2a 20 20 20 20 31 3a 20 20 20 54 68 65  d.**    1:   The
6130: 20 63 75 72 73 6f 72 20 69 73 20 73 74 69 6c 6c   cursor is still
6140: 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
6150: 20 73 61 6d 65 20 72 6f 77 2c 20 62 75 74 20 74   same row, but t
6160: 68 65 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 20  he pointers.**  
6170: 20 20 20 20 20 20 20 72 65 74 75 72 6e 65 64 20         returned 
6180: 62 79 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  by sqlite3BtreeK
6190: 65 79 46 65 74 63 68 28 29 20 6f 72 20 73 71 6c  eyFetch() or sql
61a0: 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74  ite3BtreeDataFet
61b0: 63 68 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  ch().**         
61c0: 6d 69 67 68 74 20 6e 6f 77 20 62 65 20 69 6e 76  might now be inv
61d0: 61 6c 69 64 20 62 65 63 61 75 73 65 20 6f 66 20  alid because of 
61e0: 61 20 62 61 6c 61 6e 63 65 28 29 20 6f 72 20 6f  a balance() or o
61f0: 74 68 65 72 20 63 68 61 6e 67 65 20 74 6f 20 74  ther change to t
6200: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 62 2d  he.**         b-
6210: 74 72 65 65 2e 0a 2a 2a 20 20 20 20 32 3a 20 20  tree..**    2:  
6220: 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   The cursor is n
6230: 6f 20 6c 6f 6e 67 65 72 20 70 6f 69 6e 74 69 6e  o longer pointin
6240: 67 20 74 6f 20 74 68 65 20 72 6f 77 2e 20 20 54  g to the row.  T
6250: 68 65 20 72 6f 77 20 6d 69 67 68 74 20 68 61 76  he row might hav
6260: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 62 65 65  e.**         bee
6270: 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  n deleted out fr
6280: 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72  om under the cur
6290: 73 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sor..*/.int sqli
62a0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
62b0: 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20  sMoved(BtCursor 
62c0: 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73  *pCur, int *pHas
62d0: 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63  Moved){.  int rc
62e0: 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  ;..  if( pCur->e
62f0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
6300: 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 48 61 73  LID ){.    *pHas
6310: 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 20 20 72  Moved = 0;.    r
6320: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6330: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 72 65 73 74  .  }.  rc = rest
6340: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
6350: 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
6360: 63 20 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f  c ){.    *pHasMo
6370: 76 65 64 20 3d 20 32 3b 0a 20 20 20 20 72 65 74  ved = 2;.    ret
6380: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
6390: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
63a0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
63b0: 4e 45 56 45 52 28 70 43 75 72 2d 3e 73 6b 69 70  NEVER(pCur->skip
63c0: 4e 65 78 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  Next!=0) ){.    
63d0: 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 32 3b 0a  *pHasMoved = 2;.
63e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48    }else{.    *pH
63f0: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  asMoved = 1;.  }
6400: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6410: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
6420: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
6430: 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76  VACUUM./*.** Giv
6440: 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  en a page number
6450: 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64 61   of a regular da
6460: 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65 74  tabase page, ret
6470: 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20  urn the page.** 
6480: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70  number for the p
6490: 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20  ointer-map page 
64a0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
64b0: 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a  e entry for the.
64c0: 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75  ** input page nu
64d0: 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  mber..**.** Retu
64e0: 72 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c 69  rn 0 (not a vali
64f0: 64 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e 6f  d page) for pgno
6500: 3d 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65 20  ==1 since there 
6510: 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72  is.** no pointer
6520: 20 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64 20   map associated 
6530: 77 69 74 68 20 70 61 67 65 20 31 2e 20 20 54 68  with page 1.  Th
6540: 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  e integrity_chec
6550: 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69  k logic.** requi
6560: 72 65 73 20 74 68 61 74 20 70 74 72 6d 61 70 50  res that ptrmapP
6570: 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a  ageno(*,1)!=1..*
6580: 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74  /.static Pgno pt
6590: 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61  rmapPageno(BtSha
65a0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
65b0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67  gno){.  int nPag
65c0: 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20  esPerMapPage;.  
65d0: 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65  Pgno iPtrMap, re
65e0: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
65f0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
6600: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
6610: 20 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72 65   if( pgno<2 ) re
6620: 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73  turn 0;.  nPages
6630: 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42  PerMapPage = (pB
6640: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29  t->usableSize/5)
6650: 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20  +1;.  iPtrMap = 
6660: 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50  (pgno-2)/nPagesP
6670: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74  erMapPage;.  ret
6680: 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67   = (iPtrMap*nPag
6690: 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20  esPerMapPage) + 
66a0: 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50  2; .  if( ret==P
66b0: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
66c0: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74  (pBt) ){.    ret
66d0: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
66e0: 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57   ret;.}../*.** W
66f0: 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  rite an entry in
6700: 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  to the pointer m
6710: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
6720: 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20 74  outine updates t
6730: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
6740: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75  ntry for page nu
6750: 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f  mber 'key'.** so
6760: 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f   that it maps to
6770: 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61 6e   type 'eType' an
6780: 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  d parent page nu
6790: 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a  mber 'pgno'..**.
67a0: 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69 6e  ** If *pRC is in
67b0: 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f  itially non-zero
67c0: 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29   (non-SQLITE_OK)
67d0: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
67e0: 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70  ne is.** a no-op
67f0: 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  .  If an error o
6800: 63 63 75 72 73 2c 20 74 68 65 20 61 70 70 72 6f  ccurs, the appro
6810: 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
6820: 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  e is written.** 
6830: 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74  into *pRC..*/.st
6840: 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70  atic void ptrmap
6850: 50 75 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  Put(BtShared *pB
6860: 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20  t, Pgno key, u8 
6870: 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65  eType, Pgno pare
6880: 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  nt, int *pRC){. 
6890: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
68a0: 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65  ;  /* The pointe
68b0: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
68c0: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
68d0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
68e0: 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50   map data */.  P
68f0: 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20  gno iPtrmap;    
6900: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
6910: 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20  map page number 
6920: 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b  */.  int offset;
6930: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
6940: 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20   in pointer map 
6950: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  page */.  int rc
6960: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
6970: 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
6980: 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  subfunctions */.
6990: 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
69a0: 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
69b0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
69c0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
69d0: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74  );.  /* The mast
69e0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  er-journal page 
69f0: 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65  number must neve
6a00: 72 20 62 65 20 75 73 65 64 20 61 73 20 61 20 70  r be used as a p
6a10: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
6a20: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  */.  assert( 0==
6a30: 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
6a40: 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t, PENDING_BYTE_
6a50: 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20  PAGE(pBt)) );.. 
6a60: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
6a70: 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66  toVacuum );.  if
6a80: 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20  ( key==0 ){.    
6a90: 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRC = SQLITE_CO
6aa0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
6ab0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50  return;.  }.  iP
6ac0: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
6ad0: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
6ae0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
6af0: 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
6b00: 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70  ger, iPtrmap, &p
6b10: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
6b20: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
6b30: 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
6b40: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
6b50: 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50   offset = PTRMAP
6b60: 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d  _PTROFFSET(iPtrm
6b70: 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20  ap, key);.  if( 
6b80: 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20  offset<0 ){.    
6b90: 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRC = SQLITE_CO
6ba0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
6bb0: 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69 74  goto ptrmap_exit
6bc0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
6bd0: 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70  offset <= (int)p
6be0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35  Bt->usableSize-5
6bf0: 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20   );.  pPtrmap = 
6c00: 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67  (u8 *)sqlite3Pag
6c10: 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
6c20: 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65  e);..  if( eType
6c30: 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  !=pPtrmap[offset
6c40: 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70  ] || get4byte(&p
6c50: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d  Ptrmap[offset+1]
6c60: 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20  )!=parent ){.   
6c70: 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f   TRACE(("PTRMAP_
6c80: 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c  UPDATE: %d->(%d,
6c90: 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79  %d)\n", key, eTy
6ca0: 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20  pe, parent));.  
6cb0: 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71 6c    *pRC= rc = sql
6cc0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
6cd0: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
6ce0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
6cf0: 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b  {.      pPtrmap[
6d00: 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b  offset] = eType;
6d10: 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
6d20: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
6d30: 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20  1], parent);.   
6d40: 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65   }.  }..ptrmap_e
6d50: 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50 61  xit:.  sqlite3Pa
6d60: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
6d70: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  );.}../*.** Read
6d80: 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74   an entry from t
6d90: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
6da0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
6db0: 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68 65  ne retrieves the
6dc0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
6dd0: 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79  ry for page 'key
6de0: 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68  ', writing.** th
6df0: 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e  e type and paren
6e00: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  t page number to
6e10: 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50   *pEType and *pP
6e20: 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79  gno respectively
6e30: 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f  ..** An error co
6e40: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  de is returned i
6e50: 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
6e60: 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73   wrong, otherwis
6e70: 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  e SQLITE_OK..*/.
6e80: 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61  static int ptrma
6e90: 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a 70  pGet(BtShared *p
6ea0: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
6eb0: 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a   *pEType, Pgno *
6ec0: 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65  pPgno){.  DbPage
6ed0: 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20   *pDbPage;   /* 
6ee0: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
6ef0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50  page */.  int iP
6f00: 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20  trmap;       /* 
6f10: 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  Pointer map page
6f20: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a   index */.  u8 *
6f30: 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  pPtrmap;       /
6f40: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
6f50: 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ge data */.  int
6f60: 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20   offset;        
6f70: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74  /* Offset of ent
6f80: 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61  ry in pointer ma
6f90: 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  p */.  int rc;..
6fa0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6fb0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
6fc0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69  ->mutex) );..  i
6fd0: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
6fe0: 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29  PAGENO(pBt, key)
6ff0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
7000: 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
7010: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26  ager, iPtrmap, &
7020: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
7030: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  rc!=0 ){.    ret
7040: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
7050: 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71  trmap = (u8 *)sq
7060: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
7070: 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f  a(pDbPage);..  o
7080: 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50  ffset = PTRMAP_P
7090: 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70  TROFFSET(iPtrmap
70a0: 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66  , key);.  if( of
70b0: 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71  fset<0 ){.    sq
70c0: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
70d0: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65  pDbPage);.    re
70e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
70f0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
7100: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c  assert( offset <
7110: 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62  = (int)pBt->usab
7120: 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73  leSize-5 );.  as
7130: 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20  sert( pEType!=0 
7140: 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70  );.  *pEType = p
7150: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a  Ptrmap[offset];.
7160: 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70    if( pPgno ) *p
7170: 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
7180: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
7190: 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50  1]);..  sqlite3P
71a0: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
71b0: 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70  e);.  if( *pETyp
71c0: 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35  e<1 || *pEType>5
71d0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
71e0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
71f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7200: 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69  K;.}..#else /* i
7210: 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45  f defined SQLITE
7220: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
7230: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74   */.  #define pt
7240: 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c  rmapPut(w,x,y,z,
7250: 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74  rc).  #define pt
7260: 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29  rmapGet(w,x,y,z)
7270: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
7280: 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76  fine ptrmapPutOv
7290: 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a  flPtr(x, y, rc).
72a0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69  #endif../*.** Gi
72b0: 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65  ven a btree page
72c0: 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65   and a cell inde
72d0: 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66  x (0 means the f
72e0: 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20  irst cell on.** 
72f0: 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e  the page, 1 mean
7300: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c  s the second cel
7310: 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  l, and so forth)
7320: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
7330: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c  r.** to the cell
7340: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
7350: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
7360: 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65  ks only for page
7370: 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f  s that do not co
7380: 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ntain overflow c
7390: 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ells..*/.#define
73a0: 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c   findCell(P,I) \
73b0: 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b  .  ((P)->aData +
73c0: 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20   ((P)->maskPage 
73d0: 26 20 67 65 74 32 62 79 74 65 28 26 28 50 29 2d  & get2byte(&(P)-
73e0: 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d  >aCellIdx[2*(I)]
73f0: 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64  ))).#define find
7400: 43 65 6c 6c 76 32 28 44 2c 4d 2c 4f 2c 49 29 20  Cellv2(D,M,O,I) 
7410: 28 44 2b 28 4d 26 67 65 74 32 62 79 74 65 28 44  (D+(M&get2byte(D
7420: 2b 28 4f 2b 32 2a 28 49 29 29 29 29 29 0a 0a 0a  +(O+2*(I)))))...
7430: 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72  /*.** This a mor
7440: 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f  e complex versio
7450: 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28 29 20  n of findCell() 
7460: 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a  that works for.*
7470: 2a 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20  * pages that do 
7480: 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77  contain overflow
7490: 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   cells..*/.stati
74a0: 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c  c u8 *findOverfl
74b0: 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  owCell(MemPage *
74c0: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
74d0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
74e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
74f0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
7500: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
7510: 20 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f   for(i=pPage->nO
7520: 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b  verflow-1; i>=0;
7530: 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b   i--){.    int k
7540: 3b 0a 20 20 20 20 6b 20 3d 20 70 50 61 67 65 2d  ;.    k = pPage-
7550: 3e 61 69 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20  >aiOvfl[i];.    
7560: 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a  if( k<=iCell ){.
7570: 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65        if( k==iCe
7580: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ll ){.        re
7590: 74 75 72 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76  turn pPage->apOv
75a0: 66 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  fl[i];.      }. 
75b0: 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20       iCell--;.  
75c0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
75d0: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
75e0: 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   iCell);.}../*.*
75f0: 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63  * Parse a cell c
7600: 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64  ontent block and
7610: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c   fill in the Cel
7620: 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  lInfo structure.
7630: 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74    There.** are t
7640: 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  wo versions of t
7650: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 62  his function.  b
7660: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20  treeParseCell() 
7670: 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c  takes a .** cell
7680: 20 69 6e 64 65 78 20 61 73 20 74 68 65 20 73 65   index as the se
7690: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e  cond argument an
76a0: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
76b0: 50 74 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20  Ptr() .** takes 
76c0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
76d0: 20 62 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c   body of the cel
76e0: 6c 20 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20  l as its second 
76f0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
7700: 57 69 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65  Within this file
7710: 2c 20 74 68 65 20 70 61 72 73 65 43 65 6c 6c 28  , the parseCell(
7720: 29 20 6d 61 63 72 6f 20 63 61 6e 20 62 65 20 63  ) macro can be c
7730: 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 20 6f 66  alled instead of
7740: 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
7750: 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e 67 20 73  llPtr(). Using s
7760: 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74  ome compilers, t
7770: 68 69 73 20 77 69 6c 6c 20 62 65 20 66 61 73 74  his will be fast
7780: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
7790: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
77a0: 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20  lPtr(.  MemPage 
77b0: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
77c0: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
77d0: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
77e0: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
77f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
7800: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
7810: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
7820: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
7830: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
7840: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
7850: 29 7b 0a 20 20 75 31 36 20 6e 3b 20 20 20 20 20  ){.  u16 n;     
7860: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7870: 4e 75 6d 62 65 72 20 62 79 74 65 73 20 69 6e 20  Number bytes in 
7880: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61  cell content hea
7890: 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61  der */.  u32 nPa
78a0: 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20  yload;          
78b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
78c0: 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c  tes of cell payl
78d0: 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  oad */..  assert
78e0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
78f0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
7900: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 49  >mutex) );..  pI
7910: 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65  nfo->pCell = pCe
7920: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ll;.  assert( pP
7930: 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20  age->leaf==0 || 
7940: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29  pPage->leaf==1 )
7950: 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63  ;.  n = pPage->c
7960: 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 61  hildPtrSize;.  a
7970: 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50  ssert( n==4-4*pP
7980: 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69  age->leaf );.  i
7990: 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
79a0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
79b0: 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20  e->hasData ){.  
79c0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 30      assert( n==0
79d0: 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 67 65   );.      n = ge
79e0: 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c  tVarint32(pCell,
79f0: 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20   nPayload);.    
7a00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61  }else{.      nPa
7a10: 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d  yload = 0;.    }
7a20: 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72  .    n += getVar
7a30: 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28  int(&pCell[n], (
7a40: 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65  u64*)&pInfo->nKe
7a50: 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  y);.    pInfo->n
7a60: 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  Data = nPayload;
7a70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
7a80: 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 30 3b 0a  nfo->nData = 0;.
7a90: 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69      n += getVari
7aa0: 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20  nt32(&pCell[n], 
7ab0: 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70  nPayload);.    p
7ac0: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61  Info->nKey = nPa
7ad0: 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e  yload;.  }.  pIn
7ae0: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
7af0: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
7b00: 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20  ->nHeader = n;. 
7b10: 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c   testcase( nPayl
7b20: 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad==pPage->maxL
7b30: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
7b40: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
7b50: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
7b60: 29 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c 79 28  );.  if( likely(
7b70: 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
7b80: 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a 20 20  >maxLocal) ){.  
7b90: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
7ba0: 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63   (easy) common c
7bb0: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e  ase where the en
7bc0: 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74  tire payload fit
7bd0: 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  s.    ** on the 
7be0: 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20  local page.  No 
7bf0: 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75  overflow is requ
7c00: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
7c10: 20 69 66 28 20 28 70 49 6e 66 6f 2d 3e 6e 53 69   if( (pInfo->nSi
7c20: 7a 65 20 3d 20 28 75 31 36 29 28 6e 2b 6e 50 61  ze = (u16)(n+nPa
7c30: 79 6c 6f 61 64 29 29 3c 34 20 29 20 70 49 6e 66  yload))<4 ) pInf
7c40: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20  o->nSize = 4;.  
7c50: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
7c60: 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b  = (u16)nPayload;
7c70: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  .    pInfo->iOve
7c80: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c  rflow = 0;.  }el
7c90: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
7ca0: 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e  e payload will n
7cb0: 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c  ot fit completel
7cc0: 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  y on the local p
7cd0: 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20  age, we have.   
7ce0: 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f   ** to decide ho
7cf0: 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20  w much to store 
7d00: 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20  locally and how 
7d10: 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e  much to spill on
7d20: 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  to.    ** overfl
7d30: 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20 73  ow pages.  The s
7d40: 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69  trategy is to mi
7d50: 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e  nimize the amoun
7d60: 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20  t of unused.    
7d70: 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72  ** space on over
7d80: 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65  flow pages while
7d90: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f   keeping the amo
7da0: 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f  unt of local sto
7db0: 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62  rage.    ** in b
7dc0: 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20  etween minLocal 
7dd0: 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20  and maxLocal..  
7de0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e    **.    ** Warn
7df0: 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74  ing:  changing t
7e00: 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20  he way overflow 
7e10: 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72  payload is distr
7e20: 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20  ibuted in any.  
7e30: 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65    ** way will re
7e40: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  sult in an incom
7e50: 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72  patible file for
7e60: 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mat..    */.    
7e70: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f  int minLocal;  /
7e80: 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Minimum amount
7e90: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
7ea0: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
7eb0: 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f  int maxLocal;  /
7ec0: 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Maximum amount
7ed0: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
7ee0: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
7ef0: 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f  int surplus;   /
7f00: 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  * Overflow paylo
7f10: 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ad available for
7f20: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a   local storage *
7f30: 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20  /..    minLocal 
7f40: 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
7f50: 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20  l;.    maxLocal 
7f60: 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  = pPage->maxLoca
7f70: 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d  l;.    surplus =
7f80: 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61   minLocal + (nPa
7f90: 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c  yload - minLocal
7fa0: 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  )%(pPage->pBt->u
7fb0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
7fc0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 75      testcase( su
7fd0: 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20  rplus==maxLocal 
7fe0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
7ff0: 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63   surplus==maxLoc
8000: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
8010: 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f  surplus <= maxLo
8020: 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  cal ){.      pIn
8030: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
8040: 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d  6)surplus;.    }
8050: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66  else{.      pInf
8060: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
8070: 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d  )minLocal;.    }
8080: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  .    pInfo->iOve
8090: 72 66 6c 6f 77 20 3d 20 28 75 31 36 29 28 70 49  rflow = (u16)(pI
80a0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 29  nfo->nLocal + n)
80b0: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  ;.    pInfo->nSi
80c0: 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  ze = pInfo->iOve
80d0: 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d  rflow + 4;.  }.}
80e0: 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65 43 65  .#define parseCe
80f0: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c  ll(pPage, iCell,
8100: 20 70 49 6e 66 6f 29 20 5c 0a 20 20 62 74 72 65   pInfo) \.  btre
8110: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 28 70  eParseCellPtr((p
8120: 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28  Page), findCell(
8130: 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c 6c 29  (pPage), (iCell)
8140: 29 2c 20 28 70 49 6e 66 6f 29 29 0a 73 74 61 74  ), (pInfo)).stat
8150: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
8160: 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  seCell(.  MemPag
8170: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
8180: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
8190: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
81a0: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20  .  int iCell,   
81b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
81c0: 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46  e cell index.  F
81d0: 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a  irst cell is 0 *
81e0: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
81f0: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
8200: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
8210: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61  cture */.){.  pa
8220: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  rseCell(pPage, i
8230: 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a  Cell, pInfo);.}.
8240: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
8250: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
8260: 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20  of bytes that a 
8270: 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68  Cell needs in th
8280: 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61  e cell.** data a
8290: 72 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65  rea of the btree
82a0: 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75  -page.  The retu
82b0: 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64  rn number includ
82c0: 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64  es the cell.** d
82d0: 61 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74  ata header and t
82e0: 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64  he local payload
82f0: 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76  , but not any ov
8300: 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a  erflow page or.*
8310: 2a 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64  * the space used
8320: 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69   by the cell poi
8330: 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nter..*/.static 
8340: 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  u16 cellSizePtr(
8350: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8360: 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38  u8 *pCell){.  u8
8370: 20 2a 70 49 74 65 72 20 3d 20 26 70 43 65 6c 6c   *pIter = &pCell
8380: 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  [pPage->childPtr
8390: 53 69 7a 65 5d 3b 0a 20 20 75 33 32 20 6e 53 69  Size];.  u32 nSi
83a0: 7a 65 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ze;..#ifdef SQLI
83b0: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68  TE_DEBUG.  /* Th
83c0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
83d0: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
83e0: 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  n should always 
83f0: 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20  be the same as. 
8400: 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66   ** the (CellInf
8410: 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66  o.nSize) value f
8420: 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20  ound by doing a 
8430: 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68  full parse of th
8440: 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20  e.  ** cell. If 
8450: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20  SQLITE_DEBUG is 
8460: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
8470: 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74  rt() at the bott
8480: 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  om of.  ** this 
8490: 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65  function verifie
84a0: 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61  s that this inva
84b0: 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f  riant is not vio
84c0: 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c  lated. */.  Cell
84d0: 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a  Info debuginfo;.
84e0: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
84f0: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
8500: 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23  , &debuginfo);.#
8510: 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61  endif..  if( pPa
8520: 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
8530: 20 20 75 38 20 2a 70 45 6e 64 3b 0a 20 20 20 20    u8 *pEnd;.    
8540: 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
8550: 74 61 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  ta ){.      pIte
8560: 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  r += getVarint32
8570: 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a  (pIter, nSize);.
8580: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8590: 20 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20   nSize = 0;.    
85a0: 7d 0a 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20  }..    /* pIter 
85b0: 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68  now points at th
85c0: 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  e 64-bit integer
85d0: 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61   key value, a va
85e0: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20  riable length . 
85f0: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54     ** integer. T
8600: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
8610: 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74  ck moves pIter t
8620: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66  o point at the f
8630: 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a  irst byte.    **
8640: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
8650: 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
8660: 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70  */.    pEnd = &p
8670: 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Iter[9];.    whi
8680: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
8690: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
86a0: 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d );.  }else{.  
86b0: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
86c0: 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53  rint32(pIter, nS
86d0: 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 74 65 73  ize);.  }..  tes
86e0: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
86f0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
8700: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
8710: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
8720: 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e  cal+1 );.  if( n
8730: 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c  Size>pPage->maxL
8740: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
8750: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
8760: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
8770: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
8780: 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c   + (nSize - minL
8790: 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e  ocal) % (pPage->
87a0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
87b0: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
87c0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
87d0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
87e0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
87f0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
8800: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
8810: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
8820: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e  Local ){.      n
8830: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  Size = minLocal;
8840: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65  .    }.    nSize
8850: 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 6e 53 69   += 4;.  }.  nSi
8860: 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65  ze += (u32)(pIte
8870: 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 0a 20 20 2f  r - pCell);..  /
8880: 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69  * The minimum si
8890: 7a 65 20 6f 66 20 61 6e 79 20 63 65 6c 6c 20 69  ze of any cell i
88a0: 73 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20  s 4 bytes. */.  
88b0: 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b 0a 20  if( nSize<4 ){. 
88c0: 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20     nSize = 4;.  
88d0: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69  }..  assert( nSi
88e0: 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53  ze==debuginfo.nS
88f0: 69 7a 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ize );.  return 
8900: 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23  (u16)nSize;.}..#
8910: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
8920: 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61  UG./* This varia
8930: 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65  tion on cellSize
8940: 50 74 72 28 29 20 69 73 20 75 73 65 64 20 69 6e  Ptr() is used in
8950: 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29  side of assert()
8960: 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f   statements.** o
8970: 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75  nly. */.static u
8980: 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50  16 cellSize(MemP
8990: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
89a0: 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e  iCell){.  return
89b0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
89c0: 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ge, findCell(pPa
89d0: 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23  ge, iCell));.}.#
89e0: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
89f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
8a00: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ACUUM./*.** If t
8a10: 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70  he cell pCell, p
8a20: 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61 67  art of page pPag
8a30: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
8a40: 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76  nter.** to an ov
8a50: 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73  erflow page, ins
8a60: 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ert an entry int
8a70: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
8a80: 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65  p.** for the ove
8a90: 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73  rflow page..*/.s
8aa0: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
8ab0: 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50  pPutOvflPtr(MemP
8ac0: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
8ad0: 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29  pCell, int *pRC)
8ae0: 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  {.  CellInfo inf
8af0: 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  o;.  if( *pRC ) 
8b00: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
8b10: 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20  ( pCell!=0 );.  
8b20: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
8b30: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
8b40: 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  &info);.  assert
8b50: 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70  ( (info.nData+(p
8b60: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69  Page->intKey?0:i
8b70: 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f  nfo.nKey))==info
8b80: 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 69  .nPayload );.  i
8b90: 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
8ba0: 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76  w ){.    Pgno ov
8bb0: 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
8bc0: 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
8bd0: 6c 6f 77 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61  low]);.    ptrma
8be0: 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
8bf0: 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56   ovfl, PTRMAP_OV
8c00: 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
8c10: 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a  pgno, pRC);.  }.
8c20: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
8c30: 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20   Defragment the 
8c40: 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c  page given.  All
8c50: 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64   Cells are moved
8c60: 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
8c70: 66 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61  f the page and a
8c80: 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73  ll free space is
8c90: 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20   collected into 
8ca0: 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42  one.** big FreeB
8cb0: 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  lk that occurs i
8cc0: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65  n between the he
8cd0: 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a  ader and cell.**
8ce0: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61   pointer array a
8cf0: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
8d00: 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61  ent area..*/.sta
8d10: 74 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65  tic int defragme
8d20: 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  ntPage(MemPage *
8d30: 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
8d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d50: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
8d60: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63  nter */.  int pc
8d70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8d80: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
8d90: 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a  of a i-th cell *
8da0: 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8dc0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
8dd0: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
8de0: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8e00: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
8e10: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
8e20: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
8e30: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c   Number of usabl
8e40: 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67  e bytes on a pag
8e50: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  e */.  int cellO
8e60: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
8e70: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
8e80: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
8e90: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63  array */.  int c
8ea0: 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  brk;            
8eb0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
8ec0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
8ed0: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
8ee0: 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
8ef0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
8f00: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
8f10: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  he page */.  uns
8f20: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
8f30: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
8f40: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e  age data */.  un
8f50: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
8f60: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  p;       /* Temp
8f70: 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63   area for cell c
8f80: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  ontent */.  int 
8f90: 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20  iCellFirst;     
8fa0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
8fb0: 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69  allowable cell i
8fc0: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ndex */.  int iC
8fd0: 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20  ellLast;        
8fe0: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73       /* Last pos
8ff0: 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  sible cell index
9000: 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28 20   */...  assert( 
9010: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
9020: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
9030: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
9040: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
9050: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9060: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
9070: 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45  leSize <= SQLITE
9080: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29  _MAX_PAGE_SIZE )
9090: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
90a0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
90b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
90c0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
90d0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
90e0: 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73  x) );.  temp = s
90f0: 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
9100: 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d  pace(pPage->pBt-
9110: 3e 70 50 61 67 65 72 29 3b 0a 20 20 64 61 74 61  >pPager);.  data
9120: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
9130: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
9140: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c  hdrOffset;.  cel
9150: 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
9160: 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e  >cellOffset;.  n
9170: 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
9180: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ell;.  assert( n
9190: 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26  Cell==get2byte(&
91a0: 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a  data[hdr+3]) );.
91b0: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
91c0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
91d0: 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20  eSize;.  cbrk = 
91e0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
91f0: 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79  dr+5]);.  memcpy
9200: 28 26 74 65 6d 70 5b 63 62 72 6b 5d 2c 20 26 64  (&temp[cbrk], &d
9210: 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c  ata[cbrk], usabl
9220: 65 53 69 7a 65 20 2d 20 63 62 72 6b 29 3b 0a 20  eSize - cbrk);. 
9230: 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69   cbrk = usableSi
9240: 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74  ze;.  iCellFirst
9250: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
9260: 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c  2*nCell;.  iCell
9270: 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a  Last = usableSiz
9280: 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30  e - 4;.  for(i=0
9290: 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
92a0: 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20  .    u8 *pAddr; 
92b0: 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20      /* The i-th 
92c0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
92d0: 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74      pAddr = &dat
92e0: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69  a[cellOffset + i
92f0: 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65  *2];.    pc = ge
9300: 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20  t2byte(pAddr);. 
9310: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
9320: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
9330: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
9340: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 23 69  =iCellLast );.#i
9350: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
9360: 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
9370: 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20  E_CELL_CHECK).  
9380: 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64 69    /* These condi
9390: 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65 61  tions have alrea
93a0: 64 79 20 62 65 65 6e 20 76 65 72 69 66 69 65 64  dy been verified
93b0: 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61 67   in btreeInitPag
93c0: 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 53 51  e().    ** if SQ
93d0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52  LITE_ENABLE_OVER
93e0: 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 20  SIZE_CELL_CHECK 
93f0: 69 73 20 64 65 66 69 6e 65 64 20 0a 20 20 20 20  is defined .    
9400: 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43  */.    if( pc<iC
9410: 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69  ellFirst || pc>i
9420: 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20  CellLast ){.    
9430: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9440: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
9450: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61    }.#endif.    a
9460: 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c  ssert( pc>=iCell
9470: 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69 43 65  First && pc<=iCe
9480: 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 73 69  llLast );.    si
9490: 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ze = cellSizePtr
94a0: 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70 63  (pPage, &temp[pc
94b0: 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20  ]);.    cbrk -= 
94c0: 73 69 7a 65 3b 0a 23 69 66 20 64 65 66 69 6e 65  size;.#if define
94d0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
94e0: 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
94f0: 45 43 4b 29 0a 20 20 20 20 69 66 28 20 63 62 72  ECK).    if( cbr
9500: 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a  k<iCellFirst ){.
9510: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9520: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
9530: 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
9540: 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c    if( cbrk<iCell
9550: 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65  First || pc+size
9560: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
9570: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
9580: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
9590: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
95a0: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73    assert( cbrk+s
95b0: 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize<=usableSize 
95c0: 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  && cbrk>=iCellFi
95d0: 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  rst );.    testc
95e0: 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d  ase( cbrk+size==
95f0: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
9600: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
9610: 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize==usableSize 
9620: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
9630: 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74 65 6d 70  ata[cbrk], &temp
9640: 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20  [pc], size);.   
9650: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
9660: 20 63 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73   cbrk);.  }.  as
9670: 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c  sert( cbrk>=iCel
9680: 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32  lFirst );.  put2
9690: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
96a0: 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61  ], cbrk);.  data
96b0: 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+1] = 0;.  d
96c0: 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a  ata[hdr+2] = 0;.
96d0: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
96e0: 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  0;.  memset(&dat
96f0: 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30  a[iCellFirst], 0
9700: 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73  , cbrk-iCellFirs
9710: 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t);.  assert( sq
9720: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
9730: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
9740: 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 63  Page) );.  if( c
9750: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d  brk-iCellFirst!=
9760: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a  pPage->nFree ){.
9770: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9780: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
9790: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
97a0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
97b0: 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20   Allocate nByte 
97c0: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
97d0: 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42  rom within the B
97e0: 2d 54 72 65 65 20 70 61 67 65 20 70 61 73 73 65  -Tree page passe
97f0: 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73  d.** as the firs
9800: 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72 69 74  t argument. Writ
9810: 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74 68 65  e into *pIdx the
9820: 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67   index into pPag
9830: 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66  e->aData[].** of
9840: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
9850: 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61  of allocated spa
9860: 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74 68 65  ce. Return eithe
9870: 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a  r SQLITE_OK or.*
9880: 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * an error code 
9890: 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f  (usually SQLITE_
98a0: 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20  CORRUPT)..**.** 
98b0: 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61  The caller guara
98c0: 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 72 65  ntees that there
98d0: 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 73   is sufficient s
98e0: 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65  pace to make the
98f0: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  .** allocation. 
9900: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   This routine mi
9910: 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65 66 72  ght need to defr
9920: 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 20  agment in order 
9930: 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20  to bring.** all 
9940: 74 68 65 20 73 70 61 63 65 20 74 6f 67 65 74 68  the space togeth
9950: 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20 54 68  er, however.  Th
9960: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
9970: 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74  avoid using.** t
9980: 68 65 20 66 69 72 73 74 20 74 77 6f 20 62 79 74  he first two byt
9990: 65 73 20 70 61 73 74 20 74 68 65 20 63 65 6c 6c  es past the cell
99a0: 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20 73 69   pointer area si
99b0: 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79 20 74  nce presumably t
99c0: 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  his.** allocatio
99d0: 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64 65 20  n is being made 
99e0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 73 65  in order to inse
99f0: 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73  rt a new cell, s
9a00: 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73  o we will.** als
9a10: 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69 6e 67  o end up needing
9a20: 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e   a new cell poin
9a30: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ter..*/.static i
9a40: 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65  nt allocateSpace
9a50: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
9a60: 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20   int nByte, int 
9a70: 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20  *pIdx){.  const 
9a80: 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d  int hdr = pPage-
9a90: 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f  >hdrOffset;    /
9aa0: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
9ab0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
9ac0: 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73  t */.  u8 * cons
9ad0: 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  t data = pPage->
9ae0: 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c  aData;      /* L
9af0: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50  ocal cache of pP
9b00: 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
9b10: 69 6e 74 20 6e 46 72 61 67 3b 20 20 20 20 20 20  int nFrag;      
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9b40: 66 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74  f fragmented byt
9b50: 65 73 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20  es on pPage */. 
9b60: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
9b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b80: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
9b90: 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74  yte of cell cont
9ba0: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
9bb0: 74 20 67 61 70 3b 20 20 20 20 20 20 20 20 2f 2a  t gap;        /*
9bc0: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 67   First byte of g
9bd0: 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 20  ap between cell 
9be0: 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63 65 6c  pointers and cel
9bf0: 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69  l content */.  i
9c00: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f  nt rc;         /
9c10: 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e  * Integer return
9c20: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 75   code */.  int u
9c30: 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73  sableSize; /* Us
9c40: 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 74 68 65  able size of the
9c50: 20 70 61 67 65 20 2a 2f 0a 20 20 0a 20 20 61 73   page */.  .  as
9c60: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
9c70: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
9c80: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
9c90: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9ca0: 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
9cb0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
9cc0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
9cd0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
9ce0: 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29  sert( nByte>=0 )
9cf0: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65  ;  /* Minimum ce
9d00: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
9d10: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9d20: 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b  >nFree>=nByte );
9d30: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9d40: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
9d50: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
9d60: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
9d70: 62 6c 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  bleSize;.  asser
9d80: 74 28 20 6e 42 79 74 65 20 3c 20 75 73 61 62 6c  t( nByte < usabl
9d90: 65 53 69 7a 65 2d 38 20 29 3b 0a 0a 20 20 6e 46  eSize-8 );..  nF
9da0: 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  rag = data[hdr+7
9db0: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
9dc0: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
9dd0: 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70  = hdr + 12 - 4*p
9de0: 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
9df0: 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  gap = pPage->cel
9e00: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
9e10: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 74 6f 70 20  e->nCell;.  top 
9e20: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
9e30: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
9e40: 0a 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29  .  if( gap>top )
9e50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9e60: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 74  ORRUPT_BKPT;.  t
9e70: 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 3d 3d  estcase( gap+2==
9e80: 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73  top );.  testcas
9e90: 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b  e( gap+1==top );
9ea0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
9eb0: 3d 3d 74 6f 70 20 29 3b 0a 0a 20 20 69 66 28 20  ==top );..  if( 
9ec0: 6e 46 72 61 67 3e 3d 36 30 20 29 7b 0a 20 20 20  nFrag>=60 ){.   
9ed0: 20 2f 2a 20 41 6c 77 61 79 73 20 64 65 66 72 61   /* Always defra
9ee0: 67 6d 65 6e 74 20 68 69 67 68 6c 79 20 66 72 61  gment highly fra
9ef0: 67 6d 65 6e 74 65 64 20 70 61 67 65 73 20 2a 2f  gmented pages */
9f00: 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67  .    rc = defrag
9f10: 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b  mentPage(pPage);
9f20: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
9f30: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70  turn rc;.    top
9f40: 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65   = get2byteNotZe
9f50: 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  ro(&data[hdr+5])
9f60: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67 61  ;.  }else if( ga
9f70: 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20  p+2<=top ){.    
9f80: 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 72  /* Search the fr
9f90: 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66  eelist looking f
9fa0: 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62  or a free slot b
9fb0: 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74  ig enough to sat
9fc0: 69 73 66 79 20 0a 20 20 20 20 2a 2a 20 74 68 65  isfy .    ** the
9fd0: 20 72 65 71 75 65 73 74 2e 20 54 68 65 20 61 6c   request. The al
9fe0: 6c 6f 63 61 74 69 6f 6e 20 69 73 20 6d 61 64 65  location is made
9ff0: 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20   from the first 
a000: 66 72 65 65 20 73 6c 6f 74 20 69 6e 20 0a 20 20  free slot in .  
a010: 20 20 2a 2a 20 74 68 65 20 6c 69 73 74 20 74 68    ** the list th
a020: 61 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  at is large enou
a030: 67 68 20 74 6f 20 61 63 63 6f 6d 6d 6f 64 61 74  gh to accommodat
a040: 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  e it..    */.   
a050: 20 69 6e 74 20 70 63 2c 20 61 64 64 72 3b 0a 20   int pc, addr;. 
a060: 20 20 20 66 6f 72 28 61 64 64 72 3d 68 64 72 2b     for(addr=hdr+
a070: 31 3b 20 28 70 63 20 3d 20 67 65 74 32 62 79 74  1; (pc = get2byt
a080: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e  e(&data[addr]))>
a090: 30 3b 20 61 64 64 72 3d 70 63 29 7b 0a 20 20 20  0; addr=pc){.   
a0a0: 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20     int size;    
a0b0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
a0c0: 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c 6f 74  of the free slot
a0d0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 63   */.      if( pc
a0e0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c  >usableSize-4 ||
a0f0: 20 70 63 3c 61 64 64 72 2b 34 20 29 7b 0a 20 20   pc<addr+4 ){.  
a100: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
a110: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
a120: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a130: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
a140: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
a150: 20 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42      if( size>=nB
a160: 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  yte ){.        i
a170: 6e 74 20 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42  nt x = size - nB
a180: 79 74 65 3b 0a 20 20 20 20 20 20 20 20 74 65 73  yte;.        tes
a190: 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20  tcase( x==4 );. 
a1a0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
a1b0: 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 20   x==3 );.       
a1c0: 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20   if( x<4 ){.    
a1d0: 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
a1e0: 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68  the slot from th
a1f0: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64  e free-list. Upd
a200: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
a210: 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  f.          ** f
a220: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20  ragmented bytes 
a230: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
a240: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65   */.          me
a250: 6d 63 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d  mcpy(&data[addr]
a260: 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b  , &data[pc], 2);
a270: 0a 20 20 20 20 20 20 20 20 20 20 64 61 74 61 5b  .          data[
a280: 68 64 72 2b 37 5d 20 3d 20 28 75 38 29 28 6e 46  hdr+7] = (u8)(nF
a290: 72 61 67 20 2b 20 78 29 3b 0a 20 20 20 20 20 20  rag + x);.      
a2a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 69 7a 65    }else if( size
a2b0: 2b 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65  +pc > usableSize
a2c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
a2d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
a2e0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
a2f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a300: 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72     /* The slot r
a310: 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72  emains on the fr
a320: 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20  ee-list. Reduce 
a330: 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f  its size to acco
a340: 75 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  unt.          **
a350: 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e   for the portion
a360: 20 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77   used by the new
a370: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a   allocation. */.
a380: 20 20 20 20 20 20 20 20 20 20 70 75 74 32 62 79            put2by
a390: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20  te(&data[pc+2], 
a3a0: 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  x);.        }.  
a3b0: 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 70 63        *pIdx = pc
a3c0: 20 2b 20 78 3b 0a 20 20 20 20 20 20 20 20 72 65   + x;.        re
a3d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a3e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a3f0: 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  }..  /* Check to
a400: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   make sure there
a410: 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65   is enough space
a420: 20 69 6e 20 74 68 65 20 67 61 70 20 74 6f 20 73   in the gap to s
a430: 61 74 69 73 66 79 0a 20 20 2a 2a 20 74 68 65 20  atisfy.  ** the 
a440: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 49 66 20  allocation.  If 
a450: 6e 6f 74 2c 20 64 65 66 72 61 67 6d 65 6e 74 2e  not, defragment.
a460: 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
a470: 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74  ( gap+2+nByte==t
a480: 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b  op );.  if( gap+
a490: 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20  2+nByte>top ){. 
a4a0: 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65     rc = defragme
a4b0: 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  ntPage(pPage);. 
a4c0: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
a4d0: 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d  rn rc;.    top =
a4e0: 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f   get2byteNotZero
a4f0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
a500: 20 20 20 20 61 73 73 65 72 74 28 20 67 61 70 2b      assert( gap+
a510: 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20  nByte<=top );.  
a520: 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  }...  /* Allocat
a530: 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68  e memory from th
a540: 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e  e gap in between
a550: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
a560: 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64  r array.  ** and
a570: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
a580: 74 20 61 72 65 61 2e 20 20 54 68 65 20 62 74 72  t area.  The btr
a590: 65 65 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c  eeInitPage() cal
a5a0: 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20  l has already.  
a5b0: 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68 65  ** validated the
a5c0: 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65   freelist.  Give
a5d0: 6e 20 74 68 61 74 20 74 68 65 20 66 72 65 65 6c  n that the freel
a5e0: 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68  ist is valid, th
a5f0: 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77  ere.  ** is no w
a600: 61 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f  ay that the allo
a610: 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e  cation can exten
a620: 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  d off the end of
a630: 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20   the page..  ** 
a640: 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65 6c  The assert() bel
a650: 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 65 20  ow verifies the 
a660: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
a670: 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d  e..  */.  top -=
a680: 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79   nByte;.  put2by
a690: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
a6a0: 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28   top);.  assert(
a6b0: 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69   top+nByte <= (i
a6c0: 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  nt)pPage->pBt->u
a6d0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a  sableSize );.  *
a6e0: 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65  pIdx = top;.  re
a6f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a700: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
a710: 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  a section of the
a720: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f   pPage->aData to
a730: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
a740: 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
a750: 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65   of the new free
a760: 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d   block is pPage-
a770: 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a  >aDisk[start].**
a780: 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
a790: 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 22 73   the block is "s
a7a0: 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  ize" bytes..**.*
a7b0: 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 65 66  * Most of the ef
a7c0: 66 6f 72 74 20 68 65 72 65 20 69 73 20 69 6e 76  fort here is inv
a7d0: 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65 73 69  olved in coalesi
a7e0: 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66  ng adjacent.** f
a7f0: 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20  ree blocks into 
a800: 61 20 73 69 6e 67 6c 65 20 62 69 67 20 66 72 65  a single big fre
a810: 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  e block..*/.stat
a820: 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65  ic int freeSpace
a830: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
a840: 20 69 6e 74 20 73 74 61 72 74 2c 20 69 6e 74 20   int start, int 
a850: 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64 64  size){.  int add
a860: 72 2c 20 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a  r, pbegin, hdr;.
a870: 20 20 69 6e 74 20 69 4c 61 73 74 3b 20 20 20 20    int iLast;    
a880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a890: 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 70      /* Largest p
a8a0: 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c 6f 63  ossible freebloc
a8b0: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 6e  k offset */.  un
a8c0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
a8d0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
a8e0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
a8f0: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
a900: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
a910: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
a920: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
a930: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61  );.  assert( sta
a940: 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt>=pPage->hdrOf
a950: 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68  fset+6+pPage->ch
a960: 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a 20 20  ildPtrSize );.  
a970: 61 73 73 65 72 74 28 20 28 73 74 61 72 74 20 2b  assert( (start +
a980: 20 73 69 7a 65 29 20 3c 3d 20 28 69 6e 74 29 70   size) <= (int)p
a990: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
a9a0: 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  eSize );.  asser
a9b0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
a9c0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
a9d0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
a9e0: 73 65 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b  sert( size>=0 );
a9f0: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65     /* Minimum ce
aa00: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
aa10: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42  .  if( pPage->pB
aa20: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
aa30: 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
aa40: 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72  ){.    /* Overwr
aa50: 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
aa60: 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
aa70: 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 75  os when the secu
aa80: 72 65 5f 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a  re_delete.    **
aa90: 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
aaa0: 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  ed */.    memset
aab0: 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30  (&data[start], 0
aac0: 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  , size);.  }..  
aad0: 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61 63 65  /* Add the space
aae0: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c   back into the l
aaf0: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72  inked list of fr
ab00: 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74 65 20  eeblocks.  Note 
ab10: 74 68 61 74 0a 20 20 2a 2a 20 65 76 65 6e 20 74  that.  ** even t
ab20: 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c  hough the freebl
ab30: 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65  ock list was che
ab40: 63 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e 69  cked by btreeIni
ab50: 74 50 61 67 65 28 29 2c 0a 20 20 2a 2a 20 62 74  tPage(),.  ** bt
ab60: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 64 69  reeInitPage() di
ab70: 64 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65  d not detect ove
ab80: 72 6c 61 70 70 69 6e 67 20 63 65 6c 6c 73 20 6f  rlapping cells o
ab90: 72 0a 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b  r.  ** freeblock
aba0: 73 20 74 68 61 74 20 6f 76 65 72 6c 61 70 70 65  s that overlappe
abb0: 64 20 63 65 6c 6c 73 2e 20 20 20 4e 6f 72 20 64  d cells.   Nor d
abc0: 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 77 68  oes it detect wh
abd0: 65 6e 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  en the.  ** cell
abe0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 65 78   content area ex
abf0: 63 65 65 64 73 20 74 68 65 20 76 61 6c 75 65 20  ceeds the value 
ac00: 69 6e 20 74 68 65 20 70 61 67 65 20 68 65 61 64  in the page head
ac10: 65 72 2e 20 20 49 66 20 74 68 65 73 65 0a 20 20  er.  If these.  
ac20: 2a 2a 20 73 69 74 75 61 74 69 6f 6e 73 20 61 72  ** situations ar
ac30: 69 73 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71  ise, then subseq
ac40: 75 65 6e 74 20 69 6e 73 65 72 74 20 6f 70 65 72  uent insert oper
ac50: 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 63 6f 72  ations might cor
ac60: 72 75 70 74 0a 20 20 2a 2a 20 74 68 65 20 66 72  rupt.  ** the fr
ac70: 65 65 6c 69 73 74 2e 20 20 53 6f 20 77 65 20 64  eelist.  So we d
ac80: 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20  o need to check 
ac90: 66 6f 72 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  for corruption w
aca0: 68 69 6c 65 20 73 63 61 6e 6e 69 6e 67 0a 20 20  hile scanning.  
acb0: 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  ** the freelist.
acc0: 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50  .  */.  hdr = pP
acd0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
ace0: 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31    addr = hdr + 1
acf0: 3b 0a 20 20 69 4c 61 73 74 20 3d 20 70 50 61 67  ;.  iLast = pPag
ad00: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
ad10: 7a 65 20 2d 20 34 3b 0a 20 20 61 73 73 65 72 74  ze - 4;.  assert
ad20: 28 20 73 74 61 72 74 3c 3d 69 4c 61 73 74 20 29  ( start<=iLast )
ad30: 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67  ;.  while( (pbeg
ad40: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
ad50: 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72  ata[addr]))<star
ad60: 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b  t && pbegin>0 ){
ad70: 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 3c  .    if( pbegin<
ad80: 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20  addr+4 ){.      
ad90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
ada0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
adb0: 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62 65  }.    addr = pbe
adc0: 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  gin;.  }.  if( p
add0: 62 65 67 69 6e 3e 69 4c 61 73 74 20 29 7b 0a 20  begin>iLast ){. 
ade0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
adf0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
ae00: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62 65   }.  assert( pbe
ae10: 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67  gin>addr || pbeg
ae20: 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62  in==0 );.  put2b
ae30: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  yte(&data[addr],
ae40: 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62   start);.  put2b
ae50: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d  yte(&data[start]
ae60: 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74  , pbegin);.  put
ae70: 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72  2byte(&data[star
ae80: 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70  t+2], size);.  p
ae90: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50  Page->nFree = pP
aea0: 61 67 65 2d 3e 6e 46 72 65 65 20 2b 20 28 75 31  age->nFree + (u1
aeb0: 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f  6)size;..  /* Co
aec0: 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20  alesce adjacent 
aed0: 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20  free blocks */. 
aee0: 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b   addr = hdr + 1;
aef0: 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69  .  while( (pbegi
af00: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
af10: 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a  ta[addr]))>0 ){.
af20: 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70      int pnext, p
af30: 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73 73  size, x;.    ass
af40: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
af50: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
af60: 70 62 65 67 69 6e 20 3c 3d 20 28 69 6e 74 29 70  pbegin <= (int)p
af70: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
af80: 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70  eSize-4 );.    p
af90: 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28  next = get2byte(
afa0: 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a  &data[pbegin]);.
afb0: 20 20 20 20 70 73 69 7a 65 20 3d 20 67 65 74 32      psize = get2
afc0: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
afd0: 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70  n+2]);.    if( p
afe0: 62 65 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20  begin + psize + 
aff0: 33 20 3e 3d 20 70 6e 65 78 74 20 26 26 20 70 6e  3 >= pnext && pn
b000: 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  ext>0 ){.      i
b010: 6e 74 20 66 72 61 67 20 3d 20 70 6e 65 78 74 20  nt frag = pnext 
b020: 2d 20 28 70 62 65 67 69 6e 2b 70 73 69 7a 65 29  - (pbegin+psize)
b030: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 66 72 61  ;.      if( (fra
b040: 67 3c 30 29 20 7c 7c 20 28 66 72 61 67 3e 28 69  g<0) || (frag>(i
b050: 6e 74 29 64 61 74 61 5b 68 64 72 2b 37 5d 29 20  nt)data[hdr+7]) 
b060: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
b070: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
b080: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
b090: 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d       data[hdr+7]
b0a0: 20 2d 3d 20 28 75 38 29 66 72 61 67 3b 0a 20 20   -= (u8)frag;.  
b0b0: 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74 65      x = get2byte
b0c0: 28 26 64 61 74 61 5b 70 6e 65 78 74 5d 29 3b 0a  (&data[pnext]);.
b0d0: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
b0e0: 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 78 29  data[pbegin], x)
b0f0: 3b 0a 20 20 20 20 20 20 78 20 3d 20 70 6e 65 78  ;.      x = pnex
b100: 74 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61  t + get2byte(&da
b110: 74 61 5b 70 6e 65 78 74 2b 32 5d 29 20 2d 20 70  ta[pnext+2]) - p
b120: 62 65 67 69 6e 3b 0a 20 20 20 20 20 20 70 75 74  begin;.      put
b130: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
b140: 69 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 7d  in+2], x);.    }
b150: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72  else{.      addr
b160: 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 7d   = pbegin;.    }
b170: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
b180: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
b190: 72 65 61 20 62 65 67 69 6e 73 20 77 69 74 68 20  rea begins with 
b1a0: 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65 6d  a freeblock, rem
b1b0: 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  ove it. */.  if(
b1c0: 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64 61   data[hdr+1]==da
b1d0: 74 61 5b 68 64 72 2b 35 5d 20 26 26 20 64 61 74  ta[hdr+5] && dat
b1e0: 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b 68  a[hdr+2]==data[h
b1f0: 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e 74  dr+6] ){.    int
b200: 20 74 6f 70 3b 0a 20 20 20 20 70 62 65 67 69 6e   top;.    pbegin
b210: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
b220: 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6d  a[hdr+1]);.    m
b230: 65 6d 63 70 79 28 26 64 61 74 61 5b 68 64 72 2b  emcpy(&data[hdr+
b240: 31 5d 2c 20 26 64 61 74 61 5b 70 62 65 67 69 6e  1], &data[pbegin
b250: 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70 20 3d  ], 2);.    top =
b260: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b270: 68 64 72 2b 35 5d 29 20 2b 20 67 65 74 32 62 79  hdr+5]) + get2by
b280: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b  te(&data[pbegin+
b290: 32 5d 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  2]);.    put2byt
b2a0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
b2b0: 74 6f 70 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  top);.  }.  asse
b2c0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
b2d0: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
b2e0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
b2f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b300: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f  K;.}../*.** Deco
b310: 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  de the flags byt
b320: 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74  e (the first byt
b330: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29  e of the header)
b340: 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61   for a page.** a
b350: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69  nd initialize fi
b360: 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  elds of the MemP
b370: 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63  age structure ac
b380: 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a  cordingly..**.**
b390: 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77   Only the follow
b3a0: 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ing combinations
b3b0: 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20   are supported. 
b3c0: 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72   Anything differ
b3d0: 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73  ent.** indicates
b3e0: 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
b3f0: 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a  ase files:.**.**
b400: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
b410: 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20  ODATA.**        
b420: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20   PTF_ZERODATA | 
b430: 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20  PTF_LEAF.**     
b440: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
b450: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a   | PTF_INTKEY.**
b460: 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41           PTF_LEA
b470: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
b480: 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f  EY | PTF_LEAF.*/
b490: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f  .static int deco
b4a0: 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20  deFlags(MemPage 
b4b0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
b4c0: 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Byte){.  BtShare
b4d0: 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41  d *pBt;     /* A
b4e0: 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e   copy of pPage->
b4f0: 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  pBt */..  assert
b500: 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  ( pPage->hdrOffs
b510: 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f  et==(pPage->pgno
b520: 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29  ==1 ? 100 : 0) )
b530: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
b540: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
b550: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
b560: 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65  ) );.  pPage->le
b570: 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79  af = (u8)(flagBy
b580: 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28  te>>3);  assert(
b590: 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c   PTF_LEAF == 1<<
b5a0: 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20  3 );.  flagByte 
b5b0: 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20  &= ~PTF_LEAF;.  
b5c0: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
b5d0: 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d  ize = 4-4*pPage-
b5e0: 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d 20 70  >leaf;.  pBt = p
b5f0: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28  Page->pBt;.  if(
b600: 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f   flagByte==(PTF_
b610: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
b620: 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 70 50  NTKEY) ){.    pP
b630: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b  age->intKey = 1;
b640: 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44  .    pPage->hasD
b650: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61  ata = pPage->lea
b660: 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  f;.    pPage->ma
b670: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
b680: 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  xLeaf;.    pPage
b690: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
b6a0: 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c  ->minLeaf;.  }el
b6b0: 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  se if( flagByte=
b6c0: 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b  =PTF_ZERODATA ){
b6d0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
b6e0: 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ey = 0;.    pPag
b6f0: 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 30 3b 0a  e->hasData = 0;.
b700: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f      pPage->maxLo
b710: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f  cal = pBt->maxLo
b720: 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  cal;.    pPage->
b730: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  minLocal = pBt->
b740: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73  minLocal;.  }els
b750: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
b760: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
b770: 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  T;.  }.  pPage->
b780: 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
b790: 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50  = pBt->max1byteP
b7a0: 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e  ayload;.  return
b7b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
b7c0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
b7d0: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e  the auxiliary in
b7e0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
b7f0: 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  disk block..**.*
b800: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
b810: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  OK on success.  
b820: 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74  If we see that t
b830: 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20  he page does.** 
b840: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65  not contain a we
b850: 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61  ll-formed databa
b860: 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65  se page, then re
b870: 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
b880: 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74  CORRUPT.  Note t
b890: 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20  hat a return of 
b8a0: 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e  SQLITE_OK does n
b8b0: 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20  ot.** guarantee 
b8c0: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
b8d0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49   well-formed.  I
b8e0: 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61  t only shows tha
b8f0: 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74  t.** we failed t
b900: 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72  o detect any cor
b910: 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
b920: 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74  ic int btreeInit
b930: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
b940: 61 67 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28  age){..  assert(
b950: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
b960: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
b970: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
b980: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
b990: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
b9a0: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69  Page->pgno==sqli
b9b0: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
b9c0: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
b9d0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
b9e0: 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33  pPage == sqlite3
b9f0: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
ba00: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
ba10: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
ba20: 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74  ->aData == sqlit
ba30: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
ba40: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
ba50: 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  ;..  if( !pPage-
ba60: 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75  >isInit ){.    u
ba70: 31 36 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  16 pc;          
ba80: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
ba90: 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68  a freeblock with
baa0: 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  in pPage->aData[
bab0: 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b  ] */.    u8 hdr;
bac0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
bad0: 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69  ffset to beginni
bae0: 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65  ng of page heade
baf0: 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74  r */.    u8 *dat
bb00: 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  a;          /* E
bb10: 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61  qual to pPage->a
bb20: 44 61 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68  Data */.    BtSh
bb30: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
bb40: 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74    /* The main bt
bb50: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
bb60: 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53  .    int usableS
bb70: 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e  ize;    /* Amoun
bb80: 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63  t of usable spac
bb90: 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
bba0: 2f 0a 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66  /.    u16 cellOf
bbb0: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73  fset;    /* Offs
bbc0: 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66  et from start of
bbd0: 20 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63   page to first c
bbe0: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
bbf0: 20 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20     int nFree;   
bc00: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
bc10: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
bc20: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
bc30: 20 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20     int top;     
bc40: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
bc50: 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  yte of the cell 
bc60: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
bc70: 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72      int iCellFir
bc80: 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20  st;    /* First 
bc90: 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f  allowable cell o
bca0: 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73  r freeblock offs
bcb0: 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  et */.    int iC
bcc0: 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20  ellLast;     /* 
bcd0: 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65  Last possible ce
bce0: 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20  ll or freeblock 
bcf0: 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70  offset */..    p
bd00: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
bd10: 0a 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61 67  ..    hdr = pPag
bd20: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
bd30: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
bd40: 61 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 64  aData;.    if( d
bd50: 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
bd60: 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72  , data[hdr]) ) r
bd70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
bd80: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61  RUPT_BKPT;.    a
bd90: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65  ssert( pBt->page
bda0: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74  Size>=512 && pBt
bdb0: 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33  ->pageSize<=6553
bdc0: 36 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  6 );.    pPage->
bdd0: 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29  maskPage = (u16)
bde0: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
bdf0: 20 31 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e   1);.    pPage->
be00: 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
be10: 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20     usableSize = 
be20: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
be30: 0a 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c  .    pPage->cell
be40: 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66  Offset = cellOff
be50: 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d  set = hdr + 12 -
be60: 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a   4*pPage->leaf;.
be70: 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61      pPage->aData
be80: 45 6e 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62  End = &data[usab
be90: 6c 65 53 69 7a 65 5d 3b 0a 20 20 20 20 70 50 61  leSize];.    pPa
bea0: 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26  ge->aCellIdx = &
beb0: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d  data[cellOffset]
bec0: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
bed0: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
bee0: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70  a[hdr+5]);.    p
bef0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65  Page->nCell = ge
bf00: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
bf10: 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50  +3]);.    if( pP
bf20: 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45  age->nCell>MX_CE
bf30: 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  LL(pBt) ){.     
bf40: 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c   /* To many cell
bf50: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70  s for a single p
bf60: 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d  age.  The page m
bf70: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a  ust be corrupt *
bf80: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
bf90: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
bfa0: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65  PT;.    }.    te
bfb0: 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e  stcase( pPage->n
bfc0: 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42  Cell==MX_CELL(pB
bfd0: 74 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20  t) );..    /* A 
bfe0: 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61  malformed databa
bff0: 73 65 20 70 61 67 65 20 6d 69 67 68 74 20 63 61  se page might ca
c000: 75 73 65 20 75 73 20 74 6f 20 72 65 61 64 20 70  use us to read p
c010: 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20  ast the end.    
c020: 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20  ** of page when 
c030: 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20  parsing a cell. 
c040: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
c050: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
c060: 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63  ock of code chec
c070: 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20  ks early to see 
c080: 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64  if a cell extend
c090: 73 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  s.    ** past th
c0a0: 65 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20  e end of a page 
c0b0: 62 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75  boundary and cau
c0c0: 73 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  ses SQLITE_CORRU
c0d0: 50 54 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a  PT to be .    **
c0e0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 20   returned if it 
c0f0: 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  does..    */.   
c100: 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65   iCellFirst = ce
c110: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
c120: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69  ge->nCell;.    i
c130: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
c140: 65 53 69 7a 65 20 2d 20 34 3b 0a 23 69 66 20 64  eSize - 4;.#if d
c150: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
c160: 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45  ABLE_OVERSIZE_CE
c170: 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 7b 0a  LL_CHECK).    {.
c180: 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20        int i;    
c190: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
c1a0: 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70   into the cell p
c1b0: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a  ointer array */.
c1c0: 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 20 20 20        int sz;   
c1d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
c1e0: 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20  of a cell */..  
c1f0: 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
c200: 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74  leaf ) iCellLast
c210: 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  --;.      for(i=
c220: 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; i<pPage->nCel
c230: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
c240: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
c250: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b  data[cellOffset+
c260: 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  i*2]);.        t
c270: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
c280: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20  llFirst );.     
c290: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
c2a0: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
c2b0: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65        if( pc<iCe
c2c0: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43  llFirst || pc>iC
c2d0: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
c2e0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c2f0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
c300: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c310: 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65     sz = cellSize
c320: 50 74 72 28 70 50 61 67 65 2c 20 26 64 61 74 61  Ptr(pPage, &data
c330: 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  [pc]);.        t
c340: 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d  estcase( pc+sz==
c350: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
c360: 20 20 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e        if( pc+sz>
c370: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
c380: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
c390: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c3a0: 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  PT;.        }.  
c3b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
c3c0: 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69  !pPage->leaf ) i
c3d0: 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20  CellLast++;.    
c3e0: 7d 20 20 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  }  .#endif..    
c3f0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  /* Compute the t
c400: 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20  otal free space 
c410: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
c420: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
c430: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
c440: 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61      nFree = data
c450: 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 0a 20  [hdr+7] + top;. 
c460: 20 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29     while( pc>0 )
c470: 7b 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78 74  {.      u16 next
c480: 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  , size;.      if
c490: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
c4a0: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
c4b0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 74  ){.        /* St
c4c0: 61 72 74 20 6f 66 20 66 72 65 65 20 62 6c 6f 63  art of free bloc
c4d0: 6b 20 69 73 20 6f 66 66 20 74 68 65 20 70 61 67  k is off the pag
c4e0: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74  e */.        ret
c4f0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c500: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20  PT_BKPT; .      
c510: 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67  }.      next = g
c520: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
c530: 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d  ]);.      size =
c540: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c550: 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  pc+2]);.      if
c560: 28 20 28 6e 65 78 74 3e 30 20 26 26 20 6e 65 78  ( (next>0 && nex
c570: 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 29 20 7c 7c  t<=pc+size+3) ||
c580: 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53   pc+size>usableS
c590: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ize ){.        /
c5a0: 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75  * Free blocks mu
c5b0: 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69  st be in ascendi
c5c0: 6e 67 20 6f 72 64 65 72 2e 20 41 6e 64 20 74 68  ng order. And th
c5d0: 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 20  e last byte of. 
c5e0: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72         ** the fr
c5f0: 65 65 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69  ee-block must li
c600: 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  e on the databas
c610: 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20  e page.  */.    
c620: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c630: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
c640: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
c650: 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73  Free = nFree + s
c660: 69 7a 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20  ize;.      pc = 
c670: 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  next;.    }..   
c680: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
c690: 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e  t, nFree contain
c6a0: 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
c6b0: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
c6c0: 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74  tart.    ** of t
c6d0: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
c6e0: 61 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75  area plus the nu
c6f0: 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74  mber of free byt
c700: 65 73 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a  es within.    **
c710: 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
c720: 74 20 61 72 65 61 2e 20 49 66 20 74 68 69 73 20  t area. If this 
c730: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
c740: 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a  the usable-size.
c750: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61      ** of the pa
c760: 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ge, then the pag
c770: 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
c780: 74 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20  ted. This check 
c790: 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76  also.    ** serv
c7a0: 65 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  es to verify tha
c7b0: 74 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  t the offset to 
c7c0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
c7d0: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20   cell-content.  
c7e0: 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72    ** area, accor
c7f0: 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65  ding to the page
c800: 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69   header, lies wi
c810: 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20  thin the page.. 
c820: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46     */.    if( nF
c830: 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ree>usableSize )
c840: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
c850: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c860: 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70  PT; .    }.    p
c870: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75  Page->nFree = (u
c880: 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c  16)(nFree - iCel
c890: 6c 46 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61  lFirst);.    pPa
c8a0: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
c8b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
c8c0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
c8d0: 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61   Set up a raw pa
c8e0: 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f  ge so that it lo
c8f0: 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62  oks like a datab
c900: 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67  ase page holding
c910: 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a  .** no entries..
c920: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a  */.static void z
c930: 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20  eroPage(MemPage 
c940: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
c950: 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
c960: 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
c970: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68  e->aData;.  BtSh
c980: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
c990: 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72  e->pBt;.  u8 hdr
c9a0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
c9b0: 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74  set;.  u16 first
c9c0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
c9d0: 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
c9e0: 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ber(pPage->pDbPa
c9f0: 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ge)==pPage->pgno
ca00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
ca10: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
ca20: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
ca30: 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
ca40: 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
ca50: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
ca60: 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
ca70: 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20  ge) == data );. 
ca80: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ca90: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
caa0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
cab0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
cac0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
cad0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
cae0: 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
caf0: 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
cb00: 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d  _DELETE ){.    m
cb10: 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d  emset(&data[hdr]
cb20: 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  , 0, pBt->usable
cb30: 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d  Size - hdr);.  }
cb40: 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28  .  data[hdr] = (
cb50: 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69  char)flags;.  fi
cb60: 72 73 74 20 3d 20 68 64 72 20 2b 20 28 28 66 6c  rst = hdr + ((fl
cb70: 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30  ags&PTF_LEAF)==0
cb80: 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65   ? 12 : 8);.  me
cb90: 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31  mset(&data[hdr+1
cba0: 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61  ], 0, 4);.  data
cbb0: 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70  [hdr+7] = 0;.  p
cbc0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
cbd0: 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c  r+5], pBt->usabl
cbe0: 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d  eSize);.  pPage-
cbf0: 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 70  >nFree = (u16)(p
cc00: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
cc10: 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64   first);.  decod
cc20: 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c  eFlags(pPage, fl
cc30: 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63  ags);.  pPage->c
cc40: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73  ellOffset = firs
cc50: 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  t;.  pPage->aDat
cc60: 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74  aEnd = &data[pBt
cc70: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20  ->usableSize];. 
cc80: 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
cc90: 20 3d 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b   = &data[first];
cca0: 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  .  pPage->nOverf
ccb0: 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  low = 0;.  asser
ccc0: 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  t( pBt->pageSize
ccd0: 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61  >=512 && pBt->pa
cce0: 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b  geSize<=65536 );
ccf0: 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  .  pPage->maskPa
cd00: 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e  ge = (u16)(pBt->
cd10: 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20  pageSize - 1);. 
cd20: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
cd30: 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  0;.  pPage->isIn
cd40: 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  it = 1;.}.../*.*
cd50: 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61  * Convert a DbPa
cd60: 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ge obtained from
cd70: 20 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20   the pager into 
cd80: 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62  a MemPage used b
cd90: 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c  y.** the btree l
cda0: 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ayer..*/.static 
cdb0: 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61  MemPage *btreePa
cdc0: 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50  geFromDbPage(DbP
cdd0: 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67  age *pDbPage, Pg
cde0: 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65  no pgno, BtShare
cdf0: 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61  d *pBt){.  MemPa
ce00: 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d  ge *pPage = (Mem
ce10: 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67  Page*)sqlite3Pag
ce20: 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61  erGetExtra(pDbPa
ce30: 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44  ge);.  pPage->aD
ce40: 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ata = sqlite3Pag
ce50: 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
ce60: 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62  e);.  pPage->pDb
ce70: 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a  Page = pDbPage;.
ce80: 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70    pPage->pBt = p
ce90: 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e  Bt;.  pPage->pgn
cea0: 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67  o = pgno;.  pPag
ceb0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70  e->hdrOffset = p
cec0: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20  Page->pgno==1 ? 
ced0: 31 30 30 20 3a 20 30 3b 0a 20 20 72 65 74 75 72  100 : 0;.  retur
cee0: 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a  n pPage; .}../*.
cef0: 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
cf00: 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20 49  om the pager.  I
cf10: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
cf20: 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
cf30: 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
cf40: 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
cf50: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
cf60: 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69  noContent flag i
cf70: 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20  s set, it means 
cf80: 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63  that we do not c
cf90: 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  are about.** the
cfa0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
cfb0: 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d  page at this tim
cfc0: 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f  e.  So do not go
cfd0: 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20   to the disk.** 
cfe0: 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e  to fetch the con
cff0: 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c  tent.  Just fill
d000: 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   in the content 
d010: 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e  with zeros for n
d020: 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65  ow..** If in the
d030: 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20   future we call 
d040: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
d050: 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65  e() on this page
d060: 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20  , that.** means 
d070: 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64 20  we have started 
d080: 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20  to be concerned 
d090: 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e  about content an
d0a0: 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65  d the disk.** re
d0b0: 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20  ad should occur 
d0c0: 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a  at that point..*
d0d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
d0e0: 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74 53  eeGetPage(.  BtS
d0f0: 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
d100: 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
d110: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
d120: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
d130: 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
d140: 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d  o fetch */.  Mem
d150: 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
d160: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
d170: 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72  page in this par
d180: 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ameter */.  int 
d190: 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
d1a0: 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f   /* PAGER_GET_NO
d1b0: 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52  CONTENT or PAGER
d1c0: 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f  _GET_READONLY */
d1d0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
d1e0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
d1f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ..  assert( flag
d200: 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50  s==0 || flags==P
d210: 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
d220: 4e 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47  NT || flags==PAG
d230: 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
d240: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
d250: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
d260: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
d270: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
d280: 65 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70  erAcquire(pBt->p
d290: 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62  Pager, pgno, (Db
d2a0: 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c  Page**)&pDbPage,
d2b0: 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72   flags);.  if( r
d2c0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
d2d0: 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65 65   *ppPage = btree
d2e0: 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70  PageFromDbPage(p
d2f0: 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42  DbPage, pgno, pB
d300: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  t);.  return SQL
d310: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
d320: 20 52 65 74 72 69 65 76 65 20 61 20 70 61 67 65   Retrieve a page
d330: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
d340: 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 72 65  cache. If the re
d350: 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
d360: 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  not.** already i
d370: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
d380: 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49  e return NULL. I
d390: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
d3a0: 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
d3b0: 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
d3c0: 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
d3d0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  d..*/.static Mem
d3e0: 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c  Page *btreePageL
d3f0: 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a  ookup(BtShared *
d400: 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
d410: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
d420: 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
d430: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d440: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
d450: 20 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69    pDbPage = sqli
d460: 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
d470: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
d480: 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65  );.  if( pDbPage
d490: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62   ){.    return b
d4a0: 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
d4b0: 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
d4c0: 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65  , pBt);.  }.  re
d4d0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
d4e0: 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
d4f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
d500: 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20   file in pages. 
d510: 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20  If there is any 
d520: 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72  kind of.** error
d530: 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67  , return ((unsig
d540: 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a  ned int)-1)..*/.
d550: 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65  static Pgno btre
d560: 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61  ePagecount(BtSha
d570: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74  red *pBt){.  ret
d580: 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  urn pBt->nPage;.
d590: 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74 72  }.u32 sqlite3Btr
d5a0: 65 65 4c 61 73 74 50 61 67 65 28 42 74 72 65 65  eeLastPage(Btree
d5b0: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
d5c0: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
d5d0: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
d5e0: 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d  ssert( ((p->pBt-
d5f0: 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30 30 30  >nPage)&0x800000
d600: 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  0)==0 );.  retur
d610: 6e 20 28 69 6e 74 29 62 74 72 65 65 50 61 67 65  n (int)btreePage
d620: 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d  count(p->pBt);.}
d630: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
d640: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
d650: 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  r and initialize
d660: 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69   it.  This routi
d670: 6e 65 20 69 73 20 6a 75 73 74 20 61 0a 2a 2a 20  ne is just a.** 
d680: 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70  convenience wrap
d690: 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72  per around separ
d6a0: 61 74 65 20 63 61 6c 6c 73 20 74 6f 20 62 74 72  ate calls to btr
d6b0: 65 65 47 65 74 50 61 67 65 28 29 20 61 6e 64 20  eeGetPage() and 
d6c0: 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67  .** btreeInitPag
d6d0: 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  e()..**.** If an
d6e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
d6f0: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 2a 70  hen the value *p
d700: 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
d710: 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74  is undefined. It
d720: 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75  .** may remain u
d730: 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20  nchanged, or it 
d740: 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e  may be set to an
d750: 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a   invalid value..
d760: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
d770: 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20  tAndInitPage(.  
d780: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
d790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7a0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
d7b0: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
d7c0: 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
d7d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
d7e0: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
d7f0: 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50  to get */.  MemP
d800: 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
d810: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
d820: 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f  rite the page po
d830: 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  inter here */.  
d840: 69 6e 74 20 62 52 65 61 64 6f 6e 6c 79 20 20 20  int bReadonly   
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d860: 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41  /* PAGER_GET_REA
d870: 44 4f 4e 4c 59 20 6f 72 20 30 20 2a 2f 0a 29 7b  DONLY or 0 */.){
d880: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
d890: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
d8a0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
d8b0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
d8c0: 20 62 52 65 61 64 6f 6e 6c 79 3d 3d 50 41 47 45   bReadonly==PAGE
d8d0: 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 7c  R_GET_READONLY |
d8e0: 7c 20 62 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 29  | bReadonly==0 )
d8f0: 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74  ;..  if( pgno>bt
d900: 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
d910: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  ) ){.    rc = SQ
d920: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
d930: 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
d940: 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
d950: 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50  e(pBt, pgno, ppP
d960: 61 67 65 2c 20 62 52 65 61 64 6f 6e 6c 79 29 3b  age, bReadonly);
d970: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
d980: 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70 50 61  ITE_OK && (*ppPa
d990: 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  ge)->isInit==0 )
d9a0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  {.      rc = btr
d9b0: 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61  eeInitPage(*ppPa
d9c0: 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
d9d0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
d9e0: 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
d9f0: 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
da00: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
da10: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e  .  testcase( pgn
da20: 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  o==0 );.  assert
da30: 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d  ( pgno!=0 || rc=
da40: 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
da50: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
da60: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
da70: 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69   a MemPage.  Thi
da80: 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  s should be call
da90: 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
daa0: 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74   prior.** call t
dab0: 6f 20 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a  o btreeGetPage..
dac0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
dad0: 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61  eleasePage(MemPa
dae0: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66  ge *pPage){.  if
daf0: 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61  ( pPage ){.    a
db00: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
db10: 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
db20: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
db30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
db40: 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29  ge->pDbPage!=0 )
db50: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
db60: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
db70: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
db80: 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
db90: 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ge );.    assert
dba0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
dbb0: 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
dbc0: 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44  Page)==pPage->aD
dbd0: 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
dbe0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
dbf0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
dc00: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
dc10: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
dc20: 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e  fNotNull(pPage->
dc30: 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a  pDbPage);.  }.}.
dc40: 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20  ./*.** During a 
dc50: 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74  rollback, when t
dc60: 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73  he pager reloads
dc70: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74   information int
dc80: 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73  o the cache.** s
dc90: 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65  o that the cache
dca0: 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20   is restored to 
dcb0: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
dcc0: 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  te at the start 
dcd0: 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61  of.** the transa
dce0: 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20  ction, for each 
dcf0: 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68  page restored th
dd00: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
dd10: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  lled..**.** This
dd20: 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74   routine needs t
dd30: 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72  o reset the extr
dd40: 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61  a data section a
dd50: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
dd60: 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65  .** page to agre
dd70: 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f  e with the resto
dd80: 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61  red data..*/.sta
dd90: 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69  tic void pageRei
dda0: 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74  nit(DbPage *pDat
ddb0: 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  a){.  MemPage *p
ddc0: 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20  Page;.  pPage = 
ddd0: 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74  (MemPage *)sqlit
dde0: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
ddf0: 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74  pData);.  assert
de00: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
de10: 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61  geRefcount(pData
de20: 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  )>0 );.  if( pPa
de30: 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
de40: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
de50: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
de60: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
de70: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  );.    pPage->is
de80: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66  Init = 0;.    if
de90: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
dea0: 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61  geRefcount(pData
deb0: 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  )>1 ){.      /* 
dec0: 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20  pPage might not 
ded0: 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65 3b  be a btree page;
dee0: 20 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e    it might be an
def0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20   overflow page. 
df00: 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61       ** or ptrma
df10: 70 20 70 61 67 65 20 6f 72 20 61 20 66 72 65 65  p page or a free
df20: 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65   page.  In those
df30: 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c   cases, the foll
df40: 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63  owing.      ** c
df50: 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74  all to btreeInit
df60: 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65  Page() will like
df70: 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ly return SQLITE
df80: 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20  _CORRUPT..      
df90: 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69  ** But no harm i
dfa0: 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20  s done by this. 
dfb0: 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79 20   And it is very 
dfc0: 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20  important that. 
dfd0: 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69       ** btreeIni
dfe0: 74 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65  tPage() be calle
dff0: 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65  d on every btree
e000: 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65   page so we make
e010: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61  .      ** the ca
e020: 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67  ll for every pag
e030: 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20  e that comes in 
e040: 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20  for re-initing. 
e050: 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e  */.      btreeIn
e060: 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
e070: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
e080: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * Invoke the bus
e090: 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20  y handler for a 
e0a0: 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  btree..*/.static
e0b0: 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65   int btreeInvoke
e0c0: 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64  BusyHandler(void
e0d0: 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61   *pArg){.  BtSha
e0e0: 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68  red *pBt = (BtSh
e0f0: 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73  ared*)pArg;.  as
e100: 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b  sert( pBt->db );
e110: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
e120: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
e130: 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  t->db->mutex) );
e140: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
e150: 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
e160: 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73  er(&pBt->db->bus
e170: 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a  yHandler);.}../*
e180: 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62  .** Open a datab
e190: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
e1a0: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68   zFilename is th
e1b0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
e1c0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
e1d0: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
e1e0: 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70  LL.** then an ep
e1f0: 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
e200: 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68   is created.  Th
e210: 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  e ephemeral data
e220: 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65  base might.** be
e230: 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20   exclusively in 
e240: 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69  memory, or it mi
e250: 67 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62  ght use a disk-b
e260: 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68  ased memory cach
e270: 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79  e..** Either way
e280: 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  , the ephemeral 
e290: 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65  database will be
e2a0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
e2b0: 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20  eleted .** when 
e2c0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
e2d0: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
e2e0: 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
e2f0: 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
e300: 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  then an in-memor
e310: 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  y database is cr
e320: 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73  eated.** that is
e330: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
e340: 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74  estroyed when it
e350: 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
e360: 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20 70 61  * The "flags" pa
e370: 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74  rameter is a bit
e380: 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20  mask that might 
e390: 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b  contain bits lik
e3a0: 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f  e.** BTREE_OMIT_
e3b0: 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42  JOURNAL and/or B
e3c0: 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a  TREE_MEMORY..**.
e3d0: 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
e3e0: 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  se is already op
e3f0: 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ened in the same
e400: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
e410: 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61  tion.** and we a
e420: 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 63  re in shared cac
e430: 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  he mode, then th
e440: 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c  e open will fail
e450: 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49   with an.** SQLI
e460: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72  TE_CONSTRAINT er
e470: 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20  ror.  We cannot 
e480: 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72  allow two or mor
e490: 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62  e BtShared.** ob
e4a0: 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d  jects in the sam
e4b0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
e4c0: 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e  ction since doin
e4d0: 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a  g so will lead.*
e4e0: 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69  * to problems wi
e4f0: 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69  th locking..*/.i
e500: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f  nt sqlite3BtreeO
e510: 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
e520: 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f  fs *pVfs,      /
e530: 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72  * VFS to use for
e540: 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a   this b-tree */.
e550: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
e560: 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
e570: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
e580: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72  ntaining the BTr
e590: 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ee database */. 
e5a0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
e5b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f           /* Asso
e5c0: 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
e5d0: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65  handle */.  Btre
e5e0: 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20  e **ppBtree,    
e5f0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
e600: 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65  o new Btree obje
e610: 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ct written here 
e620: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
e630: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e640: 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  Options */.  int
e650: 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
e660: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
e670: 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
e680: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
e690: 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  n() */.){.  BtSh
e6a0: 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20  ared *pBt = 0;  
e6b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
e6c0: 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72  ared part of btr
e6d0: 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
e6e0: 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20    Btree *p;     
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e700: 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65   /* Handle to re
e710: 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  turn */.  sqlite
e720: 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70  3_mutex *mutexOp
e730: 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76  en = 0;  /* Prev
e740: 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64  ents a race cond
e750: 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33  ition. Ticket #3
e760: 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  537 */.  int rc 
e770: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
e780: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
e790: 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73  t code from this
e7a0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75   function */.  u
e7b0: 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20  8 nReserve;     
e7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e7d0: 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20   Byte of unused 
e7e0: 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
e7f0: 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
e800: 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b   char zDbHeader[
e810: 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61  100];  /* Databa
e820: 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e  se header conten
e830: 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20  t */..  /* True 
e840: 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70  if opening an ep
e850: 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61  hemeral, tempora
e860: 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ry database */. 
e870: 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d   const int isTem
e880: 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d  pDb = zFilename=
e890: 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b  =0 || zFilename[
e8a0: 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74  0]==0;..  /* Set
e8b0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73   the variable is
e8c0: 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f  Memdb to true fo
e8d0: 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
e8e0: 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a  atabase, or .  *
e8f0: 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69  * false for a fi
e900: 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73  le-based databas
e910: 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  e..  */.#ifdef S
e920: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
e930: 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  YDB.  const int 
e940: 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c  isMemdb = 0;.#el
e950: 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  se.  const int i
e960: 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e  sMemdb = (zFilen
e970: 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46  ame && strcmp(zF
e980: 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72  ilename, ":memor
e990: 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20  y:")==0).       
e9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9b0: 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26 20  || (isTempDb && 
e9c0: 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
e9d0: 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20 20 20  ory(db)).       
e9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9f0: 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20 53  || (vfsFlags & S
ea00: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52  QLITE_OPEN_MEMOR
ea10: 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  Y)!=0;.#endif.. 
ea20: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
ea30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  ;.  assert( pVfs
ea40: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
ea50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
ea60: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
ea70: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  ;.  assert( (fla
ea80: 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20  gs&0xff)==flags 
ea90: 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69  );   /* flags fi
eaa0: 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a  t in 8 bits */..
eab0: 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45    /* Only a BTRE
eac0: 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73  E_SINGLE databas
ead0: 65 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55  e can be BTREE_U
eae0: 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73  NORDERED */.  as
eaf0: 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42  sert( (flags & B
eb00: 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d  TREE_UNORDERED)=
eb10: 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42  =0 || (flags & B
eb20: 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20  TREE_SINGLE)!=0 
eb30: 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45  );..  /* A BTREE
eb40: 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65  _SINGLE database
eb50: 20 69 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d   is always a tem
eb60: 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70  porary and/or ep
eb70: 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73  hemeral */.  ass
eb80: 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54  ert( (flags & BT
eb90: 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c  REE_SINGLE)==0 |
eba0: 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20  | isTempDb );.. 
ebb0: 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a   if( isMemdb ){.
ebc0: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52      flags |= BTR
ebd0: 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20  EE_MEMORY;.  }. 
ebe0: 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20 26   if( (vfsFlags &
ebf0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
ec00: 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d  N_DB)!=0 && (isM
ec10: 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62  emdb || isTempDb
ec20: 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67  ) ){.    vfsFlag
ec30: 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20  s = (vfsFlags & 
ec40: 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  ~SQLITE_OPEN_MAI
ec50: 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f  N_DB) | SQLITE_O
ec60: 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d  PEN_TEMP_DB;.  }
ec70: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
ec80: 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
ec90: 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
eca0: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
ecb0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
ecc0: 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  }.  p->inTrans =
ecd0: 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70   TRANS_NONE;.  p
ece0: 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64  ->db = db;.#ifnd
ecf0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
ed00: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d  HARED_CACHE.  p-
ed10: 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70  >lock.pBtree = p
ed20: 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62  ;.  p->lock.iTab
ed30: 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a  le = 1;.#endif..
ed40: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
ed50: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
ed60: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
ed70: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
ed80: 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a  ISKIO).  /*.  **
ed90: 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20 69   If this Btree i
eda0: 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
edb0: 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20  r shared cache, 
edc0: 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20  try to find an. 
edd0: 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53   ** existing BtS
ede0: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61  hared object tha
edf0: 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20 77  t we can share w
ee00: 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ith.  */.  if( i
ee10: 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28 69  sTempDb==0 && (i
ee20: 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66  sMemdb==0 || (vf
ee30: 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
ee40: 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a 20  EN_URI)!=0) ){. 
ee50: 20 20 20 69 66 28 20 76 66 73 46 6c 61 67 73 20     if( vfsFlags 
ee60: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48  & SQLITE_OPEN_SH
ee70: 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20 20  AREDCACHE ){.   
ee80: 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68     int nFullPath
ee90: 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
eea0: 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20  athname+1;.     
eeb0: 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
eec0: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
eed0: 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61  lloc(nFullPathna
eee0: 6d 65 29 3b 0a 20 20 20 20 20 20 4d 55 54 45 58  me);.      MUTEX
eef0: 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
ef00: 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
ef10: 65 64 3b 20 29 0a 20 20 20 20 20 20 70 2d 3e 73  ed; ).      p->s
ef20: 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
ef30: 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74     if( !zFullPat
ef40: 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  hname ){.       
ef50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
ef60: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
ef70: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
ef80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
ef90: 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20   isMemdb ){.    
efa0: 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c      memcpy(zFull
efb0: 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e  Pathname, zFilen
efc0: 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  ame, sqlite3Strl
efd0: 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b  en30(zFilename)+
efe0: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
eff0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
f000: 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
f010: 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
f020: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
f030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f040: 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74          nFullPat
f050: 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  hname, zFullPath
f060: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  name);.        i
f070: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
f080: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
f090: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
f0a0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f0b0: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
f0c0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
f0d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f0e0: 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  }.#if SQLITE_THR
f0f0: 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75  EADSAFE.      mu
f100: 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65  texOpen = sqlite
f110: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
f120: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
f130: 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c  OPEN);.      sql
f140: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
f150: 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
f160: 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
f170: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
f180: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
f190: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
f1a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
f1b0: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
f1c0: 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  hared);.#endif. 
f1d0: 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f       for(pBt=GLO
f1e0: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
f1f0: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
f200: 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d  List); pBt; pBt=
f210: 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  pBt->pNext){.   
f220: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
f230: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
f240: 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
f250: 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  p(zFullPathname,
f260: 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
f270: 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
f280: 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20  r, 0)).         
f290: 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
f2a0: 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e  e3PagerVfs(pBt->
f2b0: 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b  pPager)==pVfs ){
f2c0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
f2d0: 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  Db;.          fo
f2e0: 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b  r(iDb=db->nDb-1;
f2f0: 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b   iDb>=0; iDb--){
f300: 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72  .            Btr
f310: 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20  ee *pExisting = 
f320: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
f330: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
f340: 28 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70  ( pExisting && p
f350: 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70  Existing->pBt==p
f360: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
f370: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
f380: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
f390: 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  red);.          
f3a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
f3b0: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
f3c0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
f3d0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
f3e0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
f3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
f400: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
f410: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
f420: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
f430: 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20  AINT;.          
f440: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
f450: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74            p->pBt
f460: 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20   = pBt;.        
f470: 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pBt->nRef++;. 
f480: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
f490: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f4a0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
f4b0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
f4c0: 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
f4d0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
f4e0: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
f4f0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
f500: 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b  _DEBUG.    else{
f510: 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62  .      /* In deb
f520: 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b  ug mode, we mark
f530: 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20   all persistent 
f540: 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61  databases as sha
f550: 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65  rable.      ** e
f560: 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72  ven when they ar
f570: 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65  e not.  This exe
f580: 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69  rcises the locki
f590: 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20  ng code and.    
f5a0: 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20    ** gives more 
f5b0: 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20  opportunity for 
f5c0: 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f  asserts(sqlite3_
f5d0: 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20  mutex_held()).  
f5e0: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
f5f0: 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e  s to find lockin
f600: 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20  g problems..    
f610: 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68    */.      p->sh
f620: 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  arable = 1;.    
f630: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e  }.#endif.  }.#en
f640: 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30  dif.  if( pBt==0
f650: 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
f660: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
f670: 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72  asserts make sur
f680: 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65  e that structure
f690: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74  s used by the bt
f6a0: 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74  ree are.    ** t
f6b0: 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20  he right size.  
f6c0: 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64  This is to guard
f6d0: 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68   against size ch
f6e0: 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c  anges that resul
f6f0: 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f  t.    ** when co
f700: 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66  mpiling on a dif
f710: 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74  ferent architect
f720: 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
f730: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69  assert( sizeof(i
f740: 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66  64)==8 || sizeof
f750: 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20  (i64)==4 );.    
f760: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
f770: 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66  64)==8 || sizeof
f780: 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20  (u64)==4 );.    
f790: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
f7a0: 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  32)==4 );.    as
f7b0: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36  sert( sizeof(u16
f7c0: 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65  )==2 );.    asse
f7d0: 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29  rt( sizeof(Pgno)
f7e0: 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42  ==4 );.  .    pB
f7f0: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
f800: 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70  cZero( sizeof(*p
f810: 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Bt) );.    if( p
f820: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  Bt==0 ){.      r
f830: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
f840: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  ;.      goto btr
f850: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
f860: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
f870: 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66  te3PagerOpen(pVf
f880: 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c  s, &pBt->pPager,
f890: 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20   zFilename,.    
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8b0: 20 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45        EXTRA_SIZE
f8c0: 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67  , flags, vfsFlag
f8d0: 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a  s, pageReinit);.
f8e0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
f8f0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
f900: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d  qlite3PagerSetMm
f910: 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61  apLimit(pBt->pPa
f920: 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29  ger, db->szMmap)
f930: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
f940: 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
f950: 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61  eheader(pBt->pPa
f960: 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65  ger,sizeof(zDbHe
f970: 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29  ader),zDbHeader)
f980: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f990: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f9a0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
f9b0: 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
f9c0: 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46  }.    pBt->openF
f9d0: 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73  lags = (u8)flags
f9e0: 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20  ;.    pBt->db = 
f9f0: 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  db;.    sqlite3P
fa00: 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
fa10: 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  er(pBt->pPager, 
fa20: 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
fa30: 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20  andler, pBt);.  
fa40: 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
fa50: 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72    .    pBt->pCur
fa60: 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  sor = 0;.    pBt
fa70: 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
fa80: 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
fa90: 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74  erIsreadonly(pBt
faa0: 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42 74 2d  ->pPager) ) pBt-
fab0: 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
fac0: 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 64  _READ_ONLY;.#ifd
fad0: 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ef SQLITE_SECURE
fae0: 5f 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74 2d  _DELETE.    pBt-
faf0: 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
fb00: 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a  _SECURE_DELETE;.
fb10: 23 65 6e 64 69 66 0a 20 20 20 20 70 42 74 2d 3e  #endif.    pBt->
fb20: 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62 48  pageSize = (zDbH
fb30: 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20  eader[16]<<8) | 
fb40: 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c  (zDbHeader[17]<<
fb50: 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  16);.    if( pBt
fb60: 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c  ->pageSize<512 |
fb70: 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  | pBt->pageSize>
fb80: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
fb90: 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c  SIZE.         ||
fba0: 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   ((pBt->pageSize
fbb0: 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  -1)&pBt->pageSiz
fbc0: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  e)!=0 ){.      p
fbd0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30  Bt->pageSize = 0
fbe0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
fbf0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
fc00: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
fc10: 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65   magic name ":me
fc20: 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61  mory:" will crea
fc30: 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  te an in-memory 
fc40: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20  database, then. 
fc50: 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68       ** leave th
fc60: 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64  e autoVacuum mod
fc70: 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61  e at 0 (do not a
fc80: 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65  uto-vacuum), eve
fc90: 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51  n if.      ** SQ
fca0: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
fcb0: 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e  OVACUUM is true.
fcc0: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
fcd0: 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  nd, if.      ** 
fce0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
fcf0: 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65  RYDB has been de
fd00: 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65  fined, then ":me
fd10: 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61  mory:" is just a
fd20: 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61  .      ** regula
fd30: 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20  r file-name. In 
fd40: 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75  this case the au
fd50: 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65  to-vacuum applie
fd60: 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e  s as per normal.
fd70: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
fd80: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
fd90: 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20   !isMemdb ){.   
fda0: 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
fdb0: 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
fdc0: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
fdd0: 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  M ? 1 : 0);.    
fde0: 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
fdf0: 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
fe00: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
fe10: 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  ==2 ? 1 : 0);.  
fe20: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
fe30: 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b     nReserve = 0;
fe40: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
fe50: 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62    nReserve = zDb
fe60: 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20  Header[20];.    
fe70: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
fe80: 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  |= BTS_PAGESIZE_
fe90: 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53  FIXED;.#ifndef S
fea0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
feb0: 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d  ACUUM.      pBt-
fec0: 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67  >autoVacuum = (g
fed0: 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
fee0: 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  er[36 + 4*4])?1:
fef0: 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69  0);.      pBt->i
ff00: 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
ff10: 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
ff20: 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
ff30: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
ff40: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
ff50: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
ff60: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
ff70: 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65  t->pageSize, nRe
ff80: 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20  serve);.    if( 
ff90: 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f  rc ) goto btree_
ffa0: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42  open_out;.    pB
ffb0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
ffc0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
ffd0: 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
ffe0: 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65  sert( (pBt->page
fff0: 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20  Size & 7)==0 ); 
10000 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   /* 8-byte align
10010 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65  ment of pageSize
10020 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66   */.   .#if !def
10030 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
10040 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
10050 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
10060 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
10070 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65     /* Add the ne
10080 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  w BtShared objec
10090 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  t to the linked 
100a0 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74  list sharable Bt
100b0 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a  Shareds..    */.
100c0 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61      if( p->shara
100d0 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54  ble ){.      MUT
100e0 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
100f0 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
10100 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20 70 42  ared; ).      pB
10110 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  t->nRef = 1;.   
10120 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
10130 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71  mutexShared = sq
10140 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
10150 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
10160 54 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20  TIC_MASTER);).  
10170 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
10180 48 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c  HREADSAFE && sql
10190 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
101a0 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20  .bCoreMutex ){. 
101b0 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65         pBt->mute
101c0 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  x = sqlite3Mutex
101d0 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
101e0 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20  EX_FAST);.      
101f0 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78    if( pBt->mutex
10200 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10210 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
10220 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  EM;.          db
10230 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
10240 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   0;.          go
10250 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
10260 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
10270 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
10280 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
10290 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
102a0 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20     pBt->pNext = 
102b0 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
102c0 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
102d0 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  cheList);.      
102e0 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
102f0 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
10300 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a  cheList) = pBt;.
10310 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
10320 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
10330 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65  hared);.    }.#e
10340 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64  ndif.  }..#if !d
10350 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
10360 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
10370 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
10380 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
10390 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77  .  /* If the new
103a0 20 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68   Btree uses a sh
103b0 61 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64  arable pBtShared
103c0 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20  , then link the 
103d0 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69  new.  ** Btree i
103e0 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20  nto the list of 
103f0 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72  all sharable Btr
10400 65 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65  ees for the same
10410 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a   connection..  *
10420 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65  * The list is ke
10430 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  pt in ascending 
10440 6f 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64  order by pBt add
10450 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ress..  */.  if(
10460 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
10470 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42      int i;.    B
10480 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20  tree *pSib;.    
10490 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
104a0 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
104b0 69 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e  if( (pSib = db->
104c0 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26  aDb[i].pBt)!=0 &
104d0 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65  & pSib->sharable
104e0 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
104f0 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29  e( pSib->pPrev )
10500 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70  { pSib = pSib->p
10510 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20  Prev; }.        
10520 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d  if( p->pBt<pSib-
10530 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
10540 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69    p->pNext = pSi
10550 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  b;.          p->
10560 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20  pPrev = 0;.     
10570 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76       pSib->pPrev
10580 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65   = p;.        }e
10590 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77  lse{.          w
105a0 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78  hile( pSib->pNex
105b0 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74  t && pSib->pNext
105c0 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a  ->pBt<p->pBt ){.
105d0 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62              pSib
105e0 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
105f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
10600 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
10610 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
10620 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76          p->pPrev
10630 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
10640 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20     if( p->pNext 
10650 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
10660 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
10670 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   p;.          }.
10680 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e            pSib->
10690 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  pNext = p;.     
106a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
106b0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
106c0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a  }.  }.#endif.  *
106d0 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74  ppBtree = p;..bt
106e0 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20  ree_open_out:.  
106f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10700 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74  K ){.    if( pBt
10710 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20   && pBt->pPager 
10720 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10730 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
10740 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
10750 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
10760 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
10770 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a  3_free(p);.    *
10780 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d  ppBtree = 0;.  }
10790 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
107a0 74 68 65 20 42 2d 54 72 65 65 20 77 61 73 20 73  the B-Tree was s
107b0 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
107c0 65 64 2c 20 73 65 74 20 74 68 65 20 70 61 67 65  ed, set the page
107d0 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20  r-cache size to 
107e0 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75  the.    ** defau
107f0 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74  lt value. Except
10800 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f  , when opening o
10810 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68  n an existing sh
10820 61 72 65 64 20 70 61 67 65 72 2d 63 61 63 68 65  ared pager-cache
10830 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20  ,.    ** do not 
10840 63 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 72  change the pager
10850 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 20  -cache size..   
10860 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
10870 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 70  te3BtreeSchema(p
10880 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20  , 0, 0)==0 ){.  
10890 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
108a0 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d 3e  SetCachesize(p->
108b0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c  pBt->pPager, SQL
108c0 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48  ITE_DEFAULT_CACH
108d0 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20  E_SIZE);.    }. 
108e0 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70   }.  if( mutexOp
108f0 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  en ){.    assert
10900 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
10910 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20  held(mutexOpen) 
10920 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
10930 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
10940 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Open);.  }.  ret
10950 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
10960 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42   Decrement the B
10970 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75  tShared.nRef cou
10980 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72  nter.  When it r
10990 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20  eaches zero,.** 
109a0 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61  remove the BtSha
109b0 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66 72  red structure fr
109c0 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  om the sharing l
109d0 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ist.  Return.** 
109e0 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68  true if the BtSh
109f0 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
10a00 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61  r reaches zero a
10a10 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c  nd return.** fal
10a20 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c  se if it is stil
10a30 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73  l positive..*/.s
10a40 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65  tatic int remove
10a50 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
10a60 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
10a70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10a80 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
10a90 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
10aa0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
10ab0 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53 68  Master; ).  BtSh
10ac0 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69  ared *pList;.  i
10ad0 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a  nt removed = 0;.
10ae0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10af0 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64  e3_mutex_notheld
10b00 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
10b10 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70    MUTEX_LOGIC( p
10b20 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
10b30 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
10b40 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
10b50 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69  ASTER); ).  sqli
10b60 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
10b70 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d  pMaster);.  pBt-
10b80 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
10b90 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20  Bt->nRef<=0 ){. 
10ba0 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74     if( GLOBAL(Bt
10bb0 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
10bc0 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d  haredCacheList)=
10bd0 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c  =pBt ){.      GL
10be0 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
10bf0 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
10c00 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e  eList) = pBt->pN
10c10 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
10c20 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c        pList = GL
10c30 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
10c40 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
10c50 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68  eList);.      wh
10c60 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73  ile( ALWAYS(pLis
10c70 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65  t) && pList->pNe
10c80 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  xt!=pBt ){.     
10c90 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e     pList=pList->
10ca0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
10cb0 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
10cc0 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pList) ){.      
10cd0 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d    pList->pNext =
10ce0 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
10cf0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
10d00 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
10d10 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71  SAFE ){.      sq
10d20 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
10d30 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  (pBt->mutex);.  
10d40 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20    }.    removed 
10d50 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 1;.  }.  sqlit
10d60 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
10d70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
10d80 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65  n removed;.#else
10d90 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
10da0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  dif.}../*.** Mak
10db0 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70  e sure pBt->pTmp
10dc0 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20  Space points to 
10dd0 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66  an allocation of
10de0 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a   .** MX_CELL_SIZ
10df0 45 28 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f  E(pBt) bytes..*/
10e00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c  .static void all
10e10 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 42  ocateTempSpace(B
10e20 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
10e30 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53   if( !pBt->pTmpS
10e40 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d  pace ){.    pBt-
10e50 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c  >pTmpSpace = sql
10e60 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20  ite3PageMalloc( 
10e70 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
10e80 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20  ..    /* One of 
10e90 74 68 65 20 75 73 65 73 20 6f 66 20 70 42 74 2d  the uses of pBt-
10ea0 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20 74 6f  >pTmpSpace is to
10eb0 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62 65   format cells be
10ec0 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65  fore.    ** inse
10ed0 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20  rting them into 
10ee0 61 20 6c 65 61 66 20 70 61 67 65 20 28 66 75 6e  a leaf page (fun
10ef0 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c  ction fillInCell
10f00 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  ()). If.    ** a
10f10 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20 74 68   cell is less th
10f20 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20 73 69  an 4 bytes in si
10f30 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e 64 65  ze, it is rounde
10f40 64 20 75 70 20 74 6f 20 34 20 62 79 74 65 73 0a  d up to 4 bytes.
10f50 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 76 61      ** by the va
10f60 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73 20 74  rious routines t
10f70 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65 20 62  hat manipulate b
10f80 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57 68 69  inary cells. Whi
10f90 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65  ch.    ** can me
10fa0 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e 43 65  an that fillInCe
10fb0 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61  ll() only initia
10fc0 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73 74 20  lizes the first 
10fd0 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62 79  2 or 3.    ** by
10fe0 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61 63 65  tes of pTmpSpace
10ff0 2c 20 62 75 74 20 74 68 61 74 20 74 68 65 20 66  , but that the f
11000 69 72 73 74 20 34 20 62 79 74 65 73 20 61 72 65  irst 4 bytes are
11010 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20 20   copied from.   
11020 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20 64 61   ** it into a da
11030 74 61 62 61 73 65 20 70 61 67 65 2e 20 54 68 69  tabase page. Thi
11040 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  s is not actuall
11050 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74  y a problem, but
11060 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20   it.    ** does 
11070 63 61 75 73 65 20 61 20 76 61 6c 67 72 69 6e 64  cause a valgrind
11080 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68 65 20   error when the 
11090 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f 66 20  1 or 2 bytes of 
110a0 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20  unitialized .   
110b0 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61 73 73   ** data is pass
110c0 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63 61 6c  ed to system cal
110d0 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20 74 6f  l write(). So to
110e0 20 61 76 6f 69 64 20 74 68 69 73 20 65 72 72 6f   avoid this erro
110f0 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74  r,.    ** zero t
11100 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
11110 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65 20 68   of temp space h
11120 65 72 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ere.  */.    if(
11130 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
11140 29 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70 54  ) memset(pBt->pT
11150 6d 70 53 70 61 63 65 2c 20 30 2c 20 34 29 3b 0a  mpSpace, 0, 4);.
11160 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
11170 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53  e the pBt->pTmpS
11180 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  pace allocation.
11190 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
111a0 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  reeTempSpace(BtS
111b0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73  hared *pBt){.  s
111c0 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 20  qlite3PageFree( 
111d0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  pBt->pTmpSpace);
111e0 0a 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  .  pBt->pTmpSpac
111f0 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e = 0;.}../*.** 
11200 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61  Close an open da
11210 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c  tabase and inval
11220 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72  idate all cursor
11230 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
11240 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65  3BtreeClose(Btre
11250 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
11260 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
11270 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
11280 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  r;..  /* Close a
11290 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
112a0 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c  d via this handl
112b0 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
112c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
112d0 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
112e0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
112f0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
11300 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  Cur = pBt->pCurs
11310 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75  or;.  while( pCu
11320 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f  r ){.    BtCurso
11330 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a  r *pTmp = pCur;.
11340 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d      pCur = pCur-
11350 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
11360 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20  pTmp->pBtree==p 
11370 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11380 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
11390 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTmp);.    }.  
113a0 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  }..  /* Rollback
113b0 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e   any active tran
113c0 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  saction and free
113d0 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75   the handle stru
113e0 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20  cture..  ** The 
113f0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
11400 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64  treeRollback() d
11410 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c  rops any table-l
11420 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a  ocks held by.  *
11430 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20  * this handle.. 
11440 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
11450 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51  eeRollback(p, SQ
11460 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69  LITE_OK);.  sqli
11470 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
11480 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
11490 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72   are still other
114a0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
114b0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
114c0 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a  hared-btree.  **
114d0 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75   structure, retu
114e0 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61  rn now. The rema
114f0 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72  inder of this pr
11500 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a  ocedure cleans .
11510 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72    ** up the shar
11520 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20  ed-btree..  */. 
11530 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
11540 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e  ToLock==0 && p->
11550 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
11560 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
11570 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  || removeFromSha
11580 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b  ringList(pBt) ){
11590 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20  .    /* The pBt 
115a0 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20  is no longer on 
115b0 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
115c0 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65  , so we can acce
115d0 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74  ss.    ** it wit
115e0 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68  hout having to h
115f0 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20  old the mutex.. 
11600 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65     **.    ** Cle
11610 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74  an out and delet
11620 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f  e the BtShared o
11630 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  bject..    */.  
11640 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
11650 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73  pCursor );.    s
11660 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
11670 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
11680 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65     if( pBt->xFre
11690 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e  eSchema && pBt->
116a0 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
116b0 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
116c0 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  a(pBt->pSchema);
116d0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
116e0 65 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d  e3DbFree(0, pBt-
116f0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66  >pSchema);.    f
11700 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
11710 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
11720 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23  ree(pBt);.  }..#
11730 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11740 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
11750 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
11760 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  tToLock==0 );.  
11770 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65  assert( p->locke
11780 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  d==0 );.  if( p-
11790 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65  >pPrev ) p->pPre
117a0 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
117b0 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e  ext;.  if( p->pN
117c0 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e  ext ) p->pNext->
117d0 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
117e0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
117f0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
11800 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11810 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
11820 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68   the limit on th
11830 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
11840 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65  s allowed in the
11850 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
11860 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
11870 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20   of cache pages 
11880 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 61 62  is set to the ab
11890 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20  solute.** value 
118a0 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d  of mxPage.  If m
118b0 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  xPage is negativ
118c0 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  e, the pager wil
118d0 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79  l.** operate asy
118e0 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74  nchronously - it
118f0 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74   will not stop t
11900 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a  o do fsync()s.**
11910 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20   to insure data 
11920 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
11930 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20 62  e disk surface b
11940 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75  efore.** continu
11950 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f  ing.  Transactio
11960 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66  ns still work if
11970 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   synchronous is 
11980 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  off,.** and the 
11990 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
119a0 62 65 20 63 6f 72 72 75 70 74 65 64 20 69 66 20  be corrupted if 
119b0 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  this program.** 
119c0 63 72 61 73 68 65 73 2e 20 20 42 75 74 20 69 66  crashes.  But if
119d0 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
119e0 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72  ystem crashes or
119f0 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
11a00 61 62 72 75 70 74 20 70 6f 77 65 72 20 66 61 69  abrupt power fai
11a10 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72  lure when synchr
11a20 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68  onous is off, th
11a30 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
11a40 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61  uld be left in a
11a50 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61  n inconsistent a
11a60 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65  nd unrecoverable
11a70 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68   state..** Synch
11a80 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20  ronous is on by 
11a90 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62  default so datab
11aa0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
11ab0 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  s not.** normall
11ac0 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e  y a worry..*/.in
11ad0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
11ae0 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65  tCacheSize(Btree
11af0 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
11b00 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
11b10 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
11b20 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11b30 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
11b40 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
11b50 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
11b60 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
11b70 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74  SetCachesize(pBt
11b80 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
11b90 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
11ba0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
11bb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
11bc0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
11bd0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a  _MMAP_SIZE>0./*.
11be0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69  ** Change the li
11bf0 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e  mit on the amoun
11c00 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
11c10 65 20 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20  e file that may 
11c20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70  be.** memory map
11c30 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ped..*/.int sqli
11c40 74 65 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c  te3BtreeSetMmapL
11c50 69 6d 69 74 28 42 74 72 65 65 20 2a 70 2c 20 73  imit(Btree *p, s
11c60 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d  qlite3_int64 szM
11c70 6d 61 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64  map){.  BtShared
11c80 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
11c90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11ca0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
11cb0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
11cc0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
11cd0 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
11ce0 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
11cf0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a  (pBt->pPager, sz
11d00 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  Mmap);.  sqlite3
11d10 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11d20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11d30 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
11d40 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
11d50 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  IZE>0 */../*.** 
11d60 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64  Change the way d
11d70 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f  ata is synced to
11d80 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74   disk in order t
11d90 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65  o increase or de
11da0 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65  crease.** how we
11db0 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ll the database 
11dc0 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64  resists damage d
11dd0 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
11de0 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61   and power.** fa
11df0 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31  ilures.  Level 1
11e00 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
11e10 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f  asynchronous (no
11e20 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61   syncs() occur a
11e30 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61  nd.** there is a
11e40 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
11e50 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65  y of damage)  Le
11e60 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66  vel 2 is the def
11e70 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ault.  There.** 
11e80 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75  is a very low bu
11e90 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61  t non-zero proba
11ea0 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
11eb0 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63  .  Level 3 reduc
11ec0 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62  es the.** probab
11ed0 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20  ility of damage 
11ee0 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74  to near zero but
11ef0 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65   with a write pe
11f00 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74  rformance reduct
11f10 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
11f20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
11f30 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71  R_PRAGMAS.int sq
11f40 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
11f50 65 72 46 6c 61 67 73 28 0a 20 20 42 74 72 65 65  erFlags(.  Btree
11f60 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
11f70 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74    /* The btree t
11f80 6f 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79  o set the safety
11f90 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75   level on */.  u
11fa0 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20  nsigned pgFlags 
11fb0 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73        /* Various
11fc0 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a   PAGER_* flags *
11fd0 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
11fe0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
11ff0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12000 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
12010 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
12020 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
12030 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
12040 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d  gerSetFlags(pBt-
12050 3e 70 50 61 67 65 72 2c 20 70 67 46 6c 61 67 73  >pPager, pgFlags
12060 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
12070 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
12080 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
12090 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
120a0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
120b0 65 20 67 69 76 65 6e 20 62 74 72 65 65 20 69 73  e given btree is
120c0 20 73 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c   set to safety l
120d0 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65  evel 1.  In othe
120e0 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75  r.** words, retu
120f0 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79  rn TRUE if no sy
12100 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74  nc() occurs on t
12110 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a  he disk files..*
12120 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
12130 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42  eeSyncDisabled(B
12140 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
12150 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
12160 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  Bt;.  int rc;.  
12170 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
12180 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
12190 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20  ->mutex) );  .  
121a0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
121b0 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
121c0 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
121d0 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  er );.  rc = sql
121e0 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28  ite3PagerNosync(
121f0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
12200 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
12210 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
12220 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
12230 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  ge the default p
12240 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68  ages size and th
12250 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
12260 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70  rved bytes per p
12270 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74  age..** Or, if t
12280 68 65 20 70 61 67 65 20 73 69 7a 65 20 68 61 73  he page size has
12290 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69   already been fi
122a0 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  xed, return SQLI
122b0 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20  TE_READONLY .** 
122c0 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67  without changing
122d0 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a   anything..**.**
122e0 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d   The page size m
122f0 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
12300 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20  f 2 between 512 
12310 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74  and 65536.  If t
12320 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20  he page.** size 
12330 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f  supplied does no
12340 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73  t meet this cons
12350 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20  traint then the 
12360 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  page size is not
12370 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  .** changed..**.
12380 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72  ** Page sizes ar
12390 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f  e constrained to
123a0 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74   be a power of t
123b0 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72  wo so that the r
123c0 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  egion.** of the 
123d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73  database file us
123e0 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28  ed for locking (
123f0 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e  beginning at PEN
12400 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68  DING_BYTE,.** th
12410 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73  e first byte pas
12420 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61  t the 1GB bounda
12430 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20  ry, 0x40000000) 
12440 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a  needs to occur.*
12450 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  * at the beginni
12460 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a  ng of a page..**
12470 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
12480 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73   nReserve is les
12490 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
124a0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
124b0 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65  reserved.** byte
124c0 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65  s per page is le
124d0 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
124e0 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78 21  .** If the iFix!
124f0 3d 30 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f  =0 then the BTS_
12500 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66  PAGESIZE_FIXED f
12510 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20 74 68  lag is set so th
12520 61 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  at the page size
12530 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75  .** and autovacu
12540 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c  um mode can no l
12550 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64  onger be changed
12560 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12570 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
12580 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70  (Btree *p, int p
12590 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65  ageSize, int nRe
125a0 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29  serve, int iFix)
125b0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
125c0 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72  ITE_OK;.  BtShar
125d0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
125e0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  ;.  assert( nRes
125f0 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73  erve>=-1 && nRes
12600 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73  erve<=255 );.  s
12610 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
12620 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  (p);.  if( pBt->
12630 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
12640 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 29 7b  AGESIZE_FIXED ){
12650 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
12660 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
12670 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
12680 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  DONLY;.  }.  if(
12690 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20   nReserve<0 ){. 
126a0 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42     nReserve = pB
126b0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
126c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
126d0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65   }.  assert( nRe
126e0 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73  serve>=0 && nRes
126f0 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69  erve<=255 );.  i
12700 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  f( pageSize>=512
12710 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51   && pageSize<=SQ
12720 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
12730 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28  ZE &&.        ((
12740 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65  pageSize-1)&page
12750 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Size)==0 ){.    
12760 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
12770 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
12780 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
12790 50 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70  Page1 && !pBt->p
127a0 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42  Cursor );.    pB
127b0 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75  t->pageSize = (u
127c0 33 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  32)pageSize;.   
127d0 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
127e0 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  Bt);.  }.  rc = 
127f0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
12800 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
12810 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
12820 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a  ize, nReserve);.
12830 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
12840 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
12850 65 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76  e - (u16)nReserv
12860 65 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29 20  e;.  if( iFix ) 
12870 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
12880 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
12890 58 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  XED;.  sqlite3Bt
128a0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
128b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
128c0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
128d0 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20  rrently defined 
128e0 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74  page size.*/.int
128f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
12900 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a  PageSize(Btree *
12910 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
12920 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d  pBt->pageSize;.}
12930 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
12940 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20  LITE_HAS_CODEC) 
12950 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
12960 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 54  E_DEBUG)./*.** T
12970 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
12980 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74  similar to sqlit
12990 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
129a0 65 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74  e(), except that
129b0 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20   it.** may only 
129c0 62 65 20 63 61 6c 6c 65 64 20 69 66 20 69 74 20  be called if it 
129d0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
129e0 61 74 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75  at the b-tree mu
129f0 74 65 78 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  tex is already.*
12a00 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  * held..**.** Th
12a10 69 73 20 69 73 20 75 73 65 66 75 6c 20 69 6e 20  is is useful in 
12a20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  one special case
12a30 20 69 6e 20 74 68 65 20 62 61 63 6b 75 70 20 41   in the backup A
12a40 50 49 20 63 6f 64 65 20 77 68 65 72 65 20 69 74  PI code where it
12a50 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61   is.** known tha
12a60 74 20 74 68 65 20 73 68 61 72 65 64 20 62 2d 74  t the shared b-t
12a70 72 65 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c  ree mutex is hel
12a80 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74 65 78  d, but the mutex
12a90 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   on the .** data
12aa0 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74  base handle that
12ab0 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e   owns *p is not.
12ac0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 66   In this case if
12ad0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
12ae0 65 72 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20  er().** were to 
12af0 62 65 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69  be called, it mi
12b00 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68  ght collide with
12b10 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65 72   some other oper
12b20 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  ation on the.** 
12b30 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
12b40 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61  that owns *p, ca
12b50 75 73 69 6e 67 20 75 6e 64 65 66 69 6e 65 64 20  using undefined 
12b60 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74  behavior..*/.int
12b70 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
12b80 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 42  ReserveNoMutex(B
12b90 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  tree *p){.  asse
12ba0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
12bb0 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
12bc0 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72  utex) );.  retur
12bd0 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  n p->pBt->pageSi
12be0 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61  ze - p->pBt->usa
12bf0 62 6c 65 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69  bleSize;.}.#endi
12c00 66 20 2f 2a 20 53 51 4c 49 54 45 5f 48 41 53 5f  f /* SQLITE_HAS_
12c10 43 4f 44 45 43 20 7c 7c 20 53 51 4c 49 54 45 5f  CODEC || SQLITE_
12c20 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 20 21 64  DEBUG */..#if !d
12c30 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
12c40 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
12c50 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
12c60 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
12c70 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
12c80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
12c90 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74  es of space at t
12ca0 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20  he end of every 
12cb0 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65  page that.** are
12cc0 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66   intentually lef
12cd0 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20  t unused.  This 
12ce0 69 73 20 74 68 65 20 22 72 65 73 65 72 76 65 64  is the "reserved
12cf0 22 20 73 70 61 63 65 20 74 68 61 74 20 69 73 0a  " space that is.
12d00 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65  ** sometimes use
12d10 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e  d by extensions.
12d20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
12d30 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28 42  treeGetReserve(B
12d40 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
12d50 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  n;.  sqlite3Btre
12d60 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d  eEnter(p);.  n =
12d70 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
12d80 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62  e - p->pBt->usab
12d90 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74 65  leSize;.  sqlite
12da0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
12db0 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
12dc0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78  *.** Set the max
12dd0 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
12de0 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69  for a database i
12df0 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69  f mxPage is posi
12e00 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e  tive..** No chan
12e10 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20  ges are made if 
12e20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e  mxPage is 0 or n
12e30 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61  egative..** Rega
12e40 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61  rdless of the va
12e50 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72  lue of mxPage, r
12e60 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75  eturn the maximu
12e70 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
12e80 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
12e90 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74  eMaxPageCount(Bt
12ea0 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
12eb0 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  ge){.  int n;.  
12ec0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
12ed0 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  r(p);.  n = sqli
12ee0 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
12ef0 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61  ount(p->pBt->pPa
12f00 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
12f10 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
12f20 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
12f30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
12f40 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  he BTS_SECURE_DE
12f50 4c 45 54 45 20 66 6c 61 67 20 69 66 20 6e 65 77  LETE flag if new
12f60 46 6c 61 67 20 69 73 20 30 20 6f 72 20 31 2e 20  Flag is 0 or 1. 
12f70 20 49 66 20 6e 65 77 46 6c 61 67 20 69 73 20 2d   If newFlag is -
12f80 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20  1,.** then make 
12f90 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20 41 6c 77  no changes.  Alw
12fa0 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 76  ays return the v
12fb0 61 6c 75 65 20 6f 66 20 74 68 65 20 42 54 53 5f  alue of the BTS_
12fc0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 2a 2a  SECURE_DELETE.**
12fd0 20 73 65 74 74 69 6e 67 20 61 66 74 65 72 20 74   setting after t
12fe0 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e  he change..*/.in
12ff0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
13000 63 75 72 65 44 65 6c 65 74 65 28 42 74 72 65 65  cureDelete(Btree
13010 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67   *p, int newFlag
13020 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66  ){.  int b;.  if
13030 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
13040 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  0;.  sqlite3Btre
13050 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
13060 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20   newFlag>=0 ){. 
13070 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c     p->pBt->btsFl
13080 61 67 73 20 26 3d 20 7e 42 54 53 5f 53 45 43 55  ags &= ~BTS_SECU
13090 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 69  RE_DELETE;.    i
130a0 66 28 20 6e 65 77 46 6c 61 67 20 29 20 70 2d 3e  f( newFlag ) p->
130b0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
130c0 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
130d0 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20 3d 20 28  TE;.  } .  b = (
130e0 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
130f0 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
13100 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73 71 6c 69  LETE)!=0;.  sqli
13110 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
13120 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a  ;.  return b;.}.
13130 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
13140 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
13150 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c  AGER_PRAGMAS) ||
13160 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
13170 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f  _OMIT_VACUUM) */
13180 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
13190 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
131a0 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
131b0 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
131c0 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a  e 'autoVacuum'.*
131d0 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  * parameter is n
131e0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75  on-zero, then au
131f0 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69  to-vacuum mode i
13200 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65  s enabled. If ze
13210 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73  ro, it.** is dis
13220 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75  abled. The defau
13230 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
13240 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f   auto-vacuum pro
13250 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74  perty is .** det
13260 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53  ermined by the S
13270 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
13280 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a  TOVACUUM macro..
13290 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
132a0 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d  reeSetAutoVacuum
132b0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61  (Btree *p, int a
132c0 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64  utoVacuum){.#ifd
132d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
132e0 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
132f0 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
13300 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68  LY;.#else.  BtSh
13310 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
13320 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
13330 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61  QLITE_OK;.  u8 a
13340 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75  v = (u8)autoVacu
13350 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  um;..  sqlite3Bt
13360 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
13370 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  f( (pBt->btsFlag
13380 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45  s & BTS_PAGESIZE
13390 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20 28 61  _FIXED)!=0 && (a
133a0 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75  v ?1:0)!=pBt->au
133b0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
133c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
133d0 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ONLY;.  }else{. 
133e0 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
133f0 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20  um = av ?1:0;.  
13400 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
13410 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a  m = av==2 ?1:0;.
13420 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
13430 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
13440 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
13450 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
13460 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
13470 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
13480 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f  roperty. If auto
13490 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65  -vacuum is .** e
134a0 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75  nabled 1 is retu
134b0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
134c0 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
134d0 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63  3BtreeGetAutoVac
134e0 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23  uum(Btree *p){.#
134f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
13500 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
13510 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f  eturn BTREE_AUTO
13520 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c  VACUUM_NONE;.#el
13530 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  se.  int rc;.  s
13540 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
13550 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20  (p);.  rc = (.  
13560 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f    (!p->pBt->auto
13570 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
13580 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20  TOVACUUM_NONE:. 
13590 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63     (!p->pBt->inc
135a0 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  rVacuum)?BTREE_A
135b0 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a  UTOVACUUM_FULL:.
135c0 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41      BTREE_AUTOVA
135d0 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20  CUUM_INCR.  );. 
135e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
135f0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
13600 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  rc;.#endif.}.../
13610 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72  *.** Get a refer
13620 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f  ence to pPage1 o
13630 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
13640 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a  ile.  This will.
13650 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20  ** also acquire 
13660 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68  a readlock on th
13670 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  at file..**.** S
13680 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
13690 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
136a0 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73    If the file is
136b0 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66   not a.** well-f
136c0 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  ormed database f
136d0 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ile, then SQLITE
136e0 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75  _CORRUPT is retu
136f0 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f  rned..** SQLITE_
13700 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
13710 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
13720 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c   is locked.  SQL
13730 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20  ITE_NOMEM.** is 
13740 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72  returned if we r
13750 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  un out of memory
13760 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
13770 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61   lockBtree(BtSha
13780 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
13790 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
137a0 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
137b0 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f   from subfunctio
137c0 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ns */.  MemPage 
137d0 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20  *pPage1;     /* 
137e0 50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61  Page 1 of the da
137f0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
13800 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
13810 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
13820 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
13830 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
13840 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b  t nPageFile = 0;
13850 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13860 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
13870 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
13880 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b  int nPageHeader;
13890 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
138a0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
138b0 61 74 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e  atabase accordin
138c0 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61  g to hdr */..  a
138d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
138e0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
138f0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
13900 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  t( pBt->pPage1==
13910 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
13920 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f  te3PagerSharedLo
13930 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ck(pBt->pPager);
13940 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
13950 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
13960 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47 65  ;.  rc = btreeGe
13970 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
13980 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28  Page1, 0);.  if(
13990 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
139a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
139b0 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69  * Do some checki
139c0 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72  ng to help insur
139d0 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70  e the file we op
139e0 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20  ened really is. 
139f0 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61   ** a valid data
13a00 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f  base file. .  */
13a10 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  .  nPage = nPage
13a20 48 65 61 64 65 72 20 3d 20 67 65 74 34 62 79 74  Header = get4byt
13a30 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31  e(28+(u8*)pPage1
13a40 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c 69  ->aData);.  sqli
13a50 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
13a60 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
13a70 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66  nPageFile);.  if
13a80 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65  ( nPage==0 || me
13a90 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61  mcmp(24+(u8*)pPa
13aa0 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28  ge1->aData, 92+(
13ab0 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
13ac0 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e  a,4)!=0 ){.    n
13ad0 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65  Page = nPageFile
13ae0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67  ;.  }.  if( nPag
13af0 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20 70  e>0 ){.    u32 p
13b00 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33 32  ageSize;.    u32
13b10 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20   usableSize;.   
13b20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61   u8 *page1 = pPa
13b30 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  ge1->aData;.    
13b40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41  rc = SQLITE_NOTA
13b50 44 42 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63  DB;.    if( memc
13b60 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63  mp(page1, zMagic
13b70 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29  Header, 16)!=0 )
13b80 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
13b90 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
13ba0 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
13bb0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
13bc0 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e    if( page1[18]>
13bd0 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  1 ){.      pBt->
13be0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
13bf0 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d  READ_ONLY;.    }
13c00 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
13c10 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f  9]>1 ){.      go
13c20 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
13c30 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  iled;.    }.#els
13c40 65 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  e.    if( page1[
13c50 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70  18]>2 ){.      p
13c60 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
13c70 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20  BTS_READ_ONLY;. 
13c80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
13c90 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20  e1[19]>2 ){.    
13ca0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
13cb0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
13cc0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77  .    /* If the w
13cd0 72 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20  rite version is 
13ce0 73 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64  set to 2, this d
13cf0 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62  atabase should b
13d00 65 20 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a  e accessed.    *
13d10 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49  * in WAL mode. I
13d20 66 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74  f the log is not
13d30 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f   already open, o
13d40 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e  pen it now. Then
13d50 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20   .    ** return 
13d60 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
13d70 74 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70  turn without pop
13d80 75 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65 64  ulating BtShared
13d90 2e 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20  .pPage1..    ** 
13da0 54 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63  The caller detec
13db0 74 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c  ts this and call
13dc0 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
13dd0 61 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20  again. This is. 
13de0 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61     ** required a
13df0 73 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66  s the version of
13e00 20 70 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c   page 1 currentl
13e10 79 20 69 6e 20 74 68 65 20 70 61 67 65 31 20 62  y in the page1 b
13e20 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79  uffer.    ** may
13e30 20 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65   not be the late
13e40 73 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65  st version - the
13e50 72 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65  re may be a newe
13e60 72 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67  r one in the log
13e70 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20  .    ** file..  
13e80 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67    */.    if( pag
13e90 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42  e1[19]==2 && (pB
13ea0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
13eb0 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a  S_NO_WAL)==0 ){.
13ec0 20 20 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e        int isOpen
13ed0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
13ee0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
13ef0 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72  nWal(pBt->pPager
13f00 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20  , &isOpen);.    
13f10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13f20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
13f30 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
13f40 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c  ailed;.      }el
13f50 73 65 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30  se if( isOpen==0
13f60 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
13f70 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
13f80 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
13f90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
13fa0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51   }.      rc = SQ
13fb0 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20  LITE_NOTADB;.   
13fc0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
13fd0 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d  * The maximum em
13fe0 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20  bedded fraction 
13ff0 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79 20  must be exactly 
14000 32 35 25 2e 20 20 41 6e 64 20 74 68 65 20 6d 69  25%.  And the mi
14010 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62  nimum.    ** emb
14020 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d  edded fraction m
14030 75 73 74 20 62 65 20 31 32 2e 35 25 20 66 6f 72  ust be 12.5% for
14040 20 62 6f 74 68 20 6c 65 61 66 2d 64 61 74 61 20   both leaf-data 
14050 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74  and non-leaf-dat
14060 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72  a..    ** The or
14070 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c  iginal design al
14080 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75  lowed these amou
14090 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74  nts to vary, but
140a0 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65   as of.    ** ve
140b0 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20  rsion 3.6.0, we 
140c0 72 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20  require them to 
140d0 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f  be fixed..    */
140e0 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
140f0 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30  &page1[21], "\10
14100 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30  0\040\040",3)!=0
14110 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
14120 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
14130 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
14140 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36  Size = (page1[16
14150 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31  ]<<8) | (page1[1
14160 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28  7]<<16);.    if(
14170 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
14180 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20 20  ageSize)!=0.    
14190 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51 4c   || pageSize>SQL
141a0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
141b0 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53  E .     || pageS
141c0 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b  ize<=256 .    ){
141d0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
141e0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
141f0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
14200 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
14210 3d 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c 65  =0 );.    usable
14220 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20  Size = pageSize 
14230 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20  - page1[20];.   
14240 20 69 66 28 20 28 75 33 32 29 70 61 67 65 53 69   if( (u32)pageSi
14250 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ze!=pBt->pageSiz
14260 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66  e ){.      /* Af
14270 74 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20  ter reading the 
14280 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
14290 65 20 64 61 74 61 62 61 73 65 20 61 73 73 75 6d  e database assum
142a0 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a  ing a page size.
142b0 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68        ** of BtSh
142c0 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77  ared.pageSize, w
142d0 65 20 68 61 76 65 20 64 69 73 63 6f 76 65 72 65  e have discovere
142e0 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  d that the page-
142f0 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  size is.      **
14300 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69   actually pageSi
14310 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  ze. Unlock the d
14320 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70  atabase, leave p
14330 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20  Bt->pPage1 at.  
14340 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20      ** zero and 
14350 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14360 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
14370 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63  l call this func
14380 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67  tion.      ** ag
14390 61 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72  ain with the cor
143a0 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a  rect page-size..
143b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
143c0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
143d0 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75  1);.      pBt->u
143e0 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62  sableSize = usab
143f0 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42  leSize;.      pB
14400 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  t->pageSize = pa
14410 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72  geSize;.      fr
14420 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
14430 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
14440 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
14450 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
14460 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
14470 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14490 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73       pageSize-us
144a0 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  ableSize);.     
144b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
144c0 7d 0a 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e  }.    if( (pBt->
144d0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
144e0 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65 29  TE_RecoveryMode)
144f0 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61  ==0 && nPage>nPa
14500 67 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  geFile ){.      
14510 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
14520 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
14530 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
14540 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
14550 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65    if( usableSize
14560 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  <480 ){.      go
14570 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
14580 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
14590 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
145a0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42  pageSize;.    pB
145b0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
145c0 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e  usableSize;.#ifn
145d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
145e0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70  AUTOVACUUM.    p
145f0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
14600 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65   (get4byte(&page
14610 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  1[36 + 4*4])?1:0
14620 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  );.    pBt->incr
14630 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
14640 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37  te(&page1[36 + 7
14650 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
14660 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c  f.  }..  /* maxL
14670 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69  ocal is the maxi
14680 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
14690 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c  yload to store l
146a0 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20  ocally for.  ** 
146b0 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75  a cell.  Make su
146c0 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65  re it is small e
146d0 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74  nough so that at
146e0 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74   least minFanout
146f0 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20  .  ** cells can 
14700 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20  will fit on one 
14710 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65  page.  We assume
14720 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20   a 10-byte page 
14730 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73  header..  ** Bes
14740 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64  ides the payload
14750 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20  , the cell must 
14760 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20  store:.  **     
14770 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74  2-byte pointer t
14780 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20  o the cell.  ** 
14790 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64      4-byte child
147a0 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20   pointer.  **   
147b0 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61    9-byte nKey va
147c0 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  lue.  **     4-b
147d0 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a  yte nData value.
147e0 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
147f0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  overflow page po
14800 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20  inter.  ** So a 
14810 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
14820 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65   a 2-byte pointe
14830 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63  r, a header whic
14840 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a  h is as much as.
14850 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f    ** 17 bytes lo
14860 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73  ng, 0 to N bytes
14870 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64   of payload, and
14880 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62   an optional 4 b
14890 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a  yte overflow.  *
148a0 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a  * page pointer..
148b0 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c    */.  pBt->maxL
148c0 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42  ocal = (u16)((pB
148d0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
148e0 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a  )*64/255 - 23);.
148f0 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20    pBt->minLocal 
14900 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
14910 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f  ableSize-12)*32/
14920 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
14930 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36  ->maxLeaf = (u16
14940 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  )(pBt->usableSiz
14950 65 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e  e - 35);.  pBt->
14960 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28  minLeaf = (u16)(
14970 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
14980 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33  -12)*32/255 - 23
14990 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61  );.  if( pBt->ma
149a0 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20  xLocal>127 ){.  
149b0 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50    pBt->max1byteP
149c0 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20  ayload = 127;.  
149d0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e  }else{.    pBt->
149e0 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
149f0 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f  = (u8)pBt->maxLo
14a00 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  cal;.  }.  asser
14a10 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  t( pBt->maxLeaf 
14a20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f  + 23 <= MX_CELL_
14a30 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70  SIZE(pBt) );.  p
14a40 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61  Bt->pPage1 = pPa
14a50 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67  ge1;.  pBt->nPag
14a60 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74  e = nPage;.  ret
14a70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
14a80 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
14a90 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  d:.  releasePage
14aa0 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d  (pPage1);.  pBt-
14ab0 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72  >pPage1 = 0;.  r
14ac0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
14ad0 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a  ndef NDEBUG./*.*
14ae0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
14af0 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 6f  ber of cursors o
14b00 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69 73  pen on pBt. This
14b10 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69   is for use.** i
14b20 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65  n assert() expre
14b30 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73  ssions, so it is
14b40 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69   only compiled i
14b50 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a  f NDEBUG is not.
14b60 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a  ** defined..**.*
14b70 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72  * Only write cur
14b80 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64  sors are counted
14b90 20 69 66 20 77 72 4f 6e 6c 79 20 69 73 20 74 72   if wrOnly is tr
14ba0 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20 69  ue.  If wrOnly i
14bb0 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e 20  s.** false then 
14bc0 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20  all cursors are 
14bd0 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  counted..**.** F
14be0 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
14bf0 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  of this routine,
14c00 20 61 20 63 75 72 73 6f 72 20 69 73 20 61 6e 79   a cursor is any
14c10 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20   cursor that.** 
14c20 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20 72 65  is capable of re
14c30 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
14c40 20 74 6f 20 74 68 65 20 64 61 74 61 62 73 65 2e   to the databse.
14c50 20 20 43 75 72 73 6f 72 73 20 74 68 61 74 0a 2a    Cursors that.*
14c60 2a 20 68 61 76 65 20 62 65 65 6e 20 74 72 69 70  * have been trip
14c70 70 65 64 20 69 6e 74 6f 20 74 68 65 20 43 55 52  ped into the CUR
14c80 53 4f 52 5f 46 41 55 4c 54 20 73 74 61 74 65 20  SOR_FAULT state 
14c90 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e  are not counted.
14ca0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
14cb0 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73  ountValidCursors
14cc0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
14cd0 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42  int wrOnly){.  B
14ce0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
14cf0 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f   int r = 0;.  fo
14d00 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72  r(pCur=pBt->pCur
14d10 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d  sor; pCur; pCur=
14d20 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pCur->pNext){.  
14d30 20 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30    if( (wrOnly==0
14d40 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   || (pCur->curFl
14d50 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65  ags & BTCF_Write
14d60 46 6c 61 67 29 21 3d 30 29 0a 20 20 20 20 20 26  Flag)!=0).     &
14d70 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  & pCur->eState!=
14d80 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72  CURSOR_FAULT ) r
14d90 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  ++; .  }.  retur
14da0 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n r;.}.#endif../
14db0 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
14dc0 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
14dd0 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20   cursors and we 
14de0 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d  are not in the m
14df0 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72  iddle.** of a tr
14e00 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68  ansaction but th
14e10 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f  ere is a read lo
14e20 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
14e30 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  se, then.** this
14e40 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20   routine unrefs 
14e50 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
14e60 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
14e70 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61  ile which .** ha
14e80 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  s the effect of 
14e90 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65  releasing the re
14ea0 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ad lock..**.** I
14eb0 66 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61  f there is a tra
14ec0 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67  nsaction in prog
14ed0 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ress, this routi
14ee0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
14ef0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
14f00 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
14f10 64 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  d(BtShared *pBt)
14f20 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
14f30 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
14f40 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
14f50 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c  assert( countVal
14f60 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c 30 29  idCursors(pBt,0)
14f70 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  ==0 || pBt->inTr
14f80 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f  ansaction>TRANS_
14f90 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42  NONE );.  if( pB
14fa0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
14fb0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  ==TRANS_NONE && 
14fc0 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29  pBt->pPage1!=0 )
14fd0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  {.    assert( pB
14fe0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
14ff0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
15000 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
15010 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
15020 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )==1 );.    asse
15030 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  rt( pBt->pPage1-
15040 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 72 65  >aData );.    re
15050 6c 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70  leasePage(pBt->p
15060 50 61 67 65 31 29 3b 0a 20 20 20 20 70 42 74 2d  Page1);.    pBt-
15070 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 7d  >pPage1 = 0;.  }
15080 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74  .}../*.** If pBt
15090 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d   points to an em
150a0 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63 6f  pty file then co
150b0 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70 74 79  nvert that empty
150c0 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20   file.** into a 
150d0 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61 62 61  new empty databa
150e0 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  se by initializi
150f0 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ng the first pag
15100 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74 61  e of.** the data
15110 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
15120 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28  int newDatabase(
15130 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
15140 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a    MemPage *pP1;.
15150 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
15160 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b  *data;.  int rc;
15170 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
15180 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
15190 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
151a0 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30  if( pBt->nPage>0
151b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
151c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
151d0 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  pP1 = pBt->pPage
151e0 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31  1;.  assert( pP1
151f0 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20  !=0 );.  data = 
15200 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63  pP1->aData;.  rc
15210 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
15220 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67  rite(pP1->pDbPag
15230 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
15240 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63  eturn rc;.  memc
15250 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48  py(data, zMagicH
15260 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d  eader, sizeof(zM
15270 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20  agicHeader));.  
15280 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a  assert( sizeof(z
15290 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36  MagicHeader)==16
152a0 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d   );.  data[16] =
152b0 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65   (u8)((pBt->page
152c0 53 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a  Size>>8)&0xff);.
152d0 20 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75 38    data[17] = (u8
152e0 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )((pBt->pageSize
152f0 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20 64  >>16)&0xff);.  d
15300 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64  ata[18] = 1;.  d
15310 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61  ata[19] = 1;.  a
15320 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62  ssert( pBt->usab
15330 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67  leSize<=pBt->pag
15340 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73  eSize && pBt->us
15350 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42  ableSize+255>=pB
15360 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
15370 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28  data[20] = (u8)(
15380 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
15390 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
153a0 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36  ;.  data[21] = 6
153b0 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20  4;.  data[22] = 
153c0 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d  32;.  data[23] =
153d0 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64   32;.  memset(&d
153e0 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d  ata[24], 0, 100-
153f0 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28  24);.  zeroPage(
15400 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c  pP1, PTF_INTKEY|
15410 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41  PTF_LEAF|PTF_LEA
15420 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e  FDATA );.  pBt->
15430 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
15440 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a  PAGESIZE_FIXED;.
15450 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15460 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
15470 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
15480 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  toVacuum==1 || p
15490 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d  Bt->autoVacuum==
154a0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
154b0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
154c0 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61  1 || pBt->incrVa
154d0 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74  cuum==0 );.  put
154e0 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b  4byte(&data[36 +
154f0 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f   4*4], pBt->auto
15500 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62  Vacuum);.  put4b
15510 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37  yte(&data[36 + 7
15520 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61  *4], pBt->incrVa
15530 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20  cuum);.#endif.  
15540 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a  pBt->nPage = 1;.
15550 20 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a    data[31] = 1;.
15560 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15570 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  OK;.}../*.** Ini
15580 74 69 61 6c 69 7a 65 20 74 68 65 20 66 69 72 73  tialize the firs
15590 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
155a0 74 61 62 61 73 65 20 66 69 6c 65 20 28 63 72 65  tabase file (cre
155b0 61 74 69 6e 67 20 61 20 64 61 74 61 62 61 73 65  ating a database
155c0 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f  .** consisting o
155d0 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  f a single page 
155e0 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62  and no schema ob
155f0 6a 65 63 74 73 29 2e 20 52 65 74 75 72 6e 20 53  jects). Return S
15600 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73  QLITE_OK.** if s
15610 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
15620 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
15630 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  de otherwise..*/
15640 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
15650 65 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70 29  eNewDb(Btree *p)
15660 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
15670 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
15680 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50  p);.  p->pBt->nP
15690 61 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  age = 0;.  rc = 
156a0 6e 65 77 44 61 74 61 62 61 73 65 28 70 2d 3e 70  newDatabase(p->p
156b0 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt);.  sqlite3Bt
156c0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
156d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
156e0 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74  ** Attempt to st
156f0 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61  art a new transa
15700 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74  ction. A write-t
15710 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
15720 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20   started if the 
15730 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
15740 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65  is nonzero, othe
15750 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a  rwise a read-.**
15760 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49   transaction.  I
15770 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
15780 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f  ument is 2 or mo
15790 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65  re and exclusive
157a0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
157b0 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e  is started, mean
157c0 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  ing that no othe
157d0 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c  r process is all
157e0 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73  owed.** to acces
157f0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  s the database. 
15800 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74   A preexisting t
15810 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e  ransaction may n
15820 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65  ot be.** upgrade
15830 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  d to exclusive b
15840 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  y calling this r
15850 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20  outine a second 
15860 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78  time - the.** ex
15870 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f  clusivity flag o
15880 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20  nly works for a 
15890 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
158a0 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  .**.** A write-t
158b0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
158c0 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72  be started befor
158d0 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79  e attempting any
158e0 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20   .** changes to 
158f0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e  the database.  N
15900 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
15910 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a  wing routines .*
15920 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65  * will work unle
15930 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ss a transaction
15940 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73   is started firs
15950 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71  t:.**.**      sq
15960 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
15970 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
15980 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
15990 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20  teIndex().**    
159a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
159b0 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  earTable().**   
159c0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44     sqlite3BtreeD
159d0 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  ropTable().**   
159e0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49     sqlite3BtreeI
159f0 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20  nsert().**      
15a00 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65  sqlite3BtreeDele
15a10 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  te().**      sql
15a20 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d  ite3BtreeUpdateM
15a30 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61  eta().**.** If a
15a40 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70  n initial attemp
15a50 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65  t to acquire the
15a60 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61   lock fails beca
15a70 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74  use of lock cont
15a80 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68  ention.** and th
15a90 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70  e database was p
15aa0 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b  reviously unlock
15ab0 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20  ed, then invoke 
15ac0 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
15ad0 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
15ae0 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65  one.  But if the
15af0 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  re was previousl
15b00 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64  y a read-lock, d
15b10 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20  o not.** invoke 
15b20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
15b30 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53   - just return S
15b40 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c  QLITE_BUSY.  SQL
15b50 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20  ITE_BUSY is .** 
15b60 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68  returned when th
15b70 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
15b80 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72   read-lock in or
15b90 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64  der to avoid a d
15ba0 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  eadlock..**.** S
15bb0 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65  uppose there are
15bc0 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41   two processes A
15bd0 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61   and B.  A has a
15be0 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42   read lock and B
15bf0 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76   has.** a reserv
15c00 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65  ed lock.  B trie
15c10 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20  s to promote to 
15c20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73  exclusive but is
15c30 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65   blocked because
15c40 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20  .** of A's read 
15c50 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74  lock.  A tries t
15c60 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73  o promote to res
15c70 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f  erved but is blo
15c80 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e  cked by B..** On
15c90 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  e or the other o
15ca0 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73  f the two proces
15cb0 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61  ses must give wa
15cc0 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62  y or there can b
15cd0 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73  e.** no progress
15ce0 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20  .  By returning 
15cf0 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20  SQLITE_BUSY and 
15d00 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  not invoking the
15d10 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a   busy callback.*
15d20 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79  * when A already
15d30 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
15d40 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41  , we encourage A
15d50 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20   to give up and 
15d60 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64  let B.** proceed
15d70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15d80 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28  BtreeBeginTrans(
15d90 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72  Btree *p, int wr
15da0 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  flag){.  sqlite3
15db0 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20   *pBlock = 0;.  
15dc0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
15dd0 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
15de0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
15df0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
15e00 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e  er(p);.  btreeIn
15e10 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f  tegrity(p);..  /
15e20 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69  * If the btree i
15e30 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77  s already in a w
15e40 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
15e50 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20  , or it.  ** is 
15e60 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61  already in a rea
15e70 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  d-transaction an
15e80 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  d a read-transac
15e90 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71  tion.  ** is req
15ea0 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20  uested, this is 
15eb0 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
15ec0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
15ed0 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28  TRANS_WRITE || (
15ee0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
15ef0 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61  S_READ && !wrfla
15f00 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  g) ){.    goto t
15f10 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
15f20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
15f30 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
15f40 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e  ANS_WRITE || IfN
15f50 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44  otOmitAV(pBt->bD
15f60 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b  oTruncate)==0 );
15f70 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61  ..  /* Write tra
15f80 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f  nsactions are no
15f90 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20  t possible on a 
15fa0 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61  read-only databa
15fb0 73 65 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74  se */.  if( (pBt
15fc0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
15fd0 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26  _READ_ONLY)!=0 &
15fe0 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
15ff0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
16000 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74  ONLY;.    goto t
16010 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
16020 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16030 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
16040 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65  E.  /* If anothe
16050 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  r database handl
16060 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70  e has already op
16070 65 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61  ened a write tra
16080 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f  nsaction .  ** o
16090 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74  n this shared-bt
160a0 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ree structure an
160b0 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65  d a second write
160c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
160d0 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20    ** requested, 
160e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
160f0 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  CKED..  */.  if(
16100 20 28 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d   (wrflag && pBt-
16110 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
16120 54 52 41 4e 53 5f 57 52 49 54 45 29 0a 20 20 20  TRANS_WRITE).   
16130 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  || (pBt->btsFlag
16140 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29  s & BTS_PENDING)
16150 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 42 6c  !=0.  ){.    pBl
16160 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74  ock = pBt->pWrit
16170 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 20  er->db;.  }else 
16180 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a  if( wrflag>1 ){.
16190 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65      BtLock *pIte
161a0 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72  r;.    for(pIter
161b0 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74  =pBt->pLock; pIt
161c0 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d  er; pIter=pIter-
161d0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
161e0 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  f( pIter->pBtree
161f0 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=p ){.        p
16200 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70  Block = pIter->p
16210 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20  Btree->db;.     
16220 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
16230 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
16240 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20  ( pBlock ){.    
16250 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
16260 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20  nBlocked(p->db, 
16270 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20  pBlock);.    rc 
16280 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f  = SQLITE_LOCKED_
16290 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20  SHAREDCACHE;.   
162a0 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
162b0 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
162c0 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c   /* Any read-onl
162d0 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20  y or read-write 
162e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c  transaction impl
162f0 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ies a read-lock 
16300 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e  on .  ** page 1.
16310 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65   So if some othe
16320 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63  r shared-cache c
16330 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61  lient already ha
16340 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a  s a write-lock .
16350 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20    ** on page 1, 
16360 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
16370 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64  cannot be opened
16380 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72  . */.  rc = quer
16390 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
163a0 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f  eLock(p, MASTER_
163b0 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29  ROOT, READ_LOCK)
163c0 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
163d0 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61  K!=rc ) goto tra
163e0 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74  ns_begun;..  pBt
163f0 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
16400 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
16410 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e  TY;.  if( pBt->n
16420 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62  Page==0 ) pBt->b
16430 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49  tsFlags |= BTS_I
16440 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a  NITIALLY_EMPTY;.
16450 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61    do {.    /* Ca
16460 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75  ll lockBtree() u
16470 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d  ntil either pBt-
16480 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c  >pPage1 is popul
16490 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c  ated or.    ** l
164a0 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72  ockBtree() retur
164b0 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  ns something oth
164c0 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
164d0 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20  K. lockBtree(). 
164e0 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e     ** may return
164f0 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c   SQLITE_OK but l
16500 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
16510 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74   set to 0 if aft
16520 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  er.    ** readin
16530 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63  g page 1 it disc
16540 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70  overs that the p
16550 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
16560 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a  database .    **
16570 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74   file is not pBt
16580 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74  ->pageSize. In t
16590 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72  his case lockBtr
165a0 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65  ee() will update
165b0 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67  .    ** pBt->pag
165c0 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67  eSize to the pag
165d0 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e-size of the fi
165e0 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20  le on disk..    
165f0 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42  */.    while( pB
16600 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20  t->pPage1==0 && 
16610 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
16620 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29   lockBtree(pBt))
16630 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   );..    if( rc=
16640 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
16650 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66  flag ){.      if
16660 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
16670 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
16680 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
16690 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
166a0 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ONLY;.      }els
166b0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
166c0 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
166d0 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72  n(pBt->pPager,wr
166e0 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65  flag>1,sqlite3Te
166f0 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62  mpInMemory(p->db
16700 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
16710 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16720 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
16730 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
16740 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16750 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
16760 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16770 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f  OK ){.      unlo
16780 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
16790 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  pBt);.    }.  }w
167a0 68 69 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d  hile( (rc&0xFF)=
167b0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
167c0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
167d0 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
167e0 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65  &.          btre
167f0 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
16800 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66  er(pBt) );..  if
16810 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16820 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  ){.    if( p->in
16830 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
16840 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  E ){.      pBt->
16850 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a  nTransaction++;.
16860 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16870 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
16880 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68  .      if( p->sh
16890 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
168a0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
168b0 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70  k.pBtree==p && p
168c0 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31  ->lock.iTable==1
168d0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c   );.        p->l
168e0 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44  ock.eLock = READ
168f0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70  _LOCK;.        p
16900 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70  ->lock.pNext = p
16910 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20  Bt->pLock;.     
16920 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20     pBt->pLock = 
16930 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  &p->lock;.      
16940 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
16950 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
16960 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52  (wrflag?TRANS_WR
16970 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b  ITE:TRANS_READ);
16980 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
16990 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  ans>pBt->inTrans
169a0 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
169b0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
169c0 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b  on = p->inTrans;
169d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77  .    }.    if( w
169e0 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d  rflag ){.      M
169f0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
16a00 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69   pBt->pPage1;.#i
16a10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16a20 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
16a30 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42       assert( !pB
16a40 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
16a50 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
16a60 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d   = p;.      pBt-
16a70 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
16a80 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  S_EXCLUSIVE;.   
16a90 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20     if( wrflag>1 
16aa0 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
16ab0 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45  |= BTS_EXCLUSIVE
16ac0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  ;.#endif..      
16ad0 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a  /* If the db-siz
16ae0 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 69  e header field i
16af0 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20  s incorrect (as 
16b00 69 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20  it may be if an 
16b10 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69  old.      ** cli
16b20 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72 69  ent has been wri
16b30 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
16b40 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20  e file), update 
16b50 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20  it now. Doing.  
16b60 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e      ** this soon
16b70 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c  er rather than l
16b80 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64  ater means the d
16b90 61 74 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e  atabase size can
16ba0 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a   safely .      *
16bb0 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20 64 61  * re-read the da
16bc0 74 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d  tabase size from
16bd0 20 70 61 67 65 20 31 20 69 66 20 61 20 73 61 76   page 1 if a sav
16be0 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61  epoint or transa
16bf0 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72  ction.      ** r
16c00 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77  ollback occurs w
16c10 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61  ithin the transa
16c20 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
16c30 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
16c40 50 61 67 65 21 3d 67 65 74 34 62 79 74 65 28 26  Page!=get4byte(&
16c50 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
16c60 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ]) ){.        rc
16c70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
16c80 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
16c90 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
16ca0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16cb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
16cc0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
16cd0 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e  aData[28], pBt->
16ce0 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  nPage);.        
16cf0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
16d00 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75    }...trans_begu
16d10 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  n:.  if( rc==SQL
16d20 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
16d30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
16d40 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20  call makes sure 
16d50 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68  that the pager h
16d60 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e  as the correct n
16d70 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  umber of.    ** 
16d80 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
16d90 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70   If the second p
16da0 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61  arameter is grea
16db0 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20  ter than 0 and. 
16dc0 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f     ** the sub-jo
16dd0 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72  urnal is not alr
16de0 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20  eady open, then 
16df0 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  it will be opene
16e00 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  d here..    */. 
16e10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
16e20 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
16e30 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  t(pBt->pPager, p
16e40 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
16e50 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49  );.  }..  btreeI
16e60 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
16e70 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
16e80 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
16e90 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
16ea0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
16eb0 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  UUM../*.** Set t
16ec0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
16ed0 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63  ntries for all c
16ee0 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20  hildren of page 
16ef0 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a  pPage. Also, if.
16f00 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ** pPage contain
16f10 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69  s cells that poi
16f20 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
16f30 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f  ages, set the po
16f40 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74  inter.** map ent
16f50 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65  ries for the ove
16f60 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77  rflow pages as w
16f70 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
16f80 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  nt setChildPtrma
16f90 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ps(MemPage *pPag
16fa0 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
16fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fc0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e           /* Coun
16fd0 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  ter variable */.
16fe0 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
16ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17000 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
17010 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20  f cells in page 
17020 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72  pPage */.  int r
17030 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
17040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17050 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
17060 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
17070 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
17080 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20  u8 isInitOrig = 
17090 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20  pPage->isInit;. 
170a0 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61   Pgno pgno = pPa
170b0 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73  ge->pgno;..  ass
170c0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
170d0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
170e0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
170f0 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
17100 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28  ge(pPage);.  if(
17110 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17120 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63  {.    goto set_c
17130 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
17140 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20  ;.  }.  nCell = 
17150 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
17160 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
17170 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
17180 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
17190 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20  l(pPage, i);..  
171a0 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50    ptrmapPutOvflP
171b0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
171c0 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20   &rc);..    if( 
171d0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
171e0 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
171f0 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
17200 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74  pCell);.      pt
17210 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
17220 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
17230 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29  TREE, pgno, &rc)
17240 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
17250 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
17260 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  ){.    Pgno chil
17270 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
17280 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
17290 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
172a0 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50  8]);.    ptrmapP
172b0 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
172c0 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
172d0 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d   pgno, &rc);.  }
172e0 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  ..set_child_ptrm
172f0 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65  aps_out:.  pPage
17300 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69  ->isInit = isIni
17310 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20  tOrig;.  return 
17320 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  rc;.}../*.** Som
17330 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20  ewhere on pPage 
17340 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
17350 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64  page iFrom.  Mod
17360 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72  ify this pointer
17370 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70   so.** that it p
17380 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61  oints to iTo. Pa
17390 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65  rameter eType de
173a0 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65  scribes the type
173b0 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a   of pointer to.*
173c0 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61  * be modified, a
173d0 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  s  follows:.**.*
173e0 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20  * PTRMAP_BTREE: 
173f0 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62      pPage is a b
17400 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
17410 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
17420 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20   a child .**    
17430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
17440 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a  age of pPage..**
17450 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
17460 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61  LOW1: pPage is a
17470 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
17480 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
17490 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a  at an overflow.*
174a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
174b0 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64      page pointed
174c0 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68   to by one of th
174d0 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65  e cells on pPage
174e0 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
174f0 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20  VERFLOW2: pPage 
17500 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70  is an overflow-p
17510 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
17520 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e   points at the n
17530 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ext.**          
17540 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f           overflo
17550 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
17560 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
17570 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  t modifyPagePoin
17580 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ter(MemPage *pPa
17590 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20  ge, Pgno iFrom, 
175a0 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79  Pgno iTo, u8 eTy
175b0 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  pe){.  assert( s
175c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
175d0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
175e0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
175f0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
17600 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
17610 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
17620 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
17630 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20  _OVERFLOW2 ){.  
17640 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
17650 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66   is always the f
17660 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20  irst 4 bytes of 
17670 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
17680 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69   case.  */.    i
17690 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67  f( get4byte(pPag
176a0 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d  e->aData)!=iFrom
176b0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
176c0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
176d0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
176e0 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
176f0 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d  aData, iTo);.  }
17700 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49  else{.    u8 isI
17710 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d  nitOrig = pPage-
17720 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74  >isInit;.    int
17730 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c   i;.    int nCel
17740 6c 3b 0a 0a 20 20 20 20 62 74 72 65 65 49 6e 69  l;..    btreeIni
17750 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
17760 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
17770 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72  >nCell;..    for
17780 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
17790 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70  ++){.      u8 *p
177a0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
177b0 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20  pPage, i);.     
177c0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
177d0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a  AP_OVERFLOW1 ){.
177e0 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f          CellInfo
177f0 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 62   info;.        b
17800 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
17810 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
17820 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  info);.        i
17830 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
17840 77 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 43  w.         && pC
17850 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell+info.iOverfl
17860 6f 77 2b 33 3c 3d 70 50 61 67 65 2d 3e 61 44 61  ow+3<=pPage->aDa
17870 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  ta+pPage->maskPa
17880 67 65 0a 20 20 20 20 20 20 20 20 20 26 26 20 69  ge.         && i
17890 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26  From==get4byte(&
178a0 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
178b0 66 6c 6f 77 5d 29 0a 20 20 20 20 20 20 20 20 29  flow]).        )
178c0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
178d0 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
178e0 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f  .iOverflow], iTo
178f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
17900 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
17910 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17920 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
17930 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b  pCell)==iFrom ){
17940 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
17950 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b  yte(pCell, iTo);
17960 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
17970 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
17980 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
17990 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b   if( i==nCell ){
179a0 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
179b0 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  !=PTRMAP_BTREE |
179c0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74  | .          get
179d0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
179e0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
179f0 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20  fset+8])!=iFrom 
17a00 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
17a10 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
17a20 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
17a30 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
17a40 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
17a50 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  e->hdrOffset+8],
17a60 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   iTo);.    }..  
17a70 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
17a80 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20  = isInitOrig;.  
17a90 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
17aa0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
17ab0 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61  Move the open da
17ac0 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
17ad0 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  age to location 
17ae0 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65  iFreePage in the
17af0 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54   .** database. T
17b00 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72  he pDbPage refer
17b10 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c  ence remains val
17b20 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73  id..**.** The is
17b30 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69  Commit flag indi
17b40 63 61 74 65 73 20 74 68 61 74 20 74 68 65 72 65  cates that there
17b50 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72   is no need to r
17b60 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20  emember that.** 
17b70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64  the journal need
17b80 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64  s to be sync()ed
17b90 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65   before database
17ba0 20 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70   page pDbPage->p
17bb0 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77  gno .** can be w
17bc0 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63  ritten to. The c
17bd0 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
17be0 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74  y promised not t
17bf0 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a  o write to that.
17c00 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ** page..*/.stat
17c10 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50  ic int relocateP
17c20 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
17c30 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
17c40 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65  /* Btree */.  Me
17c50 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  mPage *pDbPage, 
17c60 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70         /* Open p
17c70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20  age to move */. 
17c80 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20   u8 eType,      
17c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
17ca0 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20  nter map 'type' 
17cb0 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
17cc0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  e */.  Pgno iPtr
17cd0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
17ce0 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
17cf0 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66  page-no' entry f
17d00 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
17d10 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20  Pgno iFreePage, 
17d20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17d30 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65  location to move
17d40 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20   pDbPage to */. 
17d50 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20   int isCommit   
17d60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43            /* isC
17d70 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65  ommit flag passe
17d80 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  d to sqlite3Page
17d90 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a  rMovepage */.){.
17da0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50    MemPage *pPtrP
17db0 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61  age;   /* The pa
17dc0 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
17dd0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44   a pointer to pD
17de0 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
17df0 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  iDbPage = pDbPag
17e00 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72  e->pgno;.  Pager
17e10 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
17e20 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
17e30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  ;..  assert( eTy
17e40 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
17e50 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50  LOW2 || eType==P
17e60 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
17e70 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d  || .      eType=
17e80 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
17e90 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
17ea0 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73  OOTPAGE );.  ass
17eb0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
17ec0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
17ed0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
17ee0 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70   pDbPage->pBt==p
17ef0 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65  Bt );..  /* Move
17f00 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72   page iDbPage fr
17f10 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c  om its current l
17f20 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20  ocation to page 
17f30 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65  number iFreePage
17f40 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55   */.  TRACE(("AU
17f50 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67  TOVACUUM: Moving
17f60 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65   %d to free page
17f70 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64   %d (ptr page %d
17f80 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20   type %d)\n", . 
17f90 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46       iDbPage, iF
17fa0 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67  reePage, iPtrPag
17fb0 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63  e, eType));.  rc
17fc0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
17fd0 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20  ovepage(pPager, 
17fe0 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65  pDbPage->pDbPage
17ff0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43  , iFreePage, isC
18000 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63  ommit);.  if( rc
18010 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18020 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
18030 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  }.  pDbPage->pgn
18040 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a  o = iFreePage;..
18050 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20    /* If pDbPage 
18060 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65  was a btree-page
18070 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61  , then it may ha
18080 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61  ve child pages a
18090 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  nd/or cells.  **
180a0 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
180b0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54  verflow pages. T
180c0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
180d0 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74  ntries for all t
180e0 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20  hese.  ** pages 
180f0 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67  need to be chang
18100 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ed..  **.  ** If
18110 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f   pDbPage is an o
18120 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
18130 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62  en the first 4 b
18140 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61  ytes may store a
18150 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f  .  ** pointer to
18160 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76   a subsequent ov
18170 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
18180 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
18190 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  , then.  ** the 
181a0 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64  pointer map need
181b0 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  s to be updated 
181c0 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65  for the subseque
181d0 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
181e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
181f0 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
18200 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
18210 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
18220 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50    rc = setChildP
18230 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b  trmaps(pDbPage);
18240 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
18250 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18260 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
18270 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67  .  }else{.    Pg
18280 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65  no nextOvfl = ge
18290 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e  t4byte(pDbPage->
182a0 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  aData);.    if( 
182b0 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20  nextOvfl!=0 ){. 
182c0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
182d0 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54  Bt, nextOvfl, PT
182e0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20  RMAP_OVERFLOW2, 
182f0 69 46 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b  iFreePage, &rc);
18300 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
18310 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18320 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
18330 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
18340 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64  ..  /* Fix the d
18350 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20  atabase pointer 
18360 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65  on page iPtrPage
18370 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74   that pointed at
18380 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a   iDbPage so.  **
18390 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
183a0 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c  at iFreePage. Al
183b0 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74  so fix the point
183c0 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
183d0 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a  .  ** iPtrPage..
183e0 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
183f0 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  !=PTRMAP_ROOTPAG
18400 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  E ){.    rc = bt
18410 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
18420 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50  iPtrPage, &pPtrP
18430 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
18440 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18450 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
18460 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
18470 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
18480 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44  ite(pPtrPage->pD
18490 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
184a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
184b0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
184c0 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
184d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
184e0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
184f0 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
18500 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67  pPtrPage, iDbPag
18510 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  e, iFreePage, eT
18520 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ype);.    releas
18530 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
18540 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
18550 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18560 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
18570 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c  FreePage, eType,
18580 20 69 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b   iPtrPage, &rc);
18590 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
185a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
185b0 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
185c0 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e  n required by in
185d0 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20  crVacuumStep(). 
185e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
185f0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
18600 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50  BtShared *, MemP
18610 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20  age **, Pgno *, 
18620 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a  Pgno, u8);../*.*
18630 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67  * Perform a sing
18640 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e  le step of an in
18650 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
18660 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
18670 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   return.** SQLIT
18680 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69  E_OK. If there i
18690 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20  s no work to do 
186a0 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e  (and therefore n
186b0 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63  o point in .** c
186c0 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
186d0 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74  tion again), ret
186e0 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
186f0 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72   Or, if an error
18700 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74   .** occurs, ret
18710 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65  urn some other e
18720 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rror code..**.**
18730 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79   More specificly
18740 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
18750 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f  attempts to re-o
18760 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74 61  rganize the data
18770 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74  base so .** that
18780 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f   the last page o
18790 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65  f the file curre
187a0 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20 6e  ntly in use is n
187b0 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e  o longer in use.
187c0 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
187d0 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75 6d   nFin is the num
187e0 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61  ber of pages tha
187f0 74 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  t this database 
18800 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a  would contain.**
18810 20 77 65 72 65 20 74 68 69 73 20 66 75 6e 63 74   were this funct
18820 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c  ion called until
18830 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
18840 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49  TE_DONE..**.** I
18850 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70 61  f the bCommit pa
18860 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
18870 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ero, this functi
18880 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
18890 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77  the .** caller w
188a0 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67  ill keep calling
188b0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
188c0 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72  ) until it retur
188d0 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a  ns SQLITE_DONE .
188e0 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20  ** or an error. 
188f0 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73 65  bCommit is passe
18900 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61 75  d true for an au
18910 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d  to-vacuum-on-com
18920 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69  mmit .** operati
18930 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f 72  on, or false for
18940 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
18950 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69  vacuum..*/.stati
18960 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d  c int incrVacuum
18970 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70  Step(BtShared *p
18980 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50  Bt, Pgno nFin, P
18990 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e 74  gno iLastPg, int
189a0 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e   bCommit){.  Pgn
189b0 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20  o nFreeList;    
189c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
189d0 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20   of pages still 
189e0 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
189f0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
18a00 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
18a10 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
18a20 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
18a30 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69  ert( iLastPg>nFi
18a40 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52  n );..  if( !PTR
18a50 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
18a60 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73  iLastPg) && iLas
18a70 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg!=PENDING_BYT
18a80 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
18a90 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
18aa0 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
18ab0 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d  .    nFreeList =
18ac0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
18ad0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
18ae0 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65  ]);.    if( nFre
18af0 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eList==0 ){.    
18b00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18b10 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
18b20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
18b30 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65  pBt, iLastPg, &e
18b40 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
18b50 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
18b60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18b70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18b80 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  }.    if( eType=
18b90 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
18ba0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
18bb0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
18bc0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
18bd0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
18be0 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
18bf0 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74       if( bCommit
18c00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
18c10 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67  * Remove the pag
18c20 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73  e from the files
18c30 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
18c40 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
18c50 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 62  .        ** if b
18c60 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65  Commit is non-ze
18c70 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ro. In that case
18c80 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  , the free-list 
18c90 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
18ca0 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  ** truncated to 
18cb0 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20  zero after this 
18cc0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
18cd0 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20  , so it doesn't 
18ce0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74  .        ** matt
18cf0 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63  er if it still c
18d00 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72  ontains some gar
18d10 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20  bage entries..  
18d20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
18d30 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20   Pgno iFreePg;. 
18d40 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
18d50 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
18d60 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
18d70 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
18d80 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
18d90 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f   iLastPg, BTALLO
18da0 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20  C_EXACT);.      
18db0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18dc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
18dd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18de0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
18df0 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69  sert( iFreePg==i
18e00 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
18e10 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
18e20 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  reePg);.      }.
18e30 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
18e40 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
18e50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18e60 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61  Index of free pa
18e70 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74  ge to move pLast
18e80 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d  Pg to */.      M
18e90 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b  emPage *pLastPg;
18ea0 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65 20  .      u8 eMode 
18eb0 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20  = BTALLOC_ANY;  
18ec0 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65 74   /* Mode paramet
18ed0 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42  er for allocateB
18ee0 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20 20  treePage() */.  
18ef0 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d      Pgno iNear =
18f00 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
18f10 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74 65   nearby paramete
18f20 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74  r for allocateBt
18f30 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20  reePage() */..  
18f40 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
18f50 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74  tPage(pBt, iLast
18f60 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29  Pg, &pLastPg, 0)
18f70 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
18f80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18f90 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
18fa0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
18fb0 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  * If bCommit is 
18fc0 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20  zero, this loop 
18fd0 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63  runs exactly onc
18fe0 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74  e and page pLast
18ff0 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  Pg.      ** is s
19000 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20  wapped with the 
19010 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  first free page 
19020 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66  pulled off the f
19030 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  ree list..      
19040 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74  **.      ** On t
19050 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
19060 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72 65  f bCommit is gre
19070 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
19080 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20  then keep.      
19090 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ** looping until
190a0 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63   a free-page loc
190b0 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ated within the 
190c0 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73  first nFin pages
190d0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
190e0 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a   file is found..
190f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
19100 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  f( bCommit==0 ){
19110 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d  .        eMode =
19120 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20   BTALLOC_LE;.   
19130 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69       iNear = nFi
19140 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
19150 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65   do {.        Me
19160 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
19170 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
19180 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
19190 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
191a0 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20 65  FreePg, iNear, e
191b0 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Mode);.        i
191c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
191d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
191e0 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
191f0 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  g);.          re
19200 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
19210 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61   }.        relea
19220 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
19230 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 62  .      }while( b
19240 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65 50  Commit && iFreeP
19250 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20  g>nFin );.      
19260 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c  assert( iFreePg<
19270 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
19280 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c   .      rc = rel
19290 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
192a0 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69  LastPg, eType, i
192b0 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67  PtrPage, iFreePg
192c0 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20  , bCommit);.    
192d0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
192e0 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66  astPg);.      if
192f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19300 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
19310 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
19320 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62    }.  }..  if( b
19330 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
19340 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61 73   do {.      iLas
19350 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c  tPg--;.    }whil
19360 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44  e( iLastPg==PEND
19370 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
19380 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50  t) || PTRMAP_ISP
19390 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
193a0 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44  ) );.    pBt->bD
193b0 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20  oTruncate = 1;. 
193c0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
193d0 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72  iLastPg;.  }.  r
193e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
193f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61  .}../*.** The da
19400 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79  tabase opened by
19410 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
19420 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  ent is an auto-v
19430 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a 2a  acuum database.*
19440 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69 6e  * nOrig pages in
19450 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67   size containing
19460 20 6e 46 72 65 65 20 66 72 65 65 20 70 61 67 65   nFree free page
19470 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65 78  s. Return the ex
19480 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20  pected .** size 
19490 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
194a0 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69  in pages followi
194b0 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  ng an auto-vacuu
194c0 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  m operation..*/.
194d0 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e 61  static Pgno fina
194e0 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72 65 64  lDbSize(BtShared
194f0 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69   *pBt, Pgno nOri
19500 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a  g, Pgno nFree){.
19510 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20    int nEntry;   
19520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19530 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
19540 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74  ntries on one pt
19550 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50  rmap page */.  P
19560 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20  gno nPtrmap;    
19570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19580 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d  * Number of PtrM
19590 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20 66  ap pages to be f
195a0 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  reed */.  Pgno n
195b0 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  Fin;            
195c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
195d0 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
195e0 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73  nEntry = pBt->us
195f0 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50  ableSize/5;.  nP
19600 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e  trmap = (nFree-n
19610 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45  Orig+PTRMAP_PAGE
19620 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e  NO(pBt, nOrig)+n
19630 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20  Entry)/nEntry;. 
19640 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20   nFin = nOrig - 
19650 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b  nFree - nPtrmap;
19660 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e  .  if( nOrig>PEN
19670 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
19680 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44  Bt) && nFin<PEND
19690 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
196a0 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d  t) ){.    nFin--
196b0 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50  ;.  }.  while( P
196c0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
196d0 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d  , nFin) || nFin=
196e0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
196f0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e  GE(pBt) ){.    n
19700 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65  Fin--;.  }..  re
19710 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a  turn nFin;.}../*
19720 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
19730 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
19740 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61  opened before ca
19750 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
19760 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f  ion..** It perfo
19770 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69  rms a single uni
19780 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64  t of work toward
19790 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s an incremental
197a0 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49   vacuum..**.** I
197b0 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
197c0 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69  l vacuum is fini
197d0 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20  shed after this 
197e0 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e  function has run
197f0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ,.** SQLITE_DONE
19800 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
19810 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73   it is not finis
19820 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  hed, but no erro
19830 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53  r occurred,.** S
19840 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
19850 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
19860 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
19870 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  code. .*/.int sq
19880 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61  lite3BtreeIncrVa
19890 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
198a0 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
198b0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
198c0 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
198d0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
198e0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
198f0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
19900 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54  _WRITE && p->inT
19910 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
19920 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  E );.  if( !pBt-
19930 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
19940 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
19950 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ONE;.  }else{.  
19960 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62    Pgno nOrig = b
19970 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
19980 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72  t);.    Pgno nFr
19990 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
199a0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
199b0 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f  a[36]);.    Pgno
199c0 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53   nFin = finalDbS
199d0 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20  ize(pBt, nOrig, 
199e0 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66 28  nFree);..    if(
199f0 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20   nOrig<nFin ){. 
19a00 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
19a10 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
19a20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72     }else if( nFr
19a30 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
19a40 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
19a50 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
19a60 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19a70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19a80 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
19a90 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
19aa0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 69  ;.        rc = i
19ab0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
19ac0 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20  t, nFin, nOrig, 
19ad0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
19ae0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19af0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
19b00 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
19b10 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
19b20 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
19b30 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
19b40 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
19b50 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67  a[28], pBt->nPag
19b60 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
19b70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
19b80 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
19b90 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
19ba0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
19bb0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19bc0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
19bd0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72  ine is called pr
19be0 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61  ior to sqlite3Pa
19bf0 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61  gerCommit when a
19c00 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
19c10 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72  is committed for
19c20 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
19c30 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
19c40 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
19c50 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a  returned, then *
19c60 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74  pnTrunc is set t
19c70 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
19c80 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74  pages.** the dat
19c90 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
19ca0 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  d be truncated t
19cb0 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d  o during the com
19cc0 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a  mit process. .**
19cd0 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61   i.e. the databa
19ce0 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72  se has been reor
19cf0 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20  ganized so that 
19d00 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a  only the first *
19d10 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73  pnTrunc.** pages
19d20 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a   are in use..*/.
19d30 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56  static int autoV
19d40 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68  acuumCommit(BtSh
19d50 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
19d60 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
19d70 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
19d80 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
19d90 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74  .  VVA_ONLY( int
19da0 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50   nRef = sqlite3P
19db0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
19dc0 67 65 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72  ger) );..  asser
19dd0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
19de0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
19df0 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74  ) );.  invalidat
19e00 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
19e10 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74  e(pBt);.  assert
19e20 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
19e30 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69  );.  if( !pBt->i
19e40 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  ncrVacuum ){.   
19e50 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20   Pgno nFin;     
19e60 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
19e70 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
19e80 73 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63  se after autovac
19e90 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67  uuming */.    Pg
19ea0 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  no nFree;       
19eb0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
19ec0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
19ed0 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f  ist initially */
19ee0 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b  .    Pgno iFree;
19ef0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
19f00 65 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66  ext page to be f
19f10 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  reed */.    Pgno
19f20 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f   nOrig;        /
19f30 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20  * Database size 
19f40 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a  before freeing *
19f50 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62  /..    nOrig = b
19f60 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
19f70 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d  t);.    if( PTRM
19f80 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
19f90 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d  Orig) || nOrig==
19fa0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
19fb0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
19fc0 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
19fd0 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  sible to create 
19fe0 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77  a database for w
19ff0 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70  hich the final p
1a000 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
1a010 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72  either a pointer
1a020 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65  -map page or the
1a030 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61   pending-byte pa
1a040 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20  ge. If one.     
1a050 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   ** is encounter
1a060 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ed, this indicat
1a070 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  es corruption.. 
1a080 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
1a090 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1a0a0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
1a0b0 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74  .    nFree = get
1a0c0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1a0d0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1a0e0 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c      nFin = final
1a0f0 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69  DbSize(pBt, nOri
1a100 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69  g, nFree);.    i
1a110 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20  f( nFin>nOrig ) 
1a120 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1a130 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1a140 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29  if( nFin<nOrig )
1a150 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76  {.      rc = sav
1a160 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
1a170 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
1a180 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69    for(iFree=nOri
1a190 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26  g; iFree>nFin &&
1a1a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
1a1b0 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20  iFree--){.      
1a1c0 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
1a1d0 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69  tep(pBt, nFin, i
1a1e0 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  Free, 1);.    }.
1a1f0 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c      if( (rc==SQL
1a200 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d  ITE_DONE || rc==
1a210 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46  SQLITE_OK) && nF
1a220 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  ree>0 ){.      r
1a230 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1a240 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
1a250 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
1a260 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
1a270 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1a280 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  32], 0);.      p
1a290 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
1a2a0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
1a2b0 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
1a2c0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1a2d0 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69  ->aData[28], nFi
1a2e0 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62  n);.      pBt->b
1a2f0 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a  DoTruncate = 1;.
1a300 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
1a310 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20   = nFin;.    }. 
1a320 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1a330 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
1a340 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
1a350 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
1a360 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
1a370 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50 61   nRef>=sqlite3Pa
1a380 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
1a390 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
1a3a0 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  rc;.}..#else /* 
1a3b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a3c0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
1a3d0 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69  .# define setChi
1a3e0 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c  ldPtrmaps(x) SQL
1a3f0 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f  ITE_OK.#endif../
1a400 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1a410 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
1a420 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d   phase of a two-
1a430 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
1a440 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63  his routine.** c
1a450 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b  auses a rollback
1a460 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63   journal to be c
1a470 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f  reated (if it do
1a480 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
1a490 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70  xist).** and pop
1a4a0 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75  ulated with enou
1a4b0 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73  gh information s
1a4c0 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  o that if a powe
1a4d0 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a  r loss occurs.**
1a4e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
1a4f0 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  n be restored to
1a500 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
1a510 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62  ate by playing b
1a520 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ack.** the journ
1a530 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  al.  Then the co
1a540 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f  ntents of the jo
1a550 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65  urnal are flushe
1a560 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20  d out to.** the 
1a570 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65  disk.  After the
1a580 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65   journal is safe
1a590 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65  ly on oxide, the
1a5a0 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a   changes to the.
1a5b0 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20  ** database are 
1a5c0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1a5d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
1a5e0 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78  nd flushed to ox
1a5f0 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ide..** At the e
1a600 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c  nd of this call,
1a610 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1a620 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73  urnal still exis
1a630 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73  ts on the.** dis
1a640 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69  k and we are sti
1a650 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c  ll holding all l
1a660 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61  ocks, so the tra
1a670 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74  nsaction has not
1a680 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20  .** committed.  
1a690 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  See sqlite3Btree
1a6a0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
1a6b0 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
1a6c0 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20  phase of the.** 
1a6d0 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
1a6e0 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
1a6f0 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f  is a no-op if no
1a700 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1a710 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  on is currently 
1a720 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a  active on pBt..*
1a730 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1a740 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
1a750 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62  e file for the b
1a760 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65  tree pBt. zMaste
1a770 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  r points to.** t
1a780 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
1a790 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1a7a0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
1a7b0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1a7c0 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  .** individual j
1a7d0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20  ournal file, or 
1a7e0 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74  is NULL, indicat
1a7f0 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  ing no master jo
1a800 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28  urnal file .** (
1a810 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
1a820 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
1a830 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
1a840 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73   called, the mas
1a850 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75  ter journal shou
1a860 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ld already have 
1a870 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c  been.** created,
1a880 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
1a890 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  this journal poi
1a8a0 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20  nter and synced 
1a8b0 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  to disk..**.** O
1a8c0 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74  nce this is rout
1a8d0 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64  ine has returned
1a8e0 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  , the only thing
1a8f0 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d   required to com
1a900 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65  mit.** the write
1a910 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
1a920 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66   this database f
1a930 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ile is to delete
1a940 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   the journal..*/
1a950 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1a960 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
1a970 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20  Btree *p, const 
1a980 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
1a990 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1a9a0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69  E_OK;.  if( p->i
1a9b0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1a9c0 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
1a9d0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1a9e0 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
1a9f0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66  reeEnter(p);.#if
1aa00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1aa10 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1aa20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
1aa30 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  uum ){.      rc 
1aa40 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  = autoVacuumComm
1aa50 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69  it(pBt);.      i
1aa60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1aa70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1aa80 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1aa90 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1aaa0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1aab0 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e   }.    if( pBt->
1aac0 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20  bDoTruncate ){. 
1aad0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1aae0 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70  rTruncateImage(p
1aaf0 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d  Bt->pPager, pBt-
1ab00 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23  >nPage);.    }.#
1ab10 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73  endif.    rc = s
1ab20 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1ab30 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70  tPhaseOne(pBt->p
1ab40 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20  Pager, zMaster, 
1ab50 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  0);.    sqlite3B
1ab60 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1ab70 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1ab80 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1ab90 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1aba0 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43  from both BtreeC
1abb0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
1abc0 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63  and BtreeRollbac
1abd0 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f  k().** at the co
1abe0 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72  nclusion of a tr
1abf0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
1ac00 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45  atic void btreeE
1ac10 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74  ndTransaction(Bt
1ac20 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
1ac30 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1ac40 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
1ac50 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
1ac60 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
1ac70 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
1ac80 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1ac90 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1aca0 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  .  pBt->bDoTrunc
1acb0 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ate = 0;.#endif.
1acc0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1acd0 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64  >TRANS_NONE && d
1ace0 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29  b->nVdbeRead>1 )
1acf0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
1ad00 65 20 61 72 65 20 6f 74 68 65 72 20 61 63 74 69  e are other acti
1ad10 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  ve statements th
1ad20 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69  at belong to thi
1ad30 73 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  s database.    *
1ad40 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72  * handle, downgr
1ad50 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e  ade to a read-on
1ad60 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ly transaction. 
1ad70 54 68 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d  The other statem
1ad80 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ents.    ** may 
1ad90 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67  still be reading
1ada0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1adb0 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e  se.  */.    down
1adc0 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
1add0 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29  cheTableLocks(p)
1ade0 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  ;.    p->inTrans
1adf0 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
1ae00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
1ae10 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64  f the handle had
1ae20 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61   any kind of tra
1ae30 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64  nsaction open, d
1ae40 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ecrement the .  
1ae50 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1ae60 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68   count of the sh
1ae70 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74  ared btree. If t
1ae80 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1ae90 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61  ount .    ** rea
1aea0 63 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20  ches 0, set the 
1aeb0 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
1aec0 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20  TRANS_NONE. The 
1aed0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
1aee0 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c  sed().    ** cal
1aef0 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c  l below will unl
1af00 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20  ock the pager.  
1af10 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  */.    if( p->in
1af20 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
1af30 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72  E ){.      clear
1af40 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
1af50 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
1af60 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
1af70 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66  tion--;.      if
1af80 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73  ( 0==pBt->nTrans
1af90 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
1afa0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
1afb0 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  tion = TRANS_NON
1afc0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
1afd0 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
1afe0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
1aff0 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52  tion state to TR
1b000 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c  ANS_NONE and unl
1b010 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ock the .    ** 
1b020 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61  pager if this ca
1b030 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e  ll closed the on
1b040 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ly read or write
1b050 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a   transaction.  *
1b060 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  /.    p->inTrans
1b070 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
1b080 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
1b090 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d  Unused(pBt);.  }
1b0a0 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
1b0b0 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ty(p);.}../*.** 
1b0c0 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  Commit the trans
1b0d0 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  action currently
1b0e0 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a   in progress..**
1b0f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1b100 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
1b110 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
1b120 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  a 2-phase commit
1b130 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65  .  The.** sqlite
1b140 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1b150 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64  eOne() routine d
1b160 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
1b170 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a  ase and should.*
1b180 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69  * be invoked pri
1b190 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
1b1a0 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  is routine.  The
1b1b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1b1c0 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a  mitPhaseOne().**
1b1d0 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c   routine did all
1b1e0 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69   the work of wri
1b1f0 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ting information
1b200 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64   out to disk and
1b210 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a   flushing the.**
1b220 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61   contents so tha
1b230 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74  t they are writt
1b240 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b  en onto the disk
1b250 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74   platter.  All t
1b260 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68  his.** routine h
1b270 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65  as to do is dele
1b280 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f  te or truncate o
1b290 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65  r zero the heade
1b2a0 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20  r in the.** the 
1b2b0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1b2c0 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74   (which causes t
1b2d0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  he transaction t
1b2e0 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a  o commit) and.**
1b2f0 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a   drop locks..**.
1b300 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20  ** Normally, if 
1b310 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
1b320 77 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  while the pager 
1b330 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d 70 74  layer is attempt
1b340 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c  ing to .** final
1b350 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ize the underlyi
1b360 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ng journal file,
1b370 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
1b380 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
1b390 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72  and.** the upper
1b3a0 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65   layer will atte
1b3b0 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20  mpt a rollback. 
1b3c0 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
1b3d0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
1b3e0 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74  ** is non-zero t
1b3f0 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20  hen this b-tree 
1b400 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70  transaction is p
1b410 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66  art of a multi-f
1b420 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ile .** transact
1b430 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
1b440 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  e, the transacti
1b450 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
1b460 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a  een committed .*
1b470 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61  * (by deleting a
1b480 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1b490 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61  file) and the ca
1b4a0 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65  ller will ignore
1b4b0 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
1b4c0 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  ons return code.
1b4d0 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20   So, even if an 
1b4e0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
1b4f0 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c  the pager layer,
1b500 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d  .** reset the b-
1b510 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74  tree objects int
1b520 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69  ernal state to i
1b530 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
1b540 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61   write.** transa
1b550 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63  ction has been c
1b560 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20 71  losed. This is q
1b570 75 69 74 65 20 73 61 66 65 2c 20 61 73 20 74 68  uite safe, as th
1b580 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76  e pager will hav
1b590 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65  e.** transitione
1b5a0 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73  d to the error s
1b5b0 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tate..**.** This
1b5c0 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
1b5d0 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
1b5e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b5f0 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
1b600 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
1b610 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
1b620 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
1b630 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
1b640 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1b650 50 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a  PhaseTwo(Btree *
1b660 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29  p, int bCleanup)
1b670 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  {..  if( p->inTr
1b680 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
1b690 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1b6a0 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  OK;.  sqlite3Btr
1b6b0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
1b6c0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
1b6d0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61  ..  /* If the ha
1b6e0 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65  ndle has a write
1b6f0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65  -transaction ope
1b700 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68  n, commit the sh
1b710 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a  ared-btrees .  *
1b720 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
1b730 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64  d set the shared
1b740 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
1b750 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  READ..  */.  if(
1b760 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1b770 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
1b780 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68  int rc;.    BtSh
1b790 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1b7a0 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
1b7b0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1b7c0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
1b7d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1b7e0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
1b7f0 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  >0 );.    rc = s
1b800 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1b810 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70  tPhaseTwo(pBt->p
1b820 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1b830 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
1b840 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a   bCleanup==0 ){.
1b850 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1b860 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
1b870 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1b880 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72   }.    pBt->inTr
1b890 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
1b8a0 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65  S_READ;.    btre
1b8b0 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
1b8c0 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
1b8d0 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
1b8e0 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
1b8f0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1b900 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b910 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f  ;.}../*.** Do bo
1b920 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20 63  th phases of a c
1b930 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ommit..*/.int sq
1b940 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1b950 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
1b960 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
1b970 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1b980 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1b990 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
1b9a0 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  p, 0);.  if( rc=
1b9b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b9c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1b9d0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
1b9e0 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  o(p, 0);.  }.  s
1b9f0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1ba00 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1ba10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1ba20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
1ba30 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52   state to CURSOR
1ba40 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65  _FAULT and the e
1ba50 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  rror.** code to 
1ba60 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72  errCode for ever
1ba70 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68  y cursor on BtSh
1ba80 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65  ared that pBtree
1ba90 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a  .** references..
1baa0 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73  **.** Every curs
1bab0 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c 20 69  or is tripped, i
1bac0 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73  ncluding cursors
1bad0 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20   that belong.** 
1bae0 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  to other databas
1baf0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
1bb00 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20  at happen to be 
1bb10 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63  sharing.** the c
1bb20 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65  ache with pBtree
1bb30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1bb40 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64  tine gets called
1bb50 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b   when a rollback
1bb60 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20   occurs..** All 
1bb70 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68  cursors using th
1bb80 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73  e same cache mus
1bb90 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20  t be tripped.** 
1bba0 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20  to prevent them 
1bbb0 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75  from trying to u
1bbc0 73 65 20 74 68 65 20 62 74 72 65 65 20 61 66 74  se the btree aft
1bbd0 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  er.** the rollba
1bbe0 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63  ck.  The rollbac
1bbf0 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74  k may have delet
1bc00 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20  ed tables.** or 
1bc10 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73  moved root pages
1bc20 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73  , so it is not s
1bc30 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20  ufficient to.** 
1bc40 73 61 76 65 20 74 68 65 20 73 74 61 74 65 20 6f  save the state o
1bc50 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54  f the cursor.  T
1bc60 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62  he cursor must b
1bc70 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
1bc80 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1bc90 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
1bca0 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72  sors(Btree *pBtr
1bcb0 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29  ee, int errCode)
1bcc0 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
1bcd0 0a 20 20 69 66 28 20 70 42 74 72 65 65 3d 3d 30  .  if( pBtree==0
1bce0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
1bcf0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1bd00 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d  Btree);.  for(p=
1bd10 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
1bd20 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
1bd30 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ext){.    int i;
1bd40 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1bd50 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b  eClearCursor(p);
1bd60 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d  .    p->eState =
1bd70 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20   CURSOR_FAULT;. 
1bd80 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d     p->skipNext =
1bd90 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 66 6f   errCode;.    fo
1bda0 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61  r(i=0; i<=p->iPa
1bdb0 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
1bdc0 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61  releasePage(p->a
1bdd0 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20  pPage[i]);.     
1bde0 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20   p->apPage[i] = 
1bdf0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  0;.    }.  }.  s
1be00 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1be10 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a  (pBtree);.}../*.
1be20 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** Rollback the 
1be30 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
1be40 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20 63 75  rogress.  All cu
1be50 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a  rsors will be.**
1be60 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20 74 68   invalided by th
1be70 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41  is operation.  A
1be80 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
1be90 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68  e a cursor.** th
1bea0 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74  at was open at t
1beb0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
1bec0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 77  this operation w
1bed0 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e  ill result.** in
1bee0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
1bef0 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
1bf00 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
1bf10 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1bf20 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
1bf30 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
1bf40 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
1bf50 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
1bf60 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
1bf70 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  nt sqlite3BtreeR
1bf80 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70  ollback(Btree *p
1bf90 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 29 7b  , int tripCode){
1bfa0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
1bfb0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1bfc0 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
1bfd0 70 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74  pPage1;..  sqlit
1bfe0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1bff0 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 3d  .  if( tripCode=
1c000 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c010 20 20 72 63 20 3d 20 74 72 69 70 43 6f 64 65 20    rc = tripCode 
1c020 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
1c030 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  (pBt, 0, 0);.  }
1c040 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
1c050 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1c060 69 66 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a  if( tripCode ){.
1c070 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1c080 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70  TripAllCursors(p
1c090 2c 20 74 72 69 70 43 6f 64 65 29 3b 0a 20 20 7d  , tripCode);.  }
1c0a0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1c0b0 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  y(p);..  if( p->
1c0c0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1c0d0 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
1c0e0 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  rc2;..    assert
1c0f0 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
1c100 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1c110 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
1c120 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
1c130 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
1c140 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
1c150 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c160 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
1c170 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  }..    /* The ro
1c180 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
1c190 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
1c1a0 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
1c1b0 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
1c1c0 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67 65 28  ll btreeGetPage(
1c1d0 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69  ) on page 1 agai
1c1e0 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  n to make.    **
1c1f0 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44   sure pPage1->aD
1c200 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65  ata is set corre
1c210 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ctly. */.    if(
1c220 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1c230 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
1c240 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
1c250 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20        int nPage 
1c260 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
1c270 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
1c280 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1c290 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20  e( nPage==0 );. 
1c2a0 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
1c2b0 30 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72  0 ) sqlite3Pager
1c2c0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
1c2d0 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
1c2e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c2f0 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67  pBt->nPage!=nPag
1c300 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e );.      pBt->
1c310 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
1c320 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1c330 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a  (pPage1);.    }.
1c340 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e      assert( coun
1c350 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42  tValidCursors(pB
1c360 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20  t, 1)==0 );.    
1c370 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1c380 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
1c390 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48  .    btreeClearH
1c3a0 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a  asContent(pBt);.
1c3b0 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
1c3c0 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
1c3d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1c3e0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1c3f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  rc;.}../*.** Sta
1c400 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  rt a statement s
1c410 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  ubtransaction. T
1c420 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
1c430 6e 20 63 61 6e 20 63 61 6e 20 62 65 20 72 6f 6c  n can can be rol
1c440 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65  led.** back inde
1c450 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65  pendently of the
1c460 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
1c470 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72  n. You must star
1c480 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
1c490 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74  .** before start
1c4a0 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63  ing a subtransac
1c4b0 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
1c4c0 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65  nsaction is ende
1c4d0 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
1c4e0 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20  .** if the main 
1c4f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d  transaction comm
1c500 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  its or rolls bac
1c510 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65  k..**.** Stateme
1c520 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
1c530 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75  ns are used arou
1c540 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51  nd individual SQ
1c550 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  L statements.** 
1c560 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e  that are contain
1c570 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49  ed within a BEGI
1c580 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b  N...COMMIT block
1c590 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69  .  If a constrai
1c5a0 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  nt.** error occu
1c5b0 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  rs within the st
1c5c0 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66  atement, the eff
1c5d0 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20  ect of that one 
1c5e0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e  statement.** can
1c5f0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
1c600 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
1c610 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65  o rollback the e
1c620 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
1c630 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65  n..**.** A state
1c640 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63  ment sub-transac
1c650 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
1c660 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d  ted as an anonym
1c670 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54  ous savepoint. T
1c680 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73  he.** value pass
1c690 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
1c6a0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
1c6b0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
1c6c0 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a  f savepoints,.**
1c6d0 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e   including the n
1c6e0 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  ew anonymous sav
1c6f0 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20  epoint, open on 
1c700 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e  the B-Tree. i.e.
1c710 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
1c720 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70   no active savep
1c730 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  oints and no oth
1c740 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61  er statement-tra
1c750 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a  nsactions open,.
1c760 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73  ** iStatement is
1c770 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f   1. This anonymo
1c780 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e  us savepoint can
1c790 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20   be released or 
1c7a0 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75  rolled back.** u
1c7b0 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  sing the sqlite3
1c7c0 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29  BtreeSavepoint()
1c7d0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
1c7e0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
1c7f0 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70  ginStmt(Btree *p
1c800 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74  , int iStatement
1c810 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
1c820 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1c830 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
1c840 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1c850 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
1c860 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1c870 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
1c880 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1c890 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30  TS_READ_ONLY)==0
1c8a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
1c8b0 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  tatement>0 );.  
1c8c0 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
1c8d0 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  nt>p->db->nSavep
1c8e0 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74  oint );.  assert
1c8f0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
1c900 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1c910 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65  E );.  /* At the
1c920 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20   pager level, a 
1c930 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
1c940 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70  ction is a savep
1c950 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61  oint with.  ** a
1c960 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20  n index greater 
1c970 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69  than all savepoi
1c980 6e 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c  nts created expl
1c990 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a  icitly using.  *
1c9a0 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  * SQL statements
1c9b0 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  . It is illegal 
1c9c0 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65  to open, release
1c9d0 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79   or rollback any
1c9e0 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70  .  ** such savep
1c9f0 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20  oints while the 
1ca00 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
1ca10 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
1ca20 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a  is active..  */.
1ca30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1ca40 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
1ca50 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53  (pBt->pPager, iS
1ca60 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c  tatement);.  sql
1ca70 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1ca80 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1ca90 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63  }../*.** The sec
1caa0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
1cab0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f  this function, o
1cac0 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56  p, is always SAV
1cad0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a  EPOINT_ROLLBACK.
1cae0 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f  ** or SAVEPOINT_
1caf0 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75  RELEASE. This fu
1cb00 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65  nction either re
1cb10 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20  leases or rolls 
1cb20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65  back the.** save
1cb30 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64  point identified
1cb40 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53   by parameter iS
1cb50 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64  avepoint, depend
1cb60 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  ing on the value
1cb70 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a   .** of op..**.*
1cb80 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76  * Normally, iSav
1cb90 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65  epoint is greate
1cba0 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
1cbb0 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72  to zero. However
1cbc0 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41  , if op is.** SA
1cbd0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
1cbe0 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e  , then iSavepoin
1cbf0 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31  t may also be -1
1cc00 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
1cc10 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  he .** contents 
1cc20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  of the entire tr
1cc30 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f  ansaction are ro
1cc40 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20  lled back. This 
1cc50 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  is different.** 
1cc60 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72  from a normal tr
1cc70 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61  ansaction rollba
1cc80 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20  ck, as no locks 
1cc90 61 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64  are released and
1cca0 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74   the.** transact
1ccb0 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e  ion remains open
1ccc0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ccd0 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42  BtreeSavepoint(B
1cce0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  tree *p, int op,
1ccf0 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29   int iSavepoint)
1cd00 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1cd10 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20  ITE_OK;.  if( p 
1cd20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
1cd30 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
1cd40 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1cd50 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  = p->pBt;.    as
1cd60 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f  sert( op==SAVEPO
1cd70 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f  INT_RELEASE || o
1cd80 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
1cd90 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  LBACK );.    ass
1cda0 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e  ert( iSavepoint>
1cdb0 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e  =0 || (iSavepoin
1cdc0 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56  t==-1 && op==SAV
1cdd0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29  EPOINT_ROLLBACK)
1cde0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   );.    sqlite3B
1cdf0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1ce00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1ce10 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74  gerSavepoint(pBt
1ce20 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53  ->pPager, op, iS
1ce30 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69  avepoint);.    i
1ce40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ce50 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53   ){.      if( iS
1ce60 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70  avepoint<0 && (p
1ce70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1ce80 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
1ce90 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  TY)!=0 ){.      
1cea0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30    pBt->nPage = 0
1ceb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1cec0 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
1ced0 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74  (pBt);.      pBt
1cee0 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  ->nPage = get4by
1cef0 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61  te(28 + pBt->pPa
1cf00 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20  ge1->aData);..  
1cf10 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1cf20 61 73 65 20 73 69 7a 65 20 77 61 73 20 77 72 69  ase size was wri
1cf30 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66  tten into the of
1cf40 66 73 65 74 20 32 38 20 6f 66 20 74 68 65 20 68  fset 28 of the h
1cf50 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77  eader.      ** w
1cf60 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
1cf70 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20  ion started, so 
1cf80 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
1cf90 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74   value at offset
1cfa0 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20  .      ** 28 is 
1cfb0 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20  nonzero. */.    
1cfc0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
1cfd0 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a  Page>0 );.    }.
1cfe0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1cff0 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
1d000 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1d010 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
1d020 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
1d030 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74  BTree whose root
1d040 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a   is on the page.
1d050 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20  ** iTable. If a 
1d060 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
1d070 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
1d080 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
1d090 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  t.** the caller 
1d0a0 61 6c 72 65 61 64 79 20 68 61 73 20 61 74 20 6c  already has at l
1d0b0 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79  east a read-only
1d0c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
1d0d0 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61  n.** on the data
1d0e0 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66  base already. If
1d0f0 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
1d100 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
1d110 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  en.** the caller
1d120 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68   is assumed to h
1d130 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
1d140 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
1d150 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  *.** If wrFlag==
1d160 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  0, then the curs
1d170 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  or can only be u
1d180 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  sed for reading.
1d190 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31  .** If wrFlag==1
1d1a0 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
1d1b0 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  r can be used fo
1d1c0 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
1d1d0 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f  .** writing if o
1d1e0 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  ther conditions 
1d1f0 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20  for writing are 
1d200 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
1d210 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64  .** are the cond
1d220 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  itions that must
1d230 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72   be met in order
1d240 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a   for writing to.
1d250 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a  ** be allowed:.*
1d260 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72  *.** 1:  The cur
1d270 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65  sor must have be
1d280 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  en opened with w
1d290 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32  rFlag==1.**.** 2
1d2a0 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73  :  Other databas
1d2b0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
1d2c0 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d  at share the sam
1d2d0 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a  e pager cache.**
1d2e0 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61       but which a
1d2f0 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45  re not in the RE
1d300 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73  AD_UNCOMMITTED s
1d310 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76  tate may not hav
1d320 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73  e.**     cursors
1d330 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61   open with wrFla
1d340 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65  g==0 on the same
1d350 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69   table.  Otherwi
1d360 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68  se.**     the ch
1d370 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
1d380 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20  is write cursor 
1d390 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65  would be visible
1d3a0 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72   to.**     the r
1d3b0 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74  ead cursors in t
1d3c0 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  he other databas
1d3d0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
1d3e0 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61  .** 3:  The data
1d3f0 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69  base must be wri
1d400 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65  table (not on re
1d410 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a  ad-only media).*
1d420 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d  *.** 4:  There m
1d430 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65  ust be an active
1d440 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
1d450 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20  .** No checking 
1d460 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20  is done to make 
1d470 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69  sure that page i
1d480 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20  Table really is 
1d490 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
1d4a0 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49   of a b-tree.  I
1d4b0 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
1d4c0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71  n the cursor acq
1d4d0 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  uired.** will no
1d4e0 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  t work correctly
1d4f0 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73  ..**.** It is as
1d500 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73  sumed that the s
1d510 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1d520 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e  rZero() has been
1d530 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43   called.** on pC
1d540 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ur to initialize
1d550 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63   the memory spac
1d560 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b  e prior to invok
1d570 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1d580 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d590 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  btreeCursor(.  B
1d5a0 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
1d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
1d5d0 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
1d5e0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
1d5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d600 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
1d610 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
1d620 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
1d630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d640 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
1d650 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
1d660 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
1d670 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1d680 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
1d690 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
1d6a0 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
1d6b0 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ion */.  BtCurso
1d6c0 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
1d6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6e0 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77  /* Space for new
1d6f0 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20   cursor */.){.  
1d700 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1d710 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20  p->pBt;         
1d720 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
1d730 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a   b-tree handle *
1d740 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
1d750 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1d760 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
1d770 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
1d780 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20   wrFlag==1 );.. 
1d790 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1d7a0 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65  g assert stateme
1d7b0 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20  nts verify that 
1d7c0 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61  if this is a sha
1d7d0 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72  rable .  ** b-tr
1d7e0 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ee database, the
1d7f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68   connection is h
1d800 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69  olding the requi
1d810 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c  red table locks,
1d820 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20   .  ** and that 
1d830 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
1d840 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e  ion has any open
1d850 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e   cursor that con
1d860 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a  flicts with .  *
1d870 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f  * this lock.  */
1d880 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68  .  assert( hasSh
1d890 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1d8a0 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b  ck(p, iTable, pK
1d8b0 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c 61  eyInfo!=0, wrFla
1d8c0 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74  g+1) );.  assert
1d8d0 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21  ( wrFlag==0 || !
1d8e0 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  hasReadConflicts
1d8f0 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a  (p, iTable) );..
1d900 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
1d910 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
1d920 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75 69  opened the requi
1d930 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  red transaction.
1d940 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
1d950 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
1d960 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ONE );.  assert(
1d970 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d   wrFlag==0 || p-
1d980 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1d990 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
1d9a0 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26  t( pBt->pPage1 &
1d9b0 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  & pBt->pPage1->a
1d9c0 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 4e  Data );..  if( N
1d9d0 45 56 45 52 28 77 72 46 6c 61 67 20 26 26 20 28  EVER(wrFlag && (
1d9e0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1d9f0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
1da00 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1da10 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
1da20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62  ;.  }.  if( iTab
1da30 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61  le==1 && btreePa
1da40 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20  gecount(pBt)==0 
1da50 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77  ){.    assert( w
1da60 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20  rFlag==0 );.    
1da70 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a  iTable = 0;.  }.
1da80 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e  .  /* Now that n
1da90 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63  o other errors c
1daa0 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68  an occur, finish
1dab0 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20   filling in the 
1dac0 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61  BtCursor.  ** va
1dad0 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b  riables and link
1dae0 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f   the cursor into
1daf0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69   the BtShared li
1db00 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e  st.  */.  pCur->
1db10 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f  pgnoRoot = (Pgno
1db20 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d  )iTable;.  pCur-
1db30 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70  >iPage = -1;.  p
1db40 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20  Cur->pKeyInfo = 
1db50 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72  pKeyInfo;.  pCur
1db60 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
1db70 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b  pCur->pBt = pBt;
1db80 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
1db90 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d  g==0 || wrFlag==
1dba0 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20 29  BTCF_WriteFlag )
1dbb0 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
1dbc0 67 73 20 3d 20 77 72 46 6c 61 67 3b 0a 20 20 70  gs = wrFlag;.  p
1dbd0 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  Cur->pNext = pBt
1dbe0 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  ->pCursor;.  if(
1dbf0 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a   pCur->pNext ){.
1dc00 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d      pCur->pNext-
1dc10 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20  >pPrev = pCur;. 
1dc20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f   }.  pBt->pCurso
1dc30 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72  r = pCur;.  pCur
1dc40 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
1dc50 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74  R_INVALID;.  ret
1dc60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1dc70 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1dc80 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
1dc90 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1dca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcb0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
1dcc0 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
1dcd0 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
1dce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcf0 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1dd00 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
1dd10 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
1dd20 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
1dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd40 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
1dd50 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
1dd60 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
1dd70 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
1dd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd90 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
1dda0 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20  xCompare() */.  
1ddb0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20  BtCursor *pCur  
1ddc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
1dde0 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20  rite new cursor 
1ddf0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
1de00 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
1de10 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
1de20 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28  c = btreeCursor(
1de30 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61  p, iTable, wrFla
1de40 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75  g, pKeyInfo, pCu
1de50 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  r);.  sqlite3Btr
1de60 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1de70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1de80 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
1de90 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20  e of a BtCursor 
1dea0 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e  object in bytes.
1deb0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65  .**.** This inte
1dec0 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65 64  rfaces is needed
1ded0 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f   so that users o
1dee0 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72  f cursors can pr
1def0 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66  eallocate.** suf
1df00 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20  ficient storage 
1df10 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72  to hold a cursor
1df20 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72 20  .  The BtCursor 
1df30 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65  object is opaque
1df40 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20  .** to users so 
1df50 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74  they cannot do t
1df60 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d  he sizeof() them
1df70 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75  selves - they mu
1df80 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20  st call.** this 
1df90 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20  routine..*/.int 
1dfa0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1dfb0 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20  orSize(void){.  
1dfc0 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69  return ROUND8(si
1dfd0 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b  zeof(BtCursor));
1dfe0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
1dff0 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74  lize memory that
1e000 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74   will be convert
1e010 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73  ed into a BtCurs
1e020 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  or object..**.**
1e030 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72   The simple appr
1e040 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20  oach here would 
1e050 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74  be to memset() t
1e060 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74  he entire object
1e070 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75  .** to zero.  Bu
1e080 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74  t it turns out t
1e090 68 61 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d  hat the apPage[]
1e0a0 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72   and aiIdx[] arr
1e0b0 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65  ays.** do not ne
1e0c0 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20  ed to be zeroed 
1e0d0 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61 72  and they are lar
1e0e0 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61  ge, so we can sa
1e0f0 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72  ve a lot.** of r
1e100 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70  un-time by skipp
1e110 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69  ing the initiali
1e120 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20  zation of those 
1e130 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69  elements..*/.voi
1e140 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  d sqlite3BtreeCu
1e150 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f  rsorZero(BtCurso
1e160 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28  r *p){.  memset(
1e170 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42  p, 0, offsetof(B
1e180 74 43 75 72 73 6f 72 2c 20 69 50 61 67 65 29 29  tCursor, iPage))
1e190 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
1e1a0 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20   a cursor.  The 
1e1b0 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
1e1c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1e1d0 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68  s released.** wh
1e1e0 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72 73  en the last curs
1e1f0 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f  or is closed..*/
1e200 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1e210 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43  eCloseCursor(BtC
1e220 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1e230 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20  Btree *pBtree = 
1e240 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
1e250 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20  if( pBtree ){.  
1e260 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53    int i;.    BtS
1e270 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75  hared *pBt = pCu
1e280 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69  r->pBt;.    sqli
1e290 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
1e2a0 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  tree);.    sqlit
1e2b0 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
1e2c0 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66  or(pCur);.    if
1e2d0 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29 7b  ( pCur->pPrev ){
1e2e0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50 72  .      pCur->pPr
1e2f0 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72  ev->pNext = pCur
1e300 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
1e310 73 65 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  se{.      pBt->p
1e320 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70  Cursor = pCur->p
1e330 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
1e340 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  if( pCur->pNext 
1e350 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70  ){.      pCur->p
1e360 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43  Next->pPrev = pC
1e370 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d  ur->pPrev;.    }
1e380 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1e390 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b  =pCur->iPage; i+
1e3a0 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  +){.      releas
1e3b0 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
1e3c0 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ge[i]);.    }.  
1e3d0 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
1e3e0 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
1e3f0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 42  sqlite3DbFree(pB
1e400 74 72 65 65 2d 3e 64 62 2c 20 70 43 75 72 2d 3e  tree->db, pCur->
1e410 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20  aOverflow);.    
1e420 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  /* sqlite3_free(
1e430 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71  pCur); */.    sq
1e440 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1e450 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  pBtree);.  }.  r
1e460 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e470 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
1e480 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72  ure the BtCursor
1e490 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  * given in the a
1e4a0 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61  rgument has a va
1e4b0 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  lid.** BtCursor.
1e4c0 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  info structure. 
1e4d0 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   If it is not al
1e4e0 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c  ready valid, cal
1e4f0 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  l.** btreeParseC
1e500 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74  ell() to fill it
1e510 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72   in..**.** BtCur
1e520 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61  sor.info is a ca
1e530 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72  che of the infor
1e540 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75  mation in the cu
1e550 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55  rrent cell..** U
1e560 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20  sing this cache 
1e570 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62  reduces the numb
1e580 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62  er of calls to b
1e590 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e  treeParseCell().
1e5a0 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32  .**.** 2007-06-2
1e5b0 35 3a 20 20 54 68 65 72 65 20 69 73 20 61 20 62  5:  There is a b
1e5c0 75 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69  ug in some versi
1e5d0 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74  ons of MSVC that
1e5e0 20 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f   cause the.** co
1e5f0 6d 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20  mpiler to crash 
1e600 77 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f  when getCellInfo
1e610 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  () is implemente
1e620 64 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a  d as a macro..**
1e630 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20   But there is a 
1e640 6d 65 61 73 75 72 65 61 62 6c 65 20 73 70 65 65  measureable spee
1e650 64 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75  d advantage to u
1e660 73 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f  sing the macro o
1e670 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c  n gcc.** (when l
1e680 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74  ess compiler opt
1e690 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20  imizations like 
1e6a0 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75  -Os or -O0 are u
1e6b0 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63  sed and the.** c
1e6c0 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64  ompiler is not d
1e6d0 6f 69 6e 67 20 61 67 72 65 73 73 69 76 65 20 69  oing agressive i
1e6e0 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65  nlining.)  So we
1e6f0 20 75 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63   use a real func
1e700 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43  tion.** for MSVC
1e710 20 61 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72   and a macro for
1e720 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65   everything else
1e730 2e 20 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e  .  Ticket #2457.
1e740 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
1e750 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  UG.  static void
1e760 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
1e770 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1e780 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
1e790 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67  fo;.    int iPag
1e7a0 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
1e7b0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66  .    memset(&inf
1e7c0 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66  o, 0, sizeof(inf
1e7d0 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61  o));.    btreePa
1e7e0 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70  rseCell(pCur->ap
1e7f0 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75  Page[iPage], pCu
1e800 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
1e810 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
1e820 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
1e830 7c 7c 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c  || memcmp(&info,
1e840 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69   &pCur->info, si
1e850 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29  zeof(info))==0 )
1e860 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64  ;.  }.#else.  #d
1e870 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c  efine assertCell
1e880 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23  Info(x).#endif.#
1e890 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20  ifdef _MSC_VER. 
1e8a0 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c 20 66   /* Use a real f
1e8b0 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20  unction in MSVC 
1e8c0 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62  to work around b
1e8d0 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f 6d 70  ugs in that comp
1e8e0 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69  iler. */.  stati
1e8f0 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e  c void getCellIn
1e900 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
1e910 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72  r){.    if( pCur
1e920 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
1e930 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 61  ){.      int iPa
1e940 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65  ge = pCur->iPage
1e950 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50 61 72  ;.      btreePar
1e960 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
1e970 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d  age[iPage],pCur-
1e980 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70  >aiIdx[iPage],&p
1e990 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20  Cur->info);.    
1e9a0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
1e9b0 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b   |= BTCF_ValidNK
1e9c0 65 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ey;.    }else{. 
1e9d0 20 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49       assertCellI
1e9e0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  nfo(pCur);.    }
1e9f0 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66  .  }.#else /* if
1ea00 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f   not _MSC_VER */
1ea10 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d 61 63 72  .  /* Use a macr
1ea20 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63  o in all other c
1ea30 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74 68 61 74  ompilers so that
1ea40 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73   the function is
1ea50 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66   inlined */.#def
1ea60 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ine getCellInfo(
1ea70 70 43 75 72 29 20 20 20 20 20 20 20 20 20 20 20  pCur)           
1ea80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eaa0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69             \.  i
1eab0 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
1eac0 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20 20 20  ize==0 ){       
1ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eaf0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1eb00 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
1eb10 75 72 2d 3e 69 50 61 67 65 3b 20 20 20 20 20 20  ur->iPage;      
1eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb40 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1eb50 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
1eb60 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
1eb70 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64  Page],pCur->aiId
1eb80 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e  x[iPage],&pCur->
1eb90 69 6e 66 6f 29 3b 20 20 20 20 20 20 20 20 5c 0a  info);        \.
1eba0 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
1ebb0 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
1ebc0 4e 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  NKey;           
1ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1ebf0 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20  .  }else{       
1ec00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec40 5c 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c  \.    assertCell
1ec50 49 6e 66 6f 28 70 43 75 72 29 3b 20 20 20 20 20  Info(pCur);     
1ec60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec90 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   \.  }.#endif /*
1eca0 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 23 69   _MSC_VER */..#i
1ecb0 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a  fndef NDEBUG  /*
1ecc0 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e   The next routin
1ecd0 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68  e used only with
1ece0 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  in assert() stat
1ecf0 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20  ements */./*.** 
1ed00 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
1ed10 68 65 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f  he given BtCurso
1ed20 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76  r is valid.  A v
1ed30 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f  alid cursor is o
1ed40 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75  ne.** that is cu
1ed50 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
1ed60 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28   to a row in a (
1ed70 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65  non-empty) table
1ed80 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76  ..** This is a v
1ed90 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74  erification rout
1eda0 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  ine is used only
1edb0 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29   within assert()
1edc0 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
1edd0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1ede0 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74  CursorIsValid(Bt
1edf0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1ee00 20 72 65 74 75 72 6e 20 70 43 75 72 20 26 26 20   return pCur && 
1ee10 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1ee20 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65  RSOR_VALID;.}.#e
1ee30 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a  ndif /* NDEBUG *
1ee40 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53  /../*.** Set *pS
1ee50 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ize to the size 
1ee60 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e 65  of the buffer ne
1ee70 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  eded to hold the
1ee80 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65   value of.** the
1ee90 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75 72   key for the cur
1eea0 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20  rent entry.  If 
1eeb0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
1eec0 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f  t pointing.** to
1eed0 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20   a valid entry, 
1eee0 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  *pSize is set to
1eef0 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61   0. .**.** For a
1ef00 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
1ef10 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c  INTKEY flag set,
1ef20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
1ef30 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a  turns the key.**
1ef40 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65   itself, not the
1ef50 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1ef60 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a   in the key..**.
1ef70 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
1ef80 73 74 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20  st position the 
1ef90 63 75 72 73 6f 72 20 70 72 69 6f 72 20 74 6f 20  cursor prior to 
1efa0 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f  invoking this ro
1efb0 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  utine..** .** Th
1efc0 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f  is routine canno
1efd0 74 20 66 61 69 6c 2e 20 20 49 74 20 61 6c 77 61  t fail.  It alwa
1efe0 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ys returns SQLIT
1eff0 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73  E_OK.  .*/.int s
1f000 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
1f010 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ze(BtCursor *pCu
1f020 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a  r, i64 *pSize){.
1f030 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1f040 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1f050 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1f060 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1f070 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43  OR_INVALID || pC
1f080 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1f090 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 69 66  OR_VALID );.  if
1f0a0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
1f0b0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
1f0c0 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a      *pSize = 0;.
1f0d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67 65 74    }else{.    get
1f0e0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
1f0f0 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75      *pSize = pCu
1f100 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
1f110 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1f120 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
1f130 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65  et *pSize to the
1f140 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1f150 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65 20   of data in the 
1f160 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72  entry the.** cur
1f170 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  sor currently po
1f180 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54  ints to..**.** T
1f190 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67  he caller must g
1f1a0 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68  uarantee that th
1f1b0 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  e cursor is poin
1f1c0 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55  ting to a non-NU
1f1d0 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72  LL.** valid entr
1f1e0 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  y.  In other wor
1f1f0 64 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  ds, the calling 
1f200 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67  procedure must g
1f210 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74  uarantee.** that
1f220 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20   the cursor has 
1f230 43 75 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43  Cursor.eState==C
1f240 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a  URSOR_VALID..**.
1f250 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f  ** Failure is no
1f260 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 54 68 69  t possible.  Thi
1f270 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79  s function alway
1f280 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  s returns SQLITE
1f290 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67 68 74  _OK..** It might
1f2a0 20 6a 75 73 74 20 61 73 20 77 65 6c 6c 20 62 65   just as well be
1f2b0 20 61 20 70 72 6f 63 65 64 75 72 65 20 28 72 65   a procedure (re
1f2c0 74 75 72 6e 69 6e 67 20 76 6f 69 64 29 20 62 75  turning void) bu
1f2d0 74 20 77 65 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a  t we continue.**
1f2e0 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 69 6e   to return an in
1f2f0 74 65 67 65 72 20 72 65 73 75 6c 74 20 63 6f 64  teger result cod
1f300 65 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c  e for historical
1f310 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74   reasons..*/.int
1f320 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74   sqlite3BtreeDat
1f330 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a  aSize(BtCursor *
1f340 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65  pCur, u32 *pSize
1f350 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
1f360 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1f370 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1f380 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1f390 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1f3a0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
1f3b0 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70  r);.  *pSize = p
1f3c0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b  Cur->info.nData;
1f3d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1f3e0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  _OK;.}../*.** Gi
1f3f0 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ven the page num
1f400 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c  ber of an overfl
1f410 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ow page in the d
1f420 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74  atabase (paramet
1f430 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69  er.** ovfl), thi
1f440 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73  s function finds
1f450 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1f460 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
1f470 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e  e in the .** lin
1f480 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72  ked list of over
1f490 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70  flow pages. If p
1f4a0 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73  ossible, it uses
1f4b0 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
1f4c0 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  .** pointer-map 
1f4d0 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20  data instead of 
1f4e0 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74  reading the cont
1f4f0 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c  ent of page ovfl
1f500 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a   to do so. .**.*
1f510 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
1f520 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65  curs an SQLite e
1f530 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1f540 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
1f550 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  :.**.** The page
1f560 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
1f570 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
1f580 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20  e in the linked 
1f590 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74  list is .** writ
1f5a0 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78  ten to *pPgnoNex
1f5b0 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20  t. If page ovfl 
1f5c0 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  is the last page
1f5d0 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a   in its linked .
1f5e0 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e  ** list, *pPgnoN
1f5f0 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  ext is set to ze
1f600 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70  ro. .**.** If pp
1f610 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Page is not NULL
1f620 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63  , and a referenc
1f630 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  e to the MemPage
1f640 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f   object correspo
1f650 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65  nding.** to page
1f660 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61   number pOvfl wa
1f670 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e  s obtained, then
1f680 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
1f690 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74  to point to that
1f6a0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49  .** reference. I
1f6b0 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
1f6c0 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
1f6d0 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65  aller to call re
1f6e0 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f  leasePage().** o
1f6f0 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65  n *ppPage to fre
1f700 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e  e the reference.
1f710 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65   In no reference
1f720 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62   was obtained (b
1f730 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f  ecause.** the po
1f740 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73  inter-map was us
1f750 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  ed to obtain the
1f760 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e   value for *pPgn
1f770 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20  oNext), then.** 
1f780 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
1f790 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  o zero..*/.stati
1f7a0 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f  c int getOverflo
1f7b0 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  wPage(.  BtShare
1f7c0 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
1f7d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1f7e0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1f7f0 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20  Pgno ovfl,      
1f800 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f810 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77  Current overflow
1f820 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
1f830 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
1f840 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ge,            /
1f850 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68  * OUT: MemPage h
1f860 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55  andle (may be NU
1f870 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70  LL) */.  Pgno *p
1f880 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20  PgnoNext        
1f890 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65        /* OUT: Ne
1f8a0 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
1f8b0 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20   number */.){.  
1f8c0 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20  Pgno next = 0;. 
1f8d0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
1f8e0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
1f8f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
1f900 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1f910 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1f920 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1f930 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69  (pPgnoNext);..#i
1f940 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1f950 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
1f960 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68  * Try to find th
1f970 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
1f980 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
1f990 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
1f9a0 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74  autovacuum point
1f9b0 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75  er-map pages. Gu
1f9c0 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ess that the nex
1f9d0 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20  t page in .  ** 
1f9e0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
1f9f0 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72  t is page number
1fa00 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68   (ovfl+1). If th
1fa10 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a  at guess turns .
1fa20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77    ** out to be w
1fa30 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20  rong, fall back 
1fa40 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64  to loading the d
1fa50 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a  ata of page .  *
1fa60 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f  * number ovfl to
1fa70 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e   determine the n
1fa80 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  ext page number.
1fa90 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
1faa0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
1fab0 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20     Pgno pgno;.  
1fac0 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20    Pgno iGuess = 
1fad0 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65  ovfl+1;.    u8 e
1fae0 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65  Type;..    while
1faf0 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
1fb00 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20  pBt, iGuess) || 
1fb10 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f  iGuess==PENDING_
1fb20 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1fb30 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b  {.      iGuess++
1fb40 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1fb50 20 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61   iGuess<=btreePa
1fb60 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
1fb70 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
1fb80 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73  pGet(pBt, iGuess
1fb90 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29  , &eType, &pgno)
1fba0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1fbb0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79  SQLITE_OK && eTy
1fbc0 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
1fbd0 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76  LOW2 && pgno==ov
1fbe0 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65  fl ){.        ne
1fbf0 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20  xt = iGuess;.   
1fc00 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1fc10 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _DONE;.      }. 
1fc20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1fc30 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d  .  assert( next=
1fc40 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
1fc50 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72  _DONE );.  if( r
1fc60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1fc70 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
1fc80 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c  tPage(pBt, ovfl,
1fc90 20 26 70 50 61 67 65 2c 20 28 70 70 50 61 67 65   &pPage, (ppPage
1fca0 3d 3d 30 29 20 3f 20 50 41 47 45 52 5f 47 45 54  ==0) ? PAGER_GET
1fcb0 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a  _READONLY : 0);.
1fcc0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
1fcd0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
1fce0 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ge==0 );.    if(
1fcf0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1fd00 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67  {.      next = g
1fd10 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
1fd20 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
1fd30 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d  ..  *pPgnoNext =
1fd40 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50   next;.  if( ppP
1fd50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61  age ){.    *ppPa
1fd60 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65  ge = pPage;.  }e
1fd70 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  lse{.    release
1fd80 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
1fd90 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
1fda0 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c  QLITE_DONE ? SQL
1fdb0 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a  ITE_OK : rc);.}.
1fdc0 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61  ./*.** Copy data
1fdd0 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74   from a buffer t
1fde0 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f  o a page, or fro
1fdf0 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75  m a page to a bu
1fe00 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79  ffer..**.** pPay
1fe10 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65  load is a pointe
1fe20 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64  r to data stored
1fe30 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67   on database pag
1fe40 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66  e pDbPage..** If
1fe50 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73   argument eOp is
1fe60 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79   false, then nBy
1fe70 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  te bytes of data
1fe80 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66   are copied.** f
1fe90 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20  rom pPayload to 
1fea0 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
1feb0 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49  ed at by pBuf. I
1fec0 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a  f eOp is true,.*
1fed0 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61  * then sqlite3Pa
1fee0 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
1fef0 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20  lled on pDbPage 
1ff00 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a  and nByte bytes.
1ff10 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  ** of data are c
1ff20 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62  opied from the b
1ff30 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50  uffer pBuf to pP
1ff40 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ayload..**.** SQ
1ff50 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1ff60 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ned on success, 
1ff70 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72  otherwise an err
1ff80 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
1ff90 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f  ic int copyPaylo
1ffa0 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79  ad(.  void *pPay
1ffb0 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  load,           
1ffc0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
1ffd0 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ge data */.  voi
1ffe0 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
1fff0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
20000 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20  r to buffer */. 
20010 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
20020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
20030 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
20040 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65   copy */.  int e
20050 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Op,             
20060 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70       /* 0 -> cop
20070 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d  y from page, 1 -
20080 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a  > copy to page *
20090 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  /.  DbPage *pDbP
200a0 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  age           /*
200b0 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
200c0 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a   pPayload */.){.
200d0 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20    if( eOp ){.   
200e0 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
200f0 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67  om buffer to pag
20100 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61  e (a write opera
20110 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74  tion) */.    int
20120 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
20130 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
20140 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
20150 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20160 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
20170 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  }.    memcpy(pPa
20180 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79  yload, pBuf, nBy
20190 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  te);.  }else{.  
201a0 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
201b0 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66  rom page to buff
201c0 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61  er (a read opera
201d0 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d  tion) */.    mem
201e0 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f  cpy(pBuf, pPaylo
201f0 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a  ad, nByte);.  }.
20200 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20210 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
20220 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
20230 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76  ed to read or ov
20240 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20  erwrite payload 
20250 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66  information.** f
20260 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
20270 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f  t the pCur curso
20280 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
20290 2e 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67  . The eOp.** arg
202a0 75 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 70 72  ument is interpr
202b0 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  eted as follows:
202c0 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20  .**.**   0: The 
202d0 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72  operation is a r
202e0 65 61 64 2e 20 50 6f 70 75 6c 61 74 65 20 74 68  ead. Populate th
202f0 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65  e overflow cache
20300 2e 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f 70  ..**   1: The op
20310 65 72 61 74 69 6f 6e 20 69 73 20 61 20 77 72 69  eration is a wri
20320 74 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65  te. Populate the
20330 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
20340 0a 2a 2a 20 20 20 32 3a 20 54 68 65 20 6f 70 65  .**   2: The ope
20350 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64  ration is a read
20360 2e 20 44 6f 20 6e 6f 74 20 70 6f 70 75 6c 61 74  . Do not populat
20370 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
20380 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f  ache..**.** A to
20390 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74  tal of "amt" byt
203a0 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77  es are read or w
203b0 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67  ritten beginning
203c0 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
203d0 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f   Data is read to
203e0 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66   or from the buf
203f0 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20  fer pBuf..**.** 
20400 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e  The content bein
20410 67 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  g read or writte
20420 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f  n might appear o
20430 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a  n the main page.
20440 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65 72  ** or be scatter
20450 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70  ed out on multip
20460 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  le overflow page
20470 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
20480 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65  current cursor e
20490 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72  ntry uses one or
204a0 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
204b0 61 67 65 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ages and the.** 
204c0 65 4f 70 20 61 72 67 75 6d 65 6e 74 20 69 73 20  eOp argument is 
204d0 6e 6f 74 20 32 2c 20 74 68 69 73 20 66 75 6e 63  not 2, this func
204e0 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74  tion may allocat
204f0 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20  e space for and 
20500 6c 61 7a 69 6c 79 20 0a 2a 2a 20 70 6f 70 6c 75  lazily .** poplu
20510 61 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f  ates the overflo
20520 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
20530 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f  e array (BtCurso
20540 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a  r.aOverflow). .*
20550 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * Subsequent cal
20560 6c 73 20 75 73 65 20 74 68 69 73 20 63 61 63 68  ls use this cach
20570 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e  e to make seekin
20580 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  g to the supplie
20590 64 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72  d offset .** mor
205a0 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a  e efficient..**.
205b0 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66  ** Once an overf
205c0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
205d0 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
205e0 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62  ocated, it may b
205f0 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
20600 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   if some other c
20610 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20  ursor writes to 
20620 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20  the same table, 
20630 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72  or if.** the cur
20640 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
20650 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e  a different row.
20660 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69   Additionally, i
20670 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  n auto-vacuum.**
20680 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f   mode, the follo
20690 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20  wing events may 
206a0 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76  invalidate an ov
206b0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
206c0 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   cache..**.**   
206d0 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  * An incremental
206e0 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20   vacuum,.**   * 
206f0 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f  A commit in auto
20700 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d  _vacuum="full" m
20710 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61  ode,.**   * Crea
20720 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61  ting a table (ma
20730 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67  y require moving
20740 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
20750 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
20760 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  t accessPayload(
20770 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
20780 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
20790 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
207a0 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
207b0 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74   */.  u32 offset
207c0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
207d0 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73  gin reading this
207e0 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61   far into payloa
207f0 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20  d */.  u32 amt, 
20800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
20810 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  ead this many by
20820 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  tes */.  unsigne
20830 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a  d char *pBuf, /*
20840 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73   Write the bytes
20850 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
20860 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20  r */ .  int eOp 
20870 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20880 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f  zero to read. no
20890 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e  n-zero to write.
208a0 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
208b0 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
208c0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
208d0 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b  ITE_OK;.  u32 nK
208e0 65 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d  ey;.  int iIdx =
208f0 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
20900 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
20910 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
20920 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20  ; /* Btree page 
20930 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  of current entry
20940 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
20950 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
20960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20970 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20    /* Btree this 
20980 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74  cursor belongs t
20990 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  o */.#ifdef SQLI
209a0 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c  TE_DIRECT_OVERFL
209b0 4f 57 5f 52 45 41 44 0a 20 20 69 6e 74 20 62 45  OW_READ.  int bE
209c0 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
209d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209e0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
209f0 20 72 65 61 64 69 6e 67 20 74 6f 20 65 6e 64 20   reading to end 
20a00 6f 66 20 64 61 74 61 20 2a 2f 0a 23 65 6e 64 69  of data */.#endi
20a10 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f..  assert( pPa
20a20 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
20a30 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
20a40 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
20a50 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
20a60 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
20a70 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
20a80 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
20a90 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
20aa0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
20ab0 4f 70 21 3d 32 20 7c 7c 20 6f 66 66 73 65 74 3d  Op!=2 || offset=
20ac0 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 41 6c  =0 );      /* Al
20ad0 77 61 79 73 20 73 74 61 72 74 20 66 72 6f 6d 20  ways start from 
20ae0 62 65 67 69 6e 6e 69 6e 67 20 66 6f 72 20 65 4f  beginning for eO
20af0 70 3d 3d 32 20 2a 2f 0a 0a 20 20 67 65 74 43 65  p==2 */..  getCe
20b00 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
20b10 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
20b20 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43  >info.pCell + pC
20b30 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72  ur->info.nHeader
20b40 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50 61 67  ;.  nKey = (pPag
20b50 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20  e->intKey ? 0 : 
20b60 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  (int)pCur->info.
20b70 6e 4b 65 79 29 3b 0a 23 69 66 64 65 66 20 53 51  nKey);.#ifdef SQ
20b80 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
20b90 46 4c 4f 57 5f 52 45 41 44 0a 20 20 62 45 6e 64  FLOW_READ.  bEnd
20ba0 20 3d 20 28 6f 66 66 73 65 74 2b 61 6d 74 3d 3d   = (offset+amt==
20bb0 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e  nKey+pCur->info.
20bc0 6e 44 61 74 61 29 3b 0a 23 65 6e 64 69 66 0a 0a  nData);.#endif..
20bd0 20 20 69 66 28 20 4e 45 56 45 52 28 6f 66 66 73    if( NEVER(offs
20be0 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43  et+amt > nKey+pC
20bf0 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 29 20  ur->info.nData) 
20c00 0a 20 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61 64  .   || &aPayload
20c10 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  [pCur->info.nLoc
20c20 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44  al] > &pPage->aD
20c30 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53  ata[pBt->usableS
20c40 69 7a 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  ize].  ){.    /*
20c50 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20   Trying to read 
20c60 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68  or write past th
20c70 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
20c80 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f  a is an error */
20c90 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
20ca0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
20cb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
20cc0 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65   if data must be
20cd0 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f   read/written to
20ce0 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20  /from the btree 
20cf0 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a  page itself. */.
20d00 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75    if( offset<pCu
20d10 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
20d20 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d  {.    int a = am
20d30 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66  t;.    if( a+off
20d40 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  set>pCur->info.n
20d50 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61  Local ){.      a
20d60 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
20d70 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20  ocal - offset;. 
20d80 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f     }.    rc = co
20d90 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c  pyPayload(&aPayl
20da0 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75  oad[offset], pBu
20db0 66 2c 20 61 2c 20 28 65 4f 70 20 26 20 30 78 30  f, a, (eOp & 0x0
20dc0 31 29 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61  1), pPage->pDbPa
20dd0 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20  ge);.    offset 
20de0 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d  = 0;.    pBuf +=
20df0 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61   a;.    amt -= a
20e00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
20e10 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69  ffset -= pCur->i
20e20 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  nfo.nLocal;.  }.
20e30 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
20e40 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
20e50 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f  .    const u32 o
20e60 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  vflSize = pBt->u
20e70 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20  sableSize - 4;  
20e80 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74  /* Bytes content
20e90 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a   per ovfl page *
20ea0 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50  /.    Pgno nextP
20eb0 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61  age;..    nextPa
20ec0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
20ed0 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e  Payload[pCur->in
20ee0 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20  fo.nLocal]);..  
20ef0 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74 43 75    /* If the BtCu
20f00 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d  rsor.aOverflow[]
20f10 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c   has not been al
20f20 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74  located, allocat
20f30 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a  e it now..    **
20f40 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20   Except, do not 
20f50 61 6c 6c 6f 63 61 74 65 20 61 4f 76 65 72 66 6c  allocate aOverfl
20f60 6f 77 5b 5d 20 66 6f 72 20 65 4f 70 3d 3d 32 2e  ow[] for eOp==2.
20f70 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
20f80 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61  he aOverflow[] a
20f90 72 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74  rray is sized at
20fa0 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65   one entry for e
20fb0 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ach overflow pag
20fc0 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  e.    ** in the 
20fd0 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
20fe0 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
20ff0 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  of the first ove
21000 72 66 6c 6f 77 20 70 61 67 65 20 69 73 0a 20 20  rflow page is.  
21010 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61    ** stored in a
21020 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65 74 63  Overflow[0], etc
21030 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69  . A value of 0 i
21040 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b  n the aOverflow[
21050 5d 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 6d  ] array.    ** m
21060 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e  eans "not yet kn
21070 6f 77 6e 22 20 28 74 68 65 20 63 61 63 68 65 20  own" (the cache 
21080 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61  is lazily popula
21090 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ted)..    */.   
210a0 20 69 66 28 20 65 4f 70 21 3d 32 20 26 26 20 28   if( eOp!=2 && (
210b0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
210c0 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
210d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
210e0 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e   nOvfl = (pCur->
210f0 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43  info.nPayload-pC
21100 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b  ur->info.nLocal+
21110 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c  ovflSize-1)/ovfl
21120 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Size;.      if( 
21130 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76 66  nOvfl>pCur->nOvf
21140 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  lAlloc ){.      
21150 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20 28    Pgno *aNew = (
21160 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 44 62 52  Pgno*)sqlite3DbR
21170 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
21180 20 20 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65      pCur->pBtree
21190 2d 3e 64 62 2c 20 70 43 75 72 2d 3e 61 4f 76 65  ->db, pCur->aOve
211a0 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73  rflow, nOvfl*2*s
211b0 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20  izeof(Pgno).    
211c0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
211d0 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
211e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
211f0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
21200 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21210 20 20 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c 41      pCur->nOvflA
21220 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a  lloc = nOvfl*2;.
21230 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
21240 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77  aOverflow = aNew
21250 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21260 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
21270 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21280 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43         memset(pC
21290 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30  ur->aOverflow, 0
212a0 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50  , nOvfl*sizeof(P
212b0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 70  gno));.        p
212c0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
212d0 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b   BTCF_ValidOvfl;
212e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
212f0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76      /* If the ov
21300 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
21310 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20   cache has been 
21320 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
21330 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66  e.    ** entry f
21340 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71  or the first req
21350 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70  uired overflow p
21360 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b  age is valid, sk
21370 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  ip.    ** direct
21380 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f  ly to it..    */
21390 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e  .    if( (pCur->
213a0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
213b0 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 20 26 26  ValidOvfl)!=0 &&
213c0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
213d0 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  [offset/ovflSize
213e0 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20  ] ){.      iIdx 
213f0 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  = (offset/ovflSi
21400 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50  ze);.      nextP
21410 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
21420 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20  rflow[iIdx];.   
21430 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66     offset = (off
21440 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set%ovflSize);. 
21450 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 20 3b     }..    for( ;
21460 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
21470 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50  & amt>0 && nextP
21480 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 20  age; iIdx++){.. 
21490 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69       /* If requi
214a0 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  red, populate th
214b0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
214c0 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20  list cache. */. 
214d0 20 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e       if( (pCur->
214e0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
214f0 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 20 29 7b  ValidOvfl)!=0 ){
21500 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
21510 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  !pCur->aOverflow
21520 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e  [iIdx] || pCur->
21530 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d  aOverflow[iIdx]=
21540 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  =nextPage);.    
21550 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
21560 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74  low[iIdx] = next
21570 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Page;.      }.. 
21580 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e       if( offset>
21590 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20  =ovflSize ){.   
215a0 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79       /* The only
215b0 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20   reason to read 
215c0 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20  this page is to 
215d0 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a  obtain the page.
215e0 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
215f0 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70  r for the next p
21600 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
21610 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
21620 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  age.        ** d
21630 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69  ata is not requi
21640 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72  red. So first tr
21650 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20  y to lookup the 
21660 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20  overflow.       
21670 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61   ** page-list ca
21680 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65  che, if any, the
21690 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  n fall back to t
216a0 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  he getOverflowPa
216b0 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20  ge().        ** 
216c0 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  function..      
216d0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
216e0 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 61 4f  Note that the aO
216f0 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20  verflow[] array 
21700 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
21710 64 20 62 65 63 61 75 73 65 20 65 4f 70 21 3d 32  d because eOp!=2
21720 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 65 72 65  .        ** here
21730 2e 20 20 49 66 20 65 4f 70 3d 3d 32 2c 20 74 68  .  If eOp==2, th
21740 65 6e 20 6f 66 66 73 65 74 3d 3d 30 20 61 6e 64  en offset==0 and
21750 20 74 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   this branch is 
21760 6e 65 76 65 72 20 74 61 6b 65 6e 2e 0a 20 20 20  never taken..   
21770 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
21780 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 29  assert( eOp!=2 )
21790 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
217a0 28 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73  ( pCur->curFlags
217b0 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
217c0 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  l );.        if(
217d0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
217e0 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20  [iIdx+1] ){.    
217f0 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
21800 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
21810 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20  [iIdx+1];.      
21820 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21830 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
21840 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78  lowPage(pBt, nex
21850 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50  tPage, 0, &nextP
21860 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
21870 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d          offset -
21880 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  = ovflSize;.    
21890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
218a0 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64   /* Need to read
218b0 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65   this page prope
218c0 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73  rly. It contains
218d0 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20   some of the.   
218e0 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66       ** range of
218f0 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65   data that is be
21900 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30  ing read (eOp==0
21910 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f  ) or written (eO
21920 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a  p!=0)..        *
21930 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
21940 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
21950 52 45 41 44 0a 20 20 20 20 20 20 20 20 73 71 6c  READ.        sql
21960 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 23  ite3_file *fd;.#
21970 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e  endif.        in
21980 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20  t a = amt;.     
21990 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65     if( a + offse
219a0 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  t > ovflSize ){.
219b0 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76            a = ov
219c0 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  flSize - offset;
219d0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64  .        }..#ifd
219e0 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54  ef SQLITE_DIRECT
219f0 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20  _OVERFLOW_READ. 
21a00 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c         /* If all
21a10 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
21a20 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20  re true:.       
21a30 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
21a40 20 31 29 20 74 68 69 73 20 69 73 20 61 20 72 65   1) this is a re
21a50 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e  ad operation, an
21a60 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  d .        **   
21a70 32 29 20 64 61 74 61 20 69 73 20 72 65 71 75 69  2) data is requi
21a80 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  red from the sta
21a90 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66  rt of this overf
21aa0 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20  low page, and.  
21ab0 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68        **   3) th
21ac0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 66 69  e database is fi
21ad0 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20  le-backed, and. 
21ae0 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74         **   4) t
21af0 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20  here is no open 
21b00 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
21b10 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  n, and.        *
21b20 2a 20 20 20 35 29 20 74 68 65 20 64 61 74 61 62  *   5) the datab
21b30 61 73 65 20 69 73 20 6e 6f 74 20 61 20 57 41 4c  ase is not a WAL
21b40 20 64 61 74 61 62 61 73 65 2c 0a 20 20 20 20 20   database,.     
21b50 20 20 20 2a 2a 20 20 20 36 29 20 61 6c 6c 20 64     **   6) all d
21b60 61 74 61 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ata from the pag
21b70 65 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 2e  e is being read.
21b80 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
21b90 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74 61      ** then data
21ba0 20 63 61 6e 20 62 65 20 72 65 61 64 20 64 69 72   can be read dir
21bb0 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64  ectly from the d
21bc0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74  atabase file int
21bd0 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
21be0 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c 20   output buffer, 
21bf0 62 79 70 61 73 73 69 6e 67 20 74 68 65 20 70 61  bypassing the pa
21c00 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67 65 74  ge-cache altoget
21c10 68 65 72 2e 20 54 68 69 73 20 73 70 65 65 64 73  her. This speeds
21c20 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 6c  .        ** up l
21c30 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72 65 63  oading large rec
21c40 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e 20 6d  ords that span m
21c50 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
21c60 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
21c70 20 20 20 20 20 20 20 69 66 28 20 28 65 4f 70 26         if( (eOp&
21c80 30 78 30 31 29 3d 3d 30 20 20 20 20 20 20 20 20  0x01)==0        
21c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21cb0 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (1) */.        
21cc0 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20 20   && offset==0   
21cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21cf0 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f         /* (2) */
21d00 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 62 45  .         && (bE
21d10 6e 64 20 7c 7c 20 61 3d 3d 6f 76 66 6c 53 69 7a  nd || a==ovflSiz
21d20 65 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e)              
21d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d40 2f 2a 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20  /* (6) */.      
21d50 20 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61     && pBt->inTra
21d60 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
21d70 52 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20  READ            
21d80 20 20 20 20 20 20 20 20 20 2f 2a 20 28 34 29 20           /* (4) 
21d90 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  */.         && (
21da0 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  fd = sqlite3Page
21db0 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65  rFile(pBt->pPage
21dc0 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20  r))->pMethods   
21dd0 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20    /* (3) */.    
21de0 20 20 20 20 20 26 26 20 70 42 74 2d 3e 70 50 61       && pBt->pPa
21df0 67 65 31 2d 3e 61 44 61 74 61 5b 31 39 5d 3d 3d  ge1->aData[19]==
21e00 30 78 30 31 20 20 20 20 20 20 20 20 20 20 20 20  0x01            
21e10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 35             /* (5
21e20 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a  ) */.        ){.
21e30 20 20 20 20 20 20 20 20 20 20 75 38 20 61 53 61            u8 aSa
21e40 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20  ve[4];.         
21e50 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70   u8 *aWrite = &p
21e60 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20  Buf[-4];.       
21e70 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c     memcpy(aSave,
21e80 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20   aWrite, 4);.   
21e90 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
21ea0 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57  te3OsRead(fd, aW
21eb0 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29  rite, a+4, (i64)
21ec0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e  pBt->pageSize*(n
21ed0 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20  extPage-1));.   
21ee0 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
21ef0 3d 20 67 65 74 34 62 79 74 65 28 61 57 72 69 74  = get4byte(aWrit
21f00 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  e);.          me
21f10 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61 53 61  mcpy(aWrite, aSa
21f20 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  ve, 4);.        
21f30 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
21f40 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
21f50 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
21f60 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e;.          rc 
21f70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  = sqlite3PagerAc
21f80 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65  quire(pBt->pPage
21f90 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44  r, nextPage, &pD
21fa0 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20  bPage,.         
21fb0 20 20 20 20 20 28 28 65 4f 70 26 30 78 30 31 29       ((eOp&0x01)
21fc0 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f  ==0 ? PAGER_GET_
21fd0 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20  READONLY : 0).  
21fe0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
21ff0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
22000 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22010 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d        aPayload =
22020 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
22030 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
22040 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50             nextP
22050 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61  age = get4byte(a
22060 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20  Payload);.      
22070 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50        rc = copyP
22080 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
22090 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66  [offset+4], pBuf
220a0 2c 20 61 2c 20 28 65 4f 70 26 30 78 30 31 29 2c  , a, (eOp&0x01),
220b0 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20   pDbPage);.     
220c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
220d0 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
220e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  );.            o
220f0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
22100 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
22110 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20  .        amt -= 
22120 61 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66 20  a;.        pBuf 
22130 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += a;.      }.  
22140 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
22150 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
22160 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  amt>0 ){.    ret
22170 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
22180 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
22190 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
221a0 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20  ** Read part of 
221b0 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74  the key associat
221c0 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70  ed with cursor p
221d0 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a  Cur.  Exactly.**
221e0 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c   "amt" bytes wil
221f0 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20  l be transfered 
22200 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68  into pBuf[].  Th
22210 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65  e transfer.** be
22220 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22  gins at "offset"
22230 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
22240 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74  er must ensure t
22250 68 61 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e  hat pCur is poin
22260 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20  ting to a valid 
22270 72 6f 77 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61  row.** in the ta
22280 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ble..**.** Retur
22290 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
222a0 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
222b0 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
222c0 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
222d0 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
222e0 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
222f0 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
22300 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
22310 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
22320 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22330 42 74 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f  BtreeKey(BtCurso
22340 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
22350 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
22360 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73  id *pBuf){.  ass
22370 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
22380 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
22390 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
223a0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
223b0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
223c0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
223d0 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
223e0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
223f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22400 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
22410 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
22420 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
22430 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ell );.  return 
22440 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
22450 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
22460 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
22470 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  )pBuf, 0);.}../*
22480 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
22490 20 74 68 65 20 64 61 74 61 20 61 73 73 6f 63 69   the data associ
224a0 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
224b0 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a   pCur.  Exactly.
224c0 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77  ** "amt" bytes w
224d0 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65  ill be transfere
224e0 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
224f0 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
22500 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
22510 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  t"..**.** Return
22520 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
22530 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
22540 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
22550 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
22560 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72  .  An error is r
22570 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73  eturned if "offs
22580 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65  et+amt" is large
22590 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76  r than.** the av
225a0 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e  ailable payload.
225b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
225c0 74 72 65 65 44 61 74 61 28 42 74 43 75 72 73 6f  treeData(BtCurso
225d0 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
225e0 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
225f0 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74  id *pBuf){.  int
22600 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51   rc;..#ifndef SQ
22610 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
22620 4f 42 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e  OB.  if ( pCur->
22630 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
22640 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65  NVALID ){.    re
22650 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52  turn SQLITE_ABOR
22660 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  T;.  }.#endif.. 
22670 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
22680 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
22690 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
226a0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
226b0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
226c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
226d0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
226e0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
226f0 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65  ALID );.    asse
22700 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
22710 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
22720 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
22730 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
22740 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
22750 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
22760 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
22770 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
22780 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
22790 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
227a0 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a   amt, pBuf, 0);.
227b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
227c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
227d0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
227e0 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
227f0 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79  n from the entry
22800 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43   that the .** pC
22810 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ur cursor is poi
22820 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70  nting to.  The p
22830 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65  ointer is to the
22840 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a   beginning of.**
22850 20 74 68 65 20 6b 65 79 20 69 66 20 69 6e 64 65   the key if inde
22860 78 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d  x btrees (pPage-
22870 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20  >intKey==0) and 
22880 69 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 0a  is the data for.
22890 2a 2a 20 74 61 62 6c 65 20 62 74 72 65 65 73 20  ** table btrees 
228a0 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d  (pPage->intKey==
228b0 31 29 2e 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1). The number o
228c0 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c  f bytes of avail
228d0 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61  able.** key/data
228e0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
228f0 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d   *pAmt.  If *pAm
22900 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76  t==0, then the v
22910 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64  alue.** returned
22920 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76   will not be a v
22930 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  alid pointer..**
22940 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
22950 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
22960 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d  ion.  It is comm
22970 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72  on for the entir
22980 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74  e key.** and dat
22990 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  a to fit on the 
229a0 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66  local page and f
229b0 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e  or there to be n
229c0 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  o overflow.** pa
229d0 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20  ges.  When that 
229e0 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74  is so, this rout
229f0 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ine can be used 
22a00 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a  to access the.**
22a10 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69   key and data wi
22a20 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63  thout making a c
22a30 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79  opy.  If the key
22a40 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69   and/or data spi
22a50 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72  lls.** onto over
22a60 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e  flow pages, then
22a70 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
22a80 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f   must be used to
22a90 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74   reassemble.** t
22aa0 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20  he key/data and 
22ab0 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70  copy it into a p
22ac0 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  reallocated buff
22ad0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  er..**.** The po
22ae0 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62  inter returned b
22af0 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c  y this routine l
22b00 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e  ooks directly in
22b10 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a  to the cached.**
22b20 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
22b30 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61  abase.  The data
22b40 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72   might change or
22b50 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74   move the next t
22b60 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65  ime.** any btree
22b70 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
22b80 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ed..*/.static co
22b90 6e 73 74 20 76 6f 69 64 20 2a 66 65 74 63 68 50  nst void *fetchP
22ba0 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
22bb0 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
22bc0 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
22bd0 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
22be0 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ad from */.  u32
22bf0 20 2a 70 41 6d 74 20 20 20 20 20 20 20 20 20 20   *pAmt          
22c00 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
22c10 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
22c20 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f  le bytes here */
22c30 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 43  .){.  assert( pC
22c40 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  ur!=0 && pCur->i
22c50 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
22c60 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
22c70 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  age]);.  assert(
22c80 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
22c90 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
22ca0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
22cb0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
22cc0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
22cd0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
22ce0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
22cf0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
22d00 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
22d10 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
22d20 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
22d30 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
22d40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
22d50 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20  r->info.nSize>0 
22d60 29 3b 0a 20 20 2a 70 41 6d 74 20 3d 20 70 43 75  );.  *pAmt = pCu
22d70 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
22d80 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29    return (void*)
22d90 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c  (pCur->info.pCel
22da0 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l + pCur->info.n
22db0 48 65 61 64 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  Header);.}.../*.
22dc0 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79  ** For the entry
22dd0 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75   that cursor pCu
22de0 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72  r is point to, r
22df0 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79  eturn as.** many
22e00 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65   bytes of the ke
22e10 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65  y or data as are
22e20 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68   available on th
22e30 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65  e local.** b-tre
22e40 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74  e page.  Write t
22e50 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
22e60 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74  ilable bytes int
22e70 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54  o *pAmt..**.** T
22e80 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
22e90 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ned is ephemeral
22ea0 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20  .  The key/data 
22eb0 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62  may move.** or b
22ec0 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74  e destroyed on t
22ed0 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20  he next call to 
22ee0 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e  any Btree routin
22ef0 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  e,.** including 
22f00 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72  calls from other
22f10 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74   threads against
22f20 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e   the same cache.
22f30 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74  .** Hence, a mut
22f40 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72  ex on the BtShar
22f50 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c  ed should be hel
22f60 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  d prior to calli
22f70 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ng.** this routi
22f80 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ne..**.** These 
22f90 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64  routines is used
22fa0 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63   to get quick ac
22fb0 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20  cess to key and 
22fc0 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63  data.** in the c
22fd0 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
22fe0 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   no overflow pag
22ff0 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a  es are used..*/.
23000 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
23010 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63 68  te3BtreeKeyFetch
23020 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
23030 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72   u32 *pAmt){.  r
23040 65 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f  eturn fetchPaylo
23050 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a  ad(pCur, pAmt);.
23060 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  }.const void *sq
23070 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65  lite3BtreeDataFe
23080 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43  tch(BtCursor *pC
23090 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a  ur, u32 *pAmt){.
230a0 20 20 72 65 74 75 72 6e 20 66 65 74 63 68 50 61    return fetchPa
230b0 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74  yload(pCur, pAmt
230c0 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  );.}.../*.** Mov
230d0 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
230e0 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64  n to a new child
230f0 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50   page.  The newP
23100 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20  gno argument is 
23110 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62  the.** page numb
23120 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  er of the child 
23130 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e  page to move to.
23140 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
23150 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
23160 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74  ITE_CORRUPT if t
23170 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 20 66  he page-header f
23180 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a  lags field of.**
23190 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70   the new child p
231a0 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  age does not mat
231b0 63 68 20 74 68 65 20 66 6c 61 67 73 20 66 69 65  ch the flags fie
231c0 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ld of the parent
231d0 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20   (i.e..** if an 
231e0 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70 65  intkey page appe
231f0 61 72 73 20 74 6f 20 62 65 20 74 68 65 20 70 61  ars to be the pa
23200 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e  rent of a non-in
23210 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a  tkey page, or.**
23220 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f   vice-versa)..*/
23230 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
23240 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72  ToChild(BtCursor
23250 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50   *pCur, u32 newP
23260 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  gno){.  int rc;.
23270 20 20 69 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e    int i = pCur->
23280 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65  iPage;.  MemPage
23290 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 42 74   *pNewPage;.  Bt
232a0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
232b0 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65  ur->pBt;..  asse
232c0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
232d0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
232e0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
232f0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
23300 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
23310 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55  pCur->iPage<BTCU
23320 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29  RSOR_MAX_DEPTH )
23330 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
23340 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20  ->iPage>=0 );.  
23350 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  if( pCur->iPage>
23360 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44  =(BTCURSOR_MAX_D
23370 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72  EPTH-1) ){.    r
23380 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
23390 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
233a0 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
233b0 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e  Page(pBt, newPgn
233c0 6f 2c 20 26 70 4e 65 77 50 61 67 65 2c 0a 20 20  o, &pNewPage,.  
233d0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 43               (pC
233e0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
233f0 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d  TCF_WriteFlag)==
23400 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45  0 ? PAGER_GET_RE
23410 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 69  ADONLY : 0);.  i
23420 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
23430 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67  c;.  pCur->apPag
23440 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67  e[i+1] = pNewPag
23450 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78  e;.  pCur->aiIdx
23460 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75  [i+1] = 0;.  pCu
23470 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70  r->iPage++;..  p
23480 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
23490 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
234a0 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
234b0 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
234c0 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 69 66 28  alidOvfl);.  if(
234d0 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c   pNewPage->nCell
234e0 3c 31 20 7c 7c 20 70 4e 65 77 50 61 67 65 2d 3e  <1 || pNewPage->
234f0 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 61 70  intKey!=pCur->ap
23500 50 61 67 65 5b 69 5d 2d 3e 69 6e 74 4b 65 79 20  Page[i]->intKey 
23510 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
23520 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
23530 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
23540 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
23550 66 20 30 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70  f 0./*.** Page p
23560 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74  Parent is an int
23570 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29  ernal (non-leaf)
23580 20 74 72 65 65 20 70 61 67 65 2e 20 54 68 69 73   tree page. This
23590 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73   function .** as
235a0 73 65 72 74 73 20 74 68 61 74 20 70 61 67 65 20  serts that page 
235b0 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73  number iChild is
235c0 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20   the left-child 
235d0 69 66 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a  if the iIdx'th.*
235e0 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70  * cell in page p
235f0 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69  Parent. Or, if i
23600 49 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20  Idx is equal to 
23610 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
23620 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20   of.** cells in 
23630 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61  pParent, that pa
23640 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64  ge number iChild
23650 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68   is the right-ch
23660 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61  ild of.** the pa
23670 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
23680 69 64 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  id assertParentI
23690 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50  ndex(MemPage *pP
236a0 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c  arent, int iIdx,
236b0 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20   Pgno iChild){. 
236c0 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70   assert( iIdx<=p
236d0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b  Parent->nCell );
236e0 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61  .  if( iIdx==pPa
236f0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
23700 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
23710 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
23720 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
23730 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69  Offset+8])==iChi
23740 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ld );.  }else{. 
23750 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
23760 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
23770 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43  rent, iIdx))==iC
23780 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65  hild );.  }.}.#e
23790 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73  lse.#  define as
237a0 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
237b0 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a  x,y,z) .#endif..
237c0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
237d0 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20  ursor up to the 
237e0 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a  parent page..**.
237f0 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  ** pCur->idx is 
23800 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
23810 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61  index that conta
23820 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  ins the pointer.
23830 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77  ** to the page w
23840 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
23850 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f  m.  If we are co
23860 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  ming from the.**
23870 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c   right-most chil
23880 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72  d page then pCur
23890 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
238a0 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a  one more than.**
238b0 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c   the largest cel
238c0 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  l index..*/.stat
238d0 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61  ic void moveToPa
238e0 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70  rent(BtCursor *p
238f0 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
23900 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
23910 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
23920 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
23930 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
23940 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
23950 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61  ->iPage>0 );.  a
23960 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
23970 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
23980 20 29 3b 0a 0a 20 20 2f 2a 20 55 50 44 41 54 45   );..  /* UPDATE
23990 3a 20 49 74 20 69 73 20 61 63 74 75 61 6c 6c 79  : It is actually
239a0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
239b0 65 20 63 6f 6e 64 69 74 69 6f 6e 20 74 65 73 74  e condition test
239c0 65 64 20 62 79 20 74 68 65 20 61 73 73 65 72 74  ed by the assert
239d0 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 74 6f 20 62  .  ** below to b
239e0 65 20 75 6e 74 72 75 65 20 69 66 20 74 68 65 20  e untrue if the 
239f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
23a00 20 63 6f 72 72 75 70 74 2e 20 54 68 69 73 20 63   corrupt. This c
23a10 61 6e 20 6f 63 63 75 72 20 69 66 0a 20 20 2a 2a  an occur if.  **
23a20 20 6f 6e 65 20 63 75 72 73 6f 72 20 68 61 73 20   one cursor has 
23a30 6d 6f 64 69 66 69 65 64 20 70 61 67 65 20 70 50  modified page pP
23a40 61 72 65 6e 74 20 77 68 69 6c 65 20 61 20 72 65  arent while a re
23a50 66 65 72 65 6e 63 65 20 74 6f 20 69 74 20 69 73  ference to it is
23a60 20 68 65 6c 64 20 0a 20 20 2a 2a 20 62 79 20 61   held .  ** by a
23a70 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 2e 20   second cursor. 
23a80 57 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68  Which can only h
23a90 61 70 70 65 6e 20 69 66 20 61 20 73 69 6e 67 6c  appen if a singl
23aa0 65 20 70 61 67 65 20 69 73 20 6c 69 6e 6b 65 64  e page is linked
23ab0 0a 20 20 2a 2a 20 69 6e 74 6f 20 6d 6f 72 65 20  .  ** into more 
23ac0 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20  than one b-tree 
23ad0 73 74 72 75 63 74 75 72 65 20 69 6e 20 61 20 63  structure in a c
23ae0 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 2e  orrupt database.
23af0 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73    */.#if 0.  ass
23b00 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a  ertParentIndex(.
23b10 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
23b20 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
23b30 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64   .    pCur->aiId
23b40 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
23b50 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  , .    pCur->apP
23b60 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
23b70 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 23 65 6e 64  ->pgno.  );.#end
23b80 69 66 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  if.  testcase( p
23b90 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
23ba0 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70 43 75 72  >iPage-1] > pCur
23bb0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
23bc0 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29  Page-1]->nCell )
23bd0 3b 0a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  ;..  releasePage
23be0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  (pCur->apPage[pC
23bf0 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70  ur->iPage]);.  p
23c00 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20  Cur->iPage--;.  
23c10 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
23c20 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
23c30 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
23c40 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
23c50 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 7d 0a 0a 2f  ValidOvfl);.}../
23c60 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
23c70 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rsor to point to
23c80 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
23c90 66 20 69 74 73 20 62 2d 74 72 65 65 20 73 74 72  f its b-tree str
23ca0 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
23cb0 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
23cc0 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
23cd0 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ge, then the cur
23ce0 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
23cf0 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20  point.** to the 
23d00 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
23d10 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  e instead of the
23d20 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67   actual root pag
23d30 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20 61  e. A table has a
23d40 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  .** virtual root
23d50 20 70 61 67 65 20 77 68 65 6e 20 74 68 65 20 61   page when the a
23d60 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  ctual root page 
23d70 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c  contains no cell
23d80 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67  s and a .** sing
23d90 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54  le child page. T
23da0 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
23db0 70 65 6e 20 77 69 74 68 20 74 68 65 20 74 61 62  pen with the tab
23dc0 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  le rooted at pag
23dd0 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e 1..**.** If th
23de0 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  e b-tree structu
23df0 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65  re is empty, the
23e00 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 69 73   cursor state is
23e10 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53   set to .** CURS
23e20 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65  OR_INVALID. Othe
23e30 72 77 69 73 65 2c 20 74 68 65 20 63 75 72 73 6f  rwise, the curso
23e40 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  r is set to poin
23e50 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a  t to the first.*
23e60 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f  * cell located o
23e70 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f 72 20 76  n the root (or v
23e80 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67  irtual root) pag
23e90 65 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72  e and the cursor
23ea0 20 73 74 61 74 65 0a 2a 2a 20 69 73 20 73 65 74   state.** is set
23eb0 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44   to CURSOR_VALID
23ec0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
23ed0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
23ee0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69   successfully, i
23ef0 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64  t may be assumed
23f00 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67   that the.** pag
23f10 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 69  e-header flags i
23f20 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
23f30 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d   [virtual] root-
23f40 70 61 67 65 20 69 73 20 74 68 65 20 65 78 70 65  page is the expe
23f50 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66  cted .** kind of
23f60 20 62 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e   b-tree page (i.
23f70 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69  e. if when openi
23f80 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 68  ng the cursor th
23f90 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74  e caller did not
23fa0 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65  .** specify a Ke
23fb0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
23fc0 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69  the flags byte i
23fd0 73 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72  s set to 0x05 or
23fe0 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61   0x0D,.** indica
23ff0 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74  ting a table b-t
24000 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63  ree, or if the c
24010 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69 66  aller did specif
24020 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20  y a KeyInfo .** 
24030 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c  structure the fl
24040 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20  ags byte is set 
24050 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c  to 0x02 or 0x0A,
24060 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69   indicating an i
24070 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e  ndex.** b-tree).
24080 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
24090 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73  oveToRoot(BtCurs
240a0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
240b0 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69  Page *pRoot;.  i
240c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
240d0 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  K;..  assert( cu
240e0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
240f0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
24100 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
24110 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
24120 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
24130 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  t( CURSOR_VALID 
24140 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49    < CURSOR_REQUI
24150 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
24160 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  rt( CURSOR_FAULT
24170 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55     > CURSOR_REQU
24180 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28  IRESEEK );.  if(
24190 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
241a0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
241b0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  K ){.    if( pCu
241c0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
241d0 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20  R_FAULT ){.     
241e0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
241f0 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f  kipNext!=SQLITE_
24200 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  OK );.      retu
24210 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  rn pCur->skipNex
24220 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  t;.    }.    sql
24230 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
24240 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a  rsor(pCur);.  }.
24250 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61  .  if( pCur->iPa
24260 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 77 68 69  ge>=0 ){.    whi
24270 6c 65 28 20 70 43 75 72 2d 3e 69 50 61 67 65 20  le( pCur->iPage 
24280 29 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43  ) releasePage(pC
24290 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
242a0 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 7d 65  >iPage--]);.  }e
242b0 6c 73 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67  lse if( pCur->pg
242c0 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20  noRoot==0 ){.   
242d0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
242e0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
242f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24300 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
24310 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e     rc = getAndIn
24320 69 74 50 61 67 65 28 70 43 75 72 2d 3e 70 42 74  itPage(pCur->pBt
24330 72 65 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e  ree->pBt, pCur->
24340 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d  pgnoRoot, &pCur-
24350 3e 61 70 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20  >apPage[0],.    
24360 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 43               (pC
24370 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
24380 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d  TCF_WriteFlag)==
24390 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45  0 ? PAGER_GET_RE
243a0 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20  ADONLY : 0);.   
243b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
243c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  OK ){.      pCur
243d0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
243e0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
243f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
24400 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67  }.    pCur->iPag
24410 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 52 6f  e = 0;.  }.  pRo
24420 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ot = pCur->apPag
24430 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  e[0];.  assert( 
24440 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75  pRoot->pgno==pCu
24450 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a  r->pgnoRoot );..
24460 20 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b    /* If pCur->pK
24470 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55  eyInfo is not NU
24480 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  LL, then the cal
24490 6c 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20  ler that opened 
244a0 74 68 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a  this cursor.  **
244b0 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65   expected to ope
244c0 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78  n it on an index
244d0 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69   b-tree. Otherwi
244e0 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20  se, if pKeyInfo 
244f0 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68  is.  ** NULL, th
24500 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73  e caller expects
24510 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e   a table b-tree.
24520 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
24530 74 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72  the case,.  ** r
24540 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f  eturn an SQLITE_
24550 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a  CORRUPT error. .
24560 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65    **.  ** Earlie
24570 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
24580 4c 69 74 65 20 61 73 73 75 6d 65 64 20 74 68 61  Lite assumed tha
24590 74 20 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c  t this test coul
245a0 64 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20  d not fail.  ** 
245b0 69 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  if the root page
245c0 20 77 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61   was already loa
245d0 64 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  ded when this fu
245e0 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
245f0 64 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20  d (i.e..  ** if 
24600 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e  pCur->iPage>=0).
24610 20 42 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74   But this is not
24620 20 73 6f 20 69 66 20 74 68 65 20 64 61 74 61 62   so if the datab
24630 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ase is corrupted
24640 20 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61   .  ** in such a
24650 20 77 61 79 20 74 68 61 74 20 70 61 67 65 20 70   way that page p
24660 52 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69  Root is linked i
24670 6e 74 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74  nto a second b-t
24680 72 65 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20  ree table .  ** 
24690 28 6f 72 20 74 68 65 20 66 72 65 65 6c 69 73 74  (or the freelist
246a0 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ).  */.  assert(
246b0 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d   pRoot->intKey==
246c0 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b  1 || pRoot->intK
246d0 65 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ey==0 );.  if( p
246e0 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  Root->isInit==0 
246f0 7c 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  || (pCur->pKeyIn
24700 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69  fo==0)!=pRoot->i
24710 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74  ntKey ){.    ret
24720 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
24730 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
24740 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d  pCur->aiIdx[0] =
24750 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   0;.  pCur->info
24760 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
24770 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
24780 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54  ~(BTCF_AtLast|BT
24790 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
247a0 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20  F_ValidOvfl);.. 
247b0 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c   if( pRoot->nCel
247c0 6c 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  l>0 ){.    pCur-
247d0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
247e0 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20  _VALID;.  }else 
247f0 69 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66  if( !pRoot->leaf
24800 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62   ){.    Pgno sub
24810 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52  page;.    if( pR
24820 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72  oot->pgno!=1 ) r
24830 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
24840 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73  RUPT_BKPT;.    s
24850 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74  ubpage = get4byt
24860 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b  e(&pRoot->aData[
24870 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74  pRoot->hdrOffset
24880 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  +8]);.    pCur->
24890 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
248a0 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20  VALID;.    rc = 
248b0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
248c0 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65  , subpage);.  }e
248d0 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65  lse{.    pCur->e
248e0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
248f0 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20 72 65  NVALID;.  }.  re
24900 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
24910 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
24920 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65  r down to the le
24930 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ft-most leaf ent
24940 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
24950 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  * entry to which
24960 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
24970 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a   pointing..**.**
24980 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   The left-most l
24990 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77  eaf is the one w
249a0 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  ith the smallest
249b0 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74   key - the first
249c0 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  .** in ascending
249d0 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
249e0 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74  c int moveToLeft
249f0 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  most(BtCursor *p
24a00 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  Cur){.  Pgno pgn
24a10 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  o;.  int rc = SQ
24a20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61  LITE_OK;.  MemPa
24a30 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
24a40 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
24a50 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
24a60 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
24a70 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
24a80 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
24a90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
24aa0 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  & !(pPage = pCur
24ab0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
24ac0 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a  Page])->leaf ){.
24ad0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
24ae0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
24af0 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
24b00 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  l );.    pgno = 
24b10 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
24b20 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61  l(pPage, pCur->a
24b30 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
24b40 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ]));.    rc = mo
24b50 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
24b60 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
24b70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
24b80 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
24b90 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67   down to the rig
24ba0 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ht-most leaf ent
24bb0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
24bc0 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20  * page to which 
24bd0 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
24be0 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63  pointing.  Notic
24bf0 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  e the difference
24c00 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65  .** between move
24c10 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64  ToLeftmost() and
24c20 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
24c30 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ().  moveToLeftm
24c40 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
24c50 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74  he left-most ent
24c60 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
24c70 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d  entry* whereas m
24c80 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
24c90 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69  .** finds the ri
24ca0 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  ght-most entry b
24cb0 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65  eneath the *page
24cc0 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67  *..**.** The rig
24cd0 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73  ht-most entry is
24ce0 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
24cf0 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20  e largest key - 
24d00 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20  the last.** key 
24d10 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
24d20 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
24d30 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  t moveToRightmos
24d40 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
24d50 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
24d60 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
24d70 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
24d80 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61  *pPage = 0;..  a
24d90 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
24da0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
24db0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
24dc0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
24dd0 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
24de0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24df0 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  && !(pPage = pCu
24e00 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
24e10 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b  iPage])->leaf ){
24e20 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
24e30 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
24e40 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
24e50 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75  set+8]);.    pCu
24e60 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
24e70 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e  Page] = pPage->n
24e80 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d  Cell;.    rc = m
24e90 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
24ea0 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66   pgno);.  }.  if
24eb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24ec0 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  ){.    pCur->aiI
24ed0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
24ee0 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
24ef0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
24f00 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
24f10 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
24f20 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  = ~BTCF_ValidNKe
24f30 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  y;.  }.  return 
24f40 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
24f50 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
24f60 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
24f70 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
24f80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
24f90 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
24fa0 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
24fb0 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
24fc0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
24fd0 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
24fe0 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
24ff0 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
25000 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
25010 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75  3BtreeFirst(BtCu
25020 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
25030 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
25040 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
25050 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
25060 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
25070 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
25080 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
25090 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
250a0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
250b0 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
250c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
250d0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
250e0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
250f0 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73  ALID ){.      as
25100 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
25110 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
25120 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
25130 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
25140 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
25150 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
25160 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
25170 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
25180 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29  Page]->nCell>0 )
25190 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
251a0 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  0;.      rc = mo
251b0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
251c0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
251d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
251e0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
251f0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
25200 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ry in the table.
25210 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
25220 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
25230 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20  .  Set *pRes to 
25240 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  0 if the cursor 
25250 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20  actually points 
25260 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
25270 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  or set *pRes to 
25280 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  1 if the table i
25290 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
252a0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
252b0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
252c0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
252d0 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72  nt rc;. .  asser
252e0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
252f0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
25300 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
25310 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
25320 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
25330 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  x) );..  /* If t
25340 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64  he cursor alread
25350 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
25360 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73  last entry, this
25370 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a   is a no-op. */.
25380 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c    if( CURSOR_VAL
25390 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
253a0 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   && (pCur->curFl
253b0 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73  ags & BTCF_AtLas
253c0 74 29 21 3d 30 20 29 7b 0a 23 69 66 64 65 66 20  t)!=0 ){.#ifdef 
253d0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
253e0 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73   /* This block s
253f0 65 72 76 65 73 20 74 6f 20 61 73 73 65 72 74 28  erves to assert(
25400 29 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  ) that the curso
25410 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f  r really does po
25420 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74  int .    ** to t
25430 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
25440 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a   the b-tree. */.
25450 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
25460 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75  for(ii=0; ii<pCu
25470 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b  r->iPage; ii++){
25480 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
25490 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d  Cur->aiIdx[ii]==
254a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d  pCur->apPage[ii]
254b0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d  ->nCell );.    }
254c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
254d0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
254e0 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50  Page]==pCur->apP
254f0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
25500 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20  ->nCell-1 );.   
25510 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
25520 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
25530 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64  e]->leaf );.#end
25540 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
25550 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
25560 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
25570 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
25580 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25590 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
255a0 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
255b0 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  te ){.      asse
255c0 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
255d0 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
255e0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
255f0 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
25600 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
25610 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25620 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25630 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
25640 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70  ALID );.      *p
25650 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
25660 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
25670 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ost(pCur);.     
25680 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25690 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OK ){.        pC
256a0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
256b0 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20  BTCF_AtLast;.   
256c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
256d0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
256e0 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73 74   &= ~BTCF_AtLast
256f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 0a 20 20  ;.      }.   .  
25700 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
25710 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
25720 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68  the cursor so th
25730 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
25740 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68  an entry near th
25750 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66  e key .** specif
25760 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f  ied by pIdxKey o
25770 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75  r intKey.   Retu
25780 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64  rn a success cod
25790 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54  e..**.** For INT
257a0 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20  KEY tables, the 
257b0 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72  intKey parameter
257c0 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b   is used.  pIdxK
257d0 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e  ey .** must be N
257e0 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20  ULL.  For index 
257f0 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20  tables, pIdxKey 
25800 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b  is used and intK
25810 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ey.** is ignored
25820 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78  ..**.** If an ex
25830 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74  act match is not
25840 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65   found, then the
25850 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79   cursor is alway
25860 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69  s.** left pointi
25870 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67  ng at a leaf pag
25880 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f  e which would ho
25890 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20  ld the entry if 
258a0 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65  it.** were prese
258b0 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  nt.  The cursor 
258c0 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
258d0 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d  n entry that com
258e0 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20  es.** before or 
258f0 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a  after the key..*
25900 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20  *.** An integer 
25910 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
25920 2a 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74  *pRes which is t
25930 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
25940 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65  comparing the ke
25950 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79  y with the entry
25960 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75   to which the cu
25970 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e  rsor is .** poin
25980 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69  ting.  The meani
25990 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ng of the intege
259a0 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  r written into.*
259b0 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f  * *pRes is as fo
259c0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
259d0 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68   *pRes<0      Th
259e0 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
259f0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
25a00 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
25a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
25a20 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69  s smaller than i
25a30 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72  ntKey/pIdxKey or
25a40 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
25a50 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20   empty.**       
25a60 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74             and t
25a70 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65  he cursor is the
25a80 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e  refore left poin
25a90 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a  t to nothing..**
25aa0 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30  .**     *pRes==0
25ab0 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
25ac0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
25ad0 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
25ae0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
25af0 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61        exactly ma
25b00 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64  tches intKey/pId
25b10 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  xKey..**.**     
25b20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65  *pRes>0      The
25b30 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
25b40 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
25b50 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
25b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
25b70 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74   larger than int
25b80 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a  Key/pIdxKey..**.
25b90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
25ba0 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
25bb0 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
25bc0 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Cur,          /*
25bd0 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62   The cursor to b
25be0 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70  e moved */.  Unp
25bf0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64  ackedRecord *pId
25c00 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65  xKey, /* Unpacke
25c10 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20  d index key */. 
25c20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20   i64 intKey,    
25c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
25c40 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20   table key */.  
25c50 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20 20  int biasRight,  
25c60 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
25c70 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73 65  rue, bias the se
25c80 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68  arch to the high
25c90 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   end */.  int *p
25ca0 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  Res             
25cb0 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72     /* Write sear
25cc0 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ch results here 
25cd0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
25ce0 20 20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20    RecordCompare 
25cf0 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a  xRecordCompare;.
25d00 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
25d10 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
25d20 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
25d30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
25d40 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
25d50 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
25d60 61 73 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a  assert( pRes );.
25d70 20 20 61 73 73 65 72 74 28 20 28 70 49 64 78 4b    assert( (pIdxK
25d80 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70  ey==0)==(pCur->p
25d90 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a  KeyInfo==0) );..
25da0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
25db0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
25dc0 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20  sitioned at the 
25dd0 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72 79  point we are try
25de0 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65  ing.  ** to move
25df0 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72   to, then just r
25e00 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
25e10 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a  ing any work */.
25e20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
25e30 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
25e40 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   && (pCur->curFl
25e50 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
25e60 4e 4b 65 79 29 21 3d 30 0a 20 20 20 26 26 20 70  NKey)!=0.   && p
25e70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
25e80 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20  intKey .  ){.   
25e90 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
25ea0 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a  nKey==intKey ){.
25eb0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
25ec0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
25ed0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
25ee0 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75     if( (pCur->cu
25ef0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74  rFlags & BTCF_At
25f00 4c 61 73 74 29 21 3d 30 20 26 26 20 70 43 75 72  Last)!=0 && pCur
25f10 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b  ->info.nKey<intK
25f20 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
25f30 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  s = -1;.      re
25f40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
25f50 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
25f60 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20   pIdxKey ){.    
25f70 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d  xRecordCompare =
25f80 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64   sqlite3VdbeFind
25f90 43 6f 6d 70 61 72 65 28 70 49 64 78 4b 65 79 29  Compare(pIdxKey)
25fa0 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 2d 3e 65  ;.    pIdxKey->e
25fb0 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  rrCode = 0;.    
25fc0 61 73 73 65 72 74 28 20 70 49 64 78 4b 65 79 2d  assert( pIdxKey-
25fd0 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a  >default_rc==1 .
25fe0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78           || pIdx
25ff0 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d  Key->default_rc=
26000 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  =0 .         || 
26010 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74  pIdxKey->default
26020 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20  _rc==-1.    );. 
26030 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 52 65 63   }else{.    xRec
26040 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20  ordCompare = 0; 
26050 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61 72 65 20  /* All keys are 
26060 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a  integers */.  }.
26070 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
26080 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
26090 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
260a0 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
260b0 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
260c0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
260d0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
260e0 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
260f0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
26100 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
26110 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69  [pCur->iPage]->i
26120 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
26130 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
26140 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
26150 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
26160 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
26170 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  ell>0 );.  if( p
26180 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
26190 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
261a0 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
261b0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
261c0 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
261d0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
261e0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
261f0 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ==0 );.    retur
26200 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
26210 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
26220 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
26230 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b  ey || pIdxKey );
26240 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20  .  for(;;){.    
26250 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69 64  int lwr, upr, id
26260 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63  x, c;.    Pgno c
26270 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61  hldPg;.    MemPa
26280 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
26290 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
262a0 50 61 67 65 5d 3b 0a 20 20 20 20 75 38 20 2a 70  Page];.    u8 *p
262b0 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
262c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
262d0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72  * Pointer to cur
262e0 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61  rent cell in pPa
262f0 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50  ge */..    /* pP
26300 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20  age->nCell must 
26310 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
26320 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73  zero. If this is
26330 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20   the root-page. 
26340 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72     ** the cursor
26350 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   would have been
26360 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61   INVALID above a
26370 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20  nd this for(;;) 
26380 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  loop.    ** not 
26390 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20  run. If this is 
263a0 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  not the root-pag
263b0 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65  e, then the move
263c0 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e  ToChild() routin
263d0 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68  e.    ** would h
263e0 61 76 65 20 61 6c 72 65 61 64 79 20 64 65 74 65  ave already dete
263f0 63 74 65 64 20 64 62 20 63 6f 72 72 75 70 74 69  cted db corrupti
26400 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70  on. Similarly, p
26410 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a  Page must.    **
26420 20 62 65 20 74 68 65 20 72 69 67 68 74 20 6b 69   be the right ki
26430 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62  nd (index or tab
26440 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61  le) of b-tree pa
26450 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20  ge. Otherwise.  
26460 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69    ** a moveToChi
26470 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f  ld() or moveToRo
26480 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20  ot() call would 
26490 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63 6f  have detected co
264a0 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  rruption.  */.  
264b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
264c0 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20  >nCell>0 );.    
264d0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
264e0 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d  ntKey==(pIdxKey=
264f0 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d  =0) );.    lwr =
26500 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50   0;.    upr = pP
26510 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
26520 20 20 61 73 73 65 72 74 28 20 62 69 61 73 52 69    assert( biasRi
26530 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69  ght==0 || biasRi
26540 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64  ght==1 );.    id
26550 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61 73  x = upr>>(1-bias
26560 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d  Right); /* idx =
26570 20 62 69 61 73 52 69 67 68 74 20 3f 20 75 70 72   biasRight ? upr
26580 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20   : (lwr+upr)/2; 
26590 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  */.    pCur->aiI
265a0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
265b0 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
265c0 69 66 28 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  if( xRecordCompa
265d0 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  re==0 ){.      f
265e0 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20  or(;;){.        
265f0 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  i64 nCellKey;.  
26600 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69        pCell = fi
26610 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
26620 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c  x) + pPage->chil
26630 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  dPtrSize;.      
26640 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
26650 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
26660 20 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c 3d    while( 0x80 <=
26670 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20   *(pCell++) ){. 
26680 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
26690 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61  Cell>=pPage->aDa
266a0 74 61 45 6e 64 20 29 20 72 65 74 75 72 6e 20 53  taEnd ) return S
266b0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
266c0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  PT;.          }.
266d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
266e0 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c    getVarint(pCel
266f0 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b  l, (u64*)&nCellK
26700 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ey);.        if(
26710 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79   nCellKey<intKey
26720 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
26730 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
26740 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
26750 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65 61   ){ c = -1; brea
26760 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c  k; }.        }el
26770 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e  se if( nCellKey>
26780 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
26790 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b      upr = idx-1;
267a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c  .          if( l
267b0 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b 31  wr>upr ){ c = +1
267c0 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20  ; break; }.     
267d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
267e0 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
267f0 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a  lKey==intKey );.
26800 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
26810 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
26820 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20  _ValidNKey;.    
26830 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
26840 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79  .nKey = nCellKey
26850 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
26860 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
26870 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b  age] = (u16)idx;
26880 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
26890 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
268a0 20 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d             lwr =
268b0 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20   idx;.          
268c0 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65    goto moveto_ne
268d0 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20 20  xt_layer;.      
268e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
268f0 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30         *pRes = 0
26900 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
26910 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
26920 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
26930 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
26940 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26950 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
26960 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29  rt( lwr+upr>=0 )
26970 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20  ;.        idx = 
26980 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f  (lwr+upr)>>1;  /
26990 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72  * idx = (lwr+upr
269a0 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  )/2; */.      }.
269b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
269c0 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
269d0 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20    int nCell;.   
269e0 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e       pCell = fin
269f0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
26a00 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  ) + pPage->child
26a10 50 74 72 53 69 7a 65 3b 0a 0a 20 20 20 20 20 20  PtrSize;..      
26a20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
26a30 20 73 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d   supported page-
26a40 73 69 7a 65 20 69 73 20 36 35 35 33 36 20 62 79  size is 65536 by
26a50 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  tes. This means 
26a60 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
26a70 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
26a80 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74  er of record byt
26a90 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20  es stored on an 
26aa0 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20  index B-Tree.   
26ab0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20       ** page is 
26ac0 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38 34 20  less than 16384 
26ad0 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65  bytes and may be
26ae0 20 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62   stored as a 2-b
26af0 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76  yte.        ** v
26b00 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f  arint. This info
26b10 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
26b20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76  to attempt to av
26b30 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20  oid parsing .   
26b40 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69       ** the enti
26b50 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b  re cell by check
26b60 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73 65  ing for the case
26b70 73 20 77 68 65 72 65 20 74 68 65 20 72 65 63 6f  s where the reco
26b80 72 64 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a  rd is .        *
26b90 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c  * stored entirel
26ba0 79 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74  y within the b-t
26bb0 72 65 65 20 70 61 67 65 20 62 79 20 69 6e 73 70  ree page by insp
26bc0 65 63 74 69 6e 67 20 74 68 65 20 66 69 72 73 74  ecting the first
26bd0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62   .        ** 2 b
26be0 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  ytes of the cell
26bf0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
26c00 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65       nCell = pCe
26c10 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[0];.        i
26c20 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d  f( nCell<=pPage-
26c30 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
26c40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
26c50 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e   This branch run
26c60 73 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d  s if the record-
26c70 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68  size field of th
26c80 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20  e cell is a.    
26c90 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
26ca0 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20  byte varint and 
26cb0 74 68 65 20 72 65 63 6f 72 64 20 66 69 74 73 20  the record fits 
26cc0 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20  entirely on the 
26cd0 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  main.          *
26ce0 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
26cf0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
26d00 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65  tcase( pCell+nCe
26d10 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61  ll+1==pPage->aDa
26d20 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20  taEnd );.       
26d30 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f     c = xRecordCo
26d40 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f  mpare(nCell, (vo
26d50 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70  id*)&pCell[1], p
26d60 49 64 78 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20  IdxKey, 0);.    
26d70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28      }else if( !(
26d80 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29  pCell[1] & 0x80)
26d90 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28   .          && (
26da0 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26  nCell = ((nCell&
26db0 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c  0x7f)<<7) + pCel
26dc0 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61  l[1])<=pPage->ma
26dd0 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29  xLocal.        )
26de0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
26df0 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66  he record-size f
26e00 69 65 6c 64 20 69 73 20 61 20 32 20 62 79 74 65  ield is a 2 byte
26e10 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20   varint and the 
26e20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20  record .        
26e30 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65    ** fits entire
26e40 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62  ly on the main b
26e50 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a  -tree page.  */.
26e60 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
26e70 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b  se( pCell+nCell+
26e80 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  2==pPage->aDataE
26e90 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nd );.          
26ea0 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  c = xRecordCompa
26eb0 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a  re(nCell, (void*
26ec0 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78  )&pCell[2], pIdx
26ed0 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Key, 0);.       
26ee0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26ef0 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20    /* The record 
26f00 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20  flows over onto 
26f10 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
26f20 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20  flow pages. In. 
26f30 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73           ** this
26f40 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20   case the whole 
26f50 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  cell needs to be
26f60 20 70 61 72 73 65 64 2c 20 61 20 62 75 66 66 65   parsed, a buffe
26f70 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20  r allocated.    
26f80 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63        ** and acc
26f90 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65  essPayload() use
26fa0 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68  d to retrieve th
26fb0 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  e record into th
26fc0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  e.          ** b
26fd0 75 66 66 65 72 20 62 65 66 6f 72 65 20 56 64 62  uffer before Vdb
26fe0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
26ff0 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20   can be called. 
27000 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69  */.          voi
27010 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20  d *pCellKey;.   
27020 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73         u8 * cons
27030 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43  t pCellBody = pC
27040 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69  ell - pPage->chi
27050 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20  ldPtrSize;.     
27060 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43       btreeParseC
27070 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
27080 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e  ellBody, &pCur->
27090 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  info);.         
270a0 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43   nCell = (int)pC
270b0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
270c0 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65           pCellKe
270d0 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  y = sqlite3Mallo
270e0 63 28 20 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  c( nCell );.    
270f0 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b        if( pCellK
27100 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ey==0 ){.       
27110 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
27120 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
27130 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
27140 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
27150 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43    }.          pC
27160 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
27170 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64  iPage] = (u16)id
27180 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  x;.          rc 
27190 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
271a0 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20  pCur, 0, nCell, 
271b0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
271c0 70 43 65 6c 6c 4b 65 79 2c 20 32 29 3b 0a 20 20  pCellKey, 2);.  
271d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
271e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
271f0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c  lite3_free(pCell
27200 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
27210 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
27220 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
27230 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  }.          c = 
27240 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  xRecordCompare(n
27250 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20  Cell, pCellKey, 
27260 70 49 64 78 4b 65 79 2c 20 30 29 3b 0a 20 20 20  pIdxKey, 0);.   
27270 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
27280 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
27290 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
272a0 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20 20   assert( .      
272b0 20 20 20 20 20 20 28 70 49 64 78 4b 65 79 2d 3e        (pIdxKey->
272c0 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
272d0 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29  CORRUPT || c==0)
272e0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 49  .         && (pI
272f0 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d  dxKey->errCode!=
27300 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
27310 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
27320 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a  ->mallocFailed).
27330 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
27340 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20     if( c<0 ){.  
27350 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
27360 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  x+1;.        }el
27370 73 65 20 69 66 28 20 63 3e 30 20 29 7b 0a 20 20  se if( c>0 ){.  
27380 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64          upr = id
27390 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  x-1;.        }el
273a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
273b0 73 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20  sert( c==0 );.  
273c0 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
273d0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
273e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
273f0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49         pCur->aiI
27400 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
27410 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
27420 20 20 20 20 20 20 69 66 28 20 70 49 64 78 4b 65        if( pIdxKe
27430 79 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 63 20  y->errCode ) rc 
27440 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
27450 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
27460 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
27470 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27480 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 20    if( lwr>upr ) 
27490 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61  break;.        a
274a0 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d  ssert( lwr+upr>=
274b0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78  0 );.        idx
274c0 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b   = (lwr+upr)>>1;
274d0 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b    /* idx = (lwr+
274e0 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20  upr)/2 */.      
274f0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
27500 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c  rt( lwr==upr+1 |
27510 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  | (pPage->intKey
27520 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
27530 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
27540 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
27550 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
27560 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 61  >leaf ){.      a
27570 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
27580 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
27590 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
275a0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
275b0 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   );.      pCur->
275c0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
275d0 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  e] = (u16)idx;. 
275e0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a       *pRes = c;.
275f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
27600 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f  E_OK;.      goto
27610 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
27620 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78      }.moveto_nex
27630 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69 66 28  t_layer:.    if(
27640 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65   lwr>=pPage->nCe
27650 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64  ll ){.      chld
27660 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  Pg = get4byte(&p
27670 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
27680 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
27690 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
276a0 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34     chldPg = get4
276b0 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
276c0 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20  age, lwr));.    
276d0 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  }.    pCur->aiId
276e0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
276f0 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 72   (u16)lwr;.    r
27700 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
27710 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20  pCur, chldPg);. 
27720 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
27730 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69  k;.  }.moveto_fi
27740 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e  nish:.  pCur->in
27750 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
27760 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
27770 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
27780 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
27790 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  l);.  return rc;
277a0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
277b0 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75  n TRUE if the cu
277c0 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
277d0 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
277e0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   of the table..*
277f0 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62  *.** TRUE will b
27800 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72  e returned after
27810 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
27820 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f  e3BtreeNext() mo
27830 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20  ves.** past the 
27840 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
27850 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74  e table or sqlit
27860 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f  e3BtreePrev() mo
27870 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20  ves past.** the 
27880 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52  first entry.  TR
27890 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72  UE is also retur
278a0 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65  ned if the table
278b0 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
278c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f  t sqlite3BtreeEo
278d0 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  f(BtCursor *pCur
278e0 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68  ){.  /* TODO: Wh
278f0 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  at if the cursor
27900 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45   is in CURSOR_RE
27910 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c  QUIRESEEK but al
27920 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a  l table entries.
27930 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64    ** have been d
27940 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49  eleted? This API
27950 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68   will need to ch
27960 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61  ange to return a
27970 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  n error code.  *
27980 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65  * as well as the
27990 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20   boolean result 
279a0 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65  value..  */.  re
279b0 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c  turn (CURSOR_VAL
279c0 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID!=pCur->eState
279d0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  );.}../*.** Adva
279e0 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  nce the cursor t
279f0 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
27a00 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
27a10 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
27a20 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
27a30 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
27a40 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
27a50 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
27a60 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
27a70 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
27a80 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  efore.** this ro
27a90 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
27aa0 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  , then set *pRes
27ab0 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  =1..**.** The ca
27ac0 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77  lling function w
27ad0 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f  ill set *pRes to
27ae0 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e   0 or 1.  The in
27af0 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75  itial *pRes valu
27b00 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69  e.** will be 1 i
27b10 66 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 69  f the cursor bei
27b20 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72 72 65  ng stepped corre
27b30 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c  sponds to an SQL
27b40 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66   index and.** if
27b50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f   this routine co
27b60 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b  uld have been sk
27b70 69 70 70 65 64 20 69 66 20 74 68 61 74 20 53 51  ipped if that SQ
27b80 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e  L index had been
27b90 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64  .** a unique ind
27ba0 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74  ex.  Otherwise t
27bb0 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68  he caller will h
27bc0 61 76 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f  ave set *pRes to
27bd0 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69   zero..** Zero i
27be0 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  s the common cas
27bf0 65 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d 70  e. The btree imp
27c00 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66  lementation is f
27c10 72 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a  ree to use the.*
27c20 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20  * initial *pRes 
27c30 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20  value as a hint 
27c40 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f  to improve perfo
27c50 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20  rmance, but the 
27c60 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74  current.** SQLit
27c70 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e  e btree implemen
27c80 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e  tation does not.
27c90 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20   (Note that the 
27ca0 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20  comdb2 btree.** 
27cb0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
27cc0 6f 65 73 20 75 73 65 20 74 68 69 73 20 68 69 6e  oes use this hin
27cd0 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a  t, however.).*/.
27ce0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
27cf0 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Next(BtCursor *p
27d00 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
27d10 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
27d20 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20   idx;.  MemPage 
27d30 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
27d40 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
27d50 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
27d60 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29  ssert( pRes!=0 )
27d70 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65  ;.  assert( *pRe
27d80 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31  s==0 || *pRes==1
27d90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
27da0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
27db0 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  || pCur->eState!
27dc0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
27dd0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
27de0 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
27df0 44 20 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64  D ){.    invalid
27e00 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
27e10 28 70 43 75 72 29 3b 0a 20 20 20 20 72 63 20 3d  (pCur);.    rc =
27e20 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
27e30 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
27e40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27e50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  _OK ){.      *pR
27e60 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  es = 0;.      re
27e70 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
27e80 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
27e90 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
27ea0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  ate ){.      *pR
27eb0 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  es = 1;.      re
27ec0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27ed0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
27ee0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a  ur->skipNext ){.
27ef0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
27f00 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
27f10 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
27f20 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
27f30 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20  _SKIPNEXT );.   
27f40 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
27f50 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
27f60 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
27f70 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20  skipNext>0 ){.  
27f80 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
27f90 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Next = 0;.      
27fa0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
27fb0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
27fc0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
27fd0 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
27fe0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ext = 0;.    }. 
27ff0 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
28000 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
28010 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d  >iPage];.  idx =
28020 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   ++pCur->aiIdx[p
28030 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
28040 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
28050 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  Init );..  /* If
28060 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
28070 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20 69  le is corrupt, i
28080 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
28090 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69  r the value of i
280a0 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69  dx .  ** to be i
280b0 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68 69  nvalid here. Thi
280c0 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72  s can only occur
280d0 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75 72   if a second cur
280e0 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a  sor modifies.  *
280f0 2a 20 74 68 65 20 70 61 67 65 20 77 68 69 6c 65  * the page while
28100 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
28110 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65  holding a refere
28120 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63 68  nce to it. Which
28130 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68   can.  ** only h
28140 61 70 70 65 6e 20 69 66 20 74 68 65 20 64 61 74  appen if the dat
28150 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74  abase is corrupt
28160 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 61   in such a way a
28170 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20  s to link the.  
28180 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72  ** page into mor
28190 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65  e than one b-tre
281a0 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  e structure. */.
281b0 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 3e    testcase( idx>
281c0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
281d0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
281e0 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
281f0 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
28200 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
28210 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20  CF_ValidOvfl);. 
28220 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d   if( idx>=pPage-
28230 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66  >nCell ){.    if
28240 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
28250 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  {.      rc = mov
28260 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
28270 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
28280 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
28290 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20  Offset+8]));.   
282a0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
282b0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
282c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
282d0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
282e0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
282f0 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
28300 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
28310 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
28320 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20    }.    do{.    
28330 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
28340 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
28350 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
28360 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
28370 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
28380 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
28390 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
283a0 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f    }.      moveTo
283b0 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
283c0 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
283d0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
283e0 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c  Page];.    }whil
283f0 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
28400 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61  Cur->iPage]>=pPa
28410 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
28420 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
28430 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
28440 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
28450 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
28460 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
28470 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
28480 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
28490 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
284a0 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20  rc;.  }.  *pRes 
284b0 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
284c0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65  ->leaf ){.    re
284d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
284e0 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54    }.  rc = moveT
284f0 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
28500 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
28510 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65  ../*.** Step the
28520 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62   cursor to the b
28530 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69  ack to the previ
28540 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ous entry in the
28550 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
28560 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
28570 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
28580 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
28590 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
285a0 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72  nting to the fir
285b0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
285c0 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
285d0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
285e0 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
285f0 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a   set *pRes=1..**
28600 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
28610 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65  function will se
28620 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20  t *pRes to 0 or 
28630 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20  1.  The initial 
28640 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77  *pRes value.** w
28650 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65 20  ill be 1 if the 
28660 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65  cursor being ste
28670 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73  pped corresponds
28680 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78   to an SQL index
28690 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20   and.** if this 
286a0 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61  routine could ha
286b0 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20  ve been skipped 
286c0 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65  if that SQL inde
286d0 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20  x had been.** a 
286e0 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f  unique index.  O
286f0 74 68 65 72 77 69 73 65 20 74 68 65 20 63 61 6c  therwise the cal
28700 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65  ler will have se
28710 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e  t *pRes to zero.
28720 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20  .** Zero is the 
28730 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65  common case. The
28740 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74   btree implement
28750 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f  ation is free to
28760 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74   use the.** init
28770 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20  ial *pRes value 
28780 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70  as a hint to imp
28790 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  rove performance
287a0 2c 20 62 75 74 20 74 68 65 20 63 75 72 72 65 6e  , but the curren
287b0 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65  t.** SQLite btre
287c0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
287d0 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65   does not. (Note
287e0 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32   that the comdb2
287f0 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d   btree.** implem
28800 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73  entation does us
28810 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77  e this hint, how
28820 65 76 65 72 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71  ever.).*/.int sq
28830 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
28840 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  us(BtCursor *pCu
28850 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
28860 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
28870 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
28880 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
28890 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
288a0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d    assert( pRes!=
288b0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a  0 );.  assert( *
288c0 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73  pRes==0 || *pRes
288d0 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
288e0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
288f0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  =0 || pCur->eSta
28900 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
28910 20 29 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   );.  pCur->curF
28920 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41  lags &= ~(BTCF_A
28930 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64  tLast|BTCF_Valid
28940 4f 76 66 6c 29 3b 0a 20 20 69 66 28 20 70 43 75  Ovfl);.  if( pCu
28950 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
28960 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 69  R_VALID ){.    i
28970 66 28 20 41 4c 57 41 59 53 28 70 43 75 72 2d 3e  f( ALWAYS(pCur->
28980 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
28990 45 51 55 49 52 45 53 45 45 4b 29 20 29 7b 0a 20  EQUIRESEEK) ){. 
289a0 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 52       rc = btreeR
289b0 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
289c0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20  tion(pCur);.    
289d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
289e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  _OK ){.        *
289f0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
28a00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
28a10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
28a20 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
28a30 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
28a40 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
28a50 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
28a60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
28a70 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
28a80 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  skipNext ){.    
28a90 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
28aa0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
28ab0 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
28ac0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
28ad0 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70  PNEXT );.      p
28ae0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
28af0 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
28b00 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
28b10 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20 20 20 20  Next<0 ){.      
28b20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
28b30 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2a 70   = 0;.        *p
28b40 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
28b50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28b60 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
28b70 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
28b80 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
28b90 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
28ba0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
28bb0 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
28bc0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
28bd0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
28be0 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64  af ){.    int id
28bf0 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  x = pCur->aiIdx[
28c00 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
28c10 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
28c20 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
28c30 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
28c40 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66  , idx)));.    if
28c50 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2a 70  ( rc ){.      *p
28c60 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
28c70 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
28c80 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
28c90 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
28ca0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
28cb0 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  le( pCur->aiIdx[
28cc0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20  pCur->iPage]==0 
28cd0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  ){.      if( pCu
28ce0 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  r->iPage==0 ){. 
28cf0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
28d00 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
28d10 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70  ALID;.        *p
28d20 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Res = 1;.       
28d30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28d40 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
28d50 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43   moveToParent(pC
28d60 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ur);.    }.    p
28d70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
28d80 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63  = 0;.    pCur->c
28d90 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
28da0 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
28db0 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20  _ValidOvfl);..  
28dc0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
28dd0 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20  ur->iPage]--;.  
28de0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
28df0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
28e00 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ge];.    if( pPa
28e10 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70  ge->intKey && !p
28e20 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
28e30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28e40 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43  BtreePrevious(pC
28e50 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  ur, pRes);.    }
28e60 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
28e70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
28e80 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20  }.  }.  *pRes = 
28e90 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
28ea0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
28eb0 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f  e a new page fro
28ec0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
28ed0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ile..**.** The n
28ee0 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  ew page is marke
28ef0 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e  d as dirty.  (In
28f00 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71   other words, sq
28f10 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
28f20 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79  ).** has already
28f30 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20   been called on 
28f40 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20  the new page.)  
28f50 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73  The new page has
28f60 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65   also.** been re
28f70 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65  ferenced and the
28f80 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
28f90 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
28fa0 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  for calling.** s
28fb0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
28fc0 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  () on the new pa
28fd0 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f  ge when it is do
28fe0 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ne..**.** SQLITE
28ff0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
29000 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79  on success.  Any
29010 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61   other return va
29020 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  lue indicates.**
29030 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50   an error.  *ppP
29040 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61  age and *pPgno a
29050 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  re undefined in 
29060 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20  the event of an 
29070 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74  error..** Do not
29080 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50   invoke sqlite3P
29090 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a  agerUnref() on *
290a0 70 70 50 61 67 65 20 69 66 20 61 6e 20 65 72 72  ppPage if an err
290b0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  or is returned..
290c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65  **.** If the "ne
290d0 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20  arby" parameter 
290e0 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61  is not 0, then a
290f0 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65  n effort is made
29100 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61   to .** locate a
29110 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74   page close to t
29120 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22  he page number "
29130 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63  nearby".  This c
29140 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e  an be used in an
29150 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b  .** attempt to k
29160 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65  eep related page
29170 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20  s close to each 
29180 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74  other in the dat
29190 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77  abase file,.** w
291a0 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e  hich in turn can
291b0 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61   make database a
291c0 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a  ccess faster..**
291d0 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f 64 65  .** If the eMode
291e0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 42 54   parameter is BT
291f0 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20  ALLOC_EXACT and 
29200 74 68 65 20 6e 65 61 72 62 79 20 70 61 67 65 20  the nearby page 
29210 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68 65  exists.** anywhe
29220 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  re on the free-l
29230 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ist, then it is 
29240 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
29250 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 0a 2a   returned.  If.*
29260 2a 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c  * eMode is BTALL
29270 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68 65 20 70  OC_LT then the p
29280 61 67 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c  age returned wil
29290 6c 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f  l be less than o
292a0 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65  r equal.** to ne
292b0 61 72 62 79 20 69 66 20 61 6e 79 20 73 75 63 68  arby if any such
292c0 20 70 61 67 65 20 65 78 69 73 74 73 2e 20 20 49   page exists.  I
292d0 66 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c  f eMode is BTALL
292e0 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74 68 65 72  OC_ANY then ther
292f0 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73 74  e.** are no rest
29300 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69 63  rictions on whic
29310 68 20 70 61 67 65 20 69 73 20 72 65 74 75 72 6e  h page is return
29320 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
29330 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  t allocateBtreeP
29340 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
29350 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  *pBt,         /*
29360 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
29370 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
29380 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  ,      /* Store 
29390 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61  pointer to the a
293a0 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 65  llocated page he
293b0 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50  re */.  Pgno *pP
293c0 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
293d0 2a 20 53 74 6f 72 65 20 74 68 65 20 70 61 67 65  * Store the page
293e0 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a   number here */.
293f0 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20    Pgno nearby,  
29400 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72           /* Sear
29410 63 68 20 66 6f 72 20 61 20 70 61 67 65 20 6e 65  ch for a page ne
29420 61 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20  ar this one */. 
29430 20 75 38 20 65 4d 6f 64 65 20 20 20 20 20 20 20   u8 eMode       
29440 20 20 20 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c          /* BTALL
29450 4f 43 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f  OC_EXACT, BTALLO
29460 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43  C_LT, or BTALLOC
29470 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  _ANY */.){.  Mem
29480 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20  Page *pPage1;.  
29490 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b  int rc;.  u32 n;
294a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
294b0 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
294c0 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32  reelist */.  u32
294d0 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   k;     /* Numbe
294e0 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74  r of leaves on t
294f0 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20  he trunk of the 
29500 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65  freelist */.  Me
29510 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20  mPage *pTrunk = 
29520 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
29530 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20  revTrunk = 0;.  
29540 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20  Pgno mxPage;    
29550 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f   /* Total size o
29560 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
29570 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ile */..  assert
29580 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
29590 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
295a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4d   );.  assert( eM
295b0 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59  ode==BTALLOC_ANY
295c0 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20 26 26   || (nearby>0 &&
295d0 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74   IfNotOmitAV(pBt
295e0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 29 20 29  ->autoVacuum)) )
295f0 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42 74  ;.  pPage1 = pBt
29600 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61  ->pPage1;.  mxPa
29610 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ge = btreePageco
29620 75 6e 74 28 70 42 74 29 3b 0a 20 20 6e 20 3d 20  unt(pBt);.  n = 
29630 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
29640 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
29650 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50  testcase( n==mxP
29660 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e  age-1 );.  if( n
29670 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  >=mxPage ){.    
29680 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
29690 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
296a0 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
296b0 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61   /* There are pa
296c0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
296d0 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20  ist.  Reuse one 
296e0 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20  of those pages. 
296f0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75  */.    Pgno iTru
29700 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63  nk;.    u8 searc
29710 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66  hList = 0; /* If
29720 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d   the free-list m
29730 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20  ust be searched 
29740 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a  for 'nearby' */.
29750 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65      .    /* If e
29760 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58  Mode==BTALLOC_EX
29770 41 43 54 20 61 6e 64 20 61 20 71 75 65 72 79 20  ACT and a query 
29780 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  of the pointer-m
29790 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20  ap.    ** shows 
297a0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27 6e  that the page 'n
297b0 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68  earby' is somewh
297c0 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
297d0 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a  list, then.    *
297e0 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73  * the entire-lis
297f0 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68  t will be search
29800 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ed for that page
29810 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
29820 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
29830 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
29840 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45  eMode==BTALLOC_E
29850 58 41 43 54 20 29 7b 0a 20 20 20 20 20 20 69 66  XACT ){.      if
29860 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65  ( nearby<=mxPage
29870 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65   ){.        u8 e
29880 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 61 73  Type;.        as
29890 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29  sert( nearby>0 )
298a0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
298b0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
298c0 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  m );.        rc 
298d0 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
298e0 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c   nearby, &eType,
298f0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
29900 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
29910 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 54 79  .        if( eTy
29920 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
29930 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  AGE ){.         
29940 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b   searchList = 1;
29950 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29960 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
29970 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
29980 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65 61 72  LE ){.      sear
29990 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20  chList = 1;.    
299a0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
299b0 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Decrement the f
299c0 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62  ree-list count b
299d0 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20  y 1. Set iTrunk 
299e0 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
299f0 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74  the.    ** first
29a00 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
29a10 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e   page. iPrevTrun
29a20 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31  k is initially 1
29a30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
29a40 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
29a50 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
29a60 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
29a70 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
29a80 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
29a90 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
29aa0 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  -1);..    /* The
29ab0 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69   code within thi
29ac0 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e  s loop is run on
29ad0 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27  ly once if the '
29ae0 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72 69  searchList' vari
29af0 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e  able.    ** is n
29b00 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69  ot true. Otherwi
29b10 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65  se, it runs once
29b20 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d   for each trunk-
29b30 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20  page on the.    
29b40 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74  ** free-list unt
29b50 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  il the page 'nea
29b60 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20  rby' is located 
29b70 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f  (eMode==BTALLOC_
29b80 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f 72  EXACT).    ** or
29b90 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20 6c 65   until a page le
29ba0 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62 79 27  ss than 'nearby'
29bb0 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f   is located (eMo
29bc0 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a  de==BTALLOC_LT).
29bd0 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a      */.    do {.
29be0 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b        pPrevTrunk
29bf0 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
29c00 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20   if( pPrevTrunk 
29c10 29 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  ){.        iTrun
29c20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
29c30 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
29c40 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  0]);.      }else
29c50 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  {.        iTrunk
29c60 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
29c70 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b  ge1->aData[32]);
29c80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
29c90 65 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d  estcase( iTrunk=
29ca0 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
29cb0 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61   if( iTrunk>mxPa
29cc0 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ge ){.        rc
29cd0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
29ce0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65  T_BKPT;.      }e
29cf0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
29d00 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
29d10 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72  Bt, iTrunk, &pTr
29d20 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  unk, 0);.      }
29d30 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
29d40 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
29d50 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 0;.        got
29d60 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
29d70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  age;.      }.   
29d80 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e     assert( pTrun
29d90 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  k!=0 );.      as
29da0 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44  sert( pTrunk->aD
29db0 61 74 61 21 3d 30 20 29 3b 0a 0a 20 20 20 20 20  ata!=0 );..     
29dc0 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   k = get4byte(&p
29dd0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
29de0 3b 20 2f 2a 20 23 20 6f 66 20 6c 65 61 76 65 73  ; /* # of leaves
29df0 20 6f 6e 20 74 68 69 73 20 74 72 75 6e 6b 20 70   on this trunk p
29e00 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  age */.      if(
29e10 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68   k==0 && !search
29e20 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
29e30 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73  /* The trunk has
29e40 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74   no leaves and t
29e50 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62  he list is not b
29e60 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a  eing searched. .
29e70 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78          ** So ex
29e80 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20  tract the trunk 
29e90 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20  page itself and 
29ea0 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65  use it as the ne
29eb0 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  wly .        ** 
29ec0 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
29ed0 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
29ee0 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20  ( pPrevTrunk==0 
29ef0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
29f00 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
29f10 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
29f20 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
29f30 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
29f40 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
29f50 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
29f60 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f  }.        *pPgno
29f70 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = iTrunk;.     
29f80 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
29f90 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
29fa0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
29fb0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70   4);.        *pp
29fc0 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
29fd0 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
29fe0 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
29ff0 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
2a000 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
2a010 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
2a020 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  pPgno, n-1));.  
2a030 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
2a040 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u32)(pBt->usabl
2a050 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a  eSize/4 - 2) ){.
2a060 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
2a070 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20   of k is out of 
2a080 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65  range.  Database
2a090 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   corruption */. 
2a0a0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2a0b0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2a0c0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
2a0d0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2a0e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2a0f0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2a100 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2a110 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20  searchList .    
2a120 20 20 20 20 20 20 20 20 26 26 20 28 6e 65 61 72          && (near
2a130 62 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69  by==iTrunk || (i
2a140 54 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20  Trunk<nearby && 
2a150 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
2a160 45 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  E)) .      ){.  
2a170 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73        /* The lis
2a180 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63  t is being searc
2a190 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75  hed and this tru
2a1a0 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70  nk page is the p
2a1b0 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  age.        ** t
2a1c0 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61  o allocate, rega
2a1d0 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
2a1e0 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e  r it has leaves.
2a1f0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2a200 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
2a210 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  unk;.        *pp
2a220 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
2a230 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
2a240 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
2a250 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2a260 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
2a270 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2a280 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2a290 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2a2a0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
2a2b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2a2c0 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( k==0 ){.      
2a2d0 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
2a2e0 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
2a2f0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
2a300 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
2a310 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2a320 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
2a330 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2a340 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2a350 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72  gerWrite(pPrevTr
2a360 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2a370 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
2a380 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2a390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
2a3a0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2a3b0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
2a3c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2a3d0 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75  memcpy(&pPrevTru
2a3e0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70  nk->aData[0], &p
2a3f0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2a400 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
2a410 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2a420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2a430 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72   trunk page is r
2a440 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63  equired by the c
2a450 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e  aller but it con
2a460 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20  tains .         
2a470 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   ** pointers to 
2a480 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73  free-list leaves
2a490 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66  . The first leaf
2a4a0 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b   becomes a trunk
2a4b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61  .          ** pa
2a4c0 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
2a4d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
2a4e0 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
2a4f0 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20  *pNewTrunk;.    
2a500 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54        Pgno iNewT
2a510 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
2a520 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  &pTrunk->aData[8
2a530 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ]);.          if
2a540 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61  ( iNewTrunk>mxPa
2a550 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  ge ){ .         
2a560 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2a570 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2a580 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2a590 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2a5a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2a5b0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2a5c0 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61   iNewTrunk==mxPa
2a5d0 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ge );.          
2a5e0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
2a5f0 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b  e(pBt, iNewTrunk
2a600 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29  , &pNewTrunk, 0)
2a610 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2a620 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2a630 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2a640 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2a650 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
2a660 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2a670 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2a680 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62  e(pNewTrunk->pDb
2a690 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2a6a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2a6b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2a6c0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
2a6d0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
2a6e0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2a6f0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2a700 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a710 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
2a720 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2a730 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
2a740 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
2a750 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77    put4byte(&pNew
2a760 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
2a770 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
2a780 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
2a790 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70  nk->aData[8], &p
2a7a0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d  Trunk->aData[12]
2a7b0 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20  , (k-1)*4);.    
2a7c0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2a7d0 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
2a7e0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
2a7f0 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
2a800 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
2a810 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2a820 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70  teable(pPage1->p
2a830 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
2a840 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
2a850 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2a860 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  2], iNewTrunk);.
2a870 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2a880 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2a890 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2a8a0 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
2a8b0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2a8c0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2a8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
2a8e0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2a8f0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
2a900 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2a910 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54  put4byte(&pPrevT
2a920 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2a930 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
2a940 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a950 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  }.        pTrunk
2a960 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
2a970 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
2a980 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
2a990 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
2a9a0 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
2a9b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
2a9c0 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20  lse if( k>0 ){. 
2a9d0 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63         /* Extrac
2a9e0 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68  t a leaf from th
2a9f0 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20  e trunk */.     
2aa00 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a     u32 closest;.
2aa10 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61          Pgno iPa
2aa20 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69  ge;.        unsi
2aa30 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61  gned char *aData
2aa40 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61   = pTrunk->aData
2aa50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  ;.        if( ne
2aa60 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20  arby>0 ){.      
2aa70 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20      u32 i;.     
2aa80 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
2aa90 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2aaa0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
2aab0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
2aac0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
2aad0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
2aae0 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
2aaf0 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
2ab00 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
2ab10 20 20 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61    if( iPage<=nea
2ab20 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rby ){.         
2ab30 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
2ab40 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
2ab50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2ab60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2ab70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ab80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ab90 20 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a        int dist;.
2aba0 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
2abb0 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
2abc0 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
2abd0 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29  ta[8]) - nearby)
2abe0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
2abf0 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=1; i<k; i++)
2ac00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2ac10 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
2ac20 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74  AbsInt32(get4byt
2ac30 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
2ac40 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20   - nearby);.    
2ac50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
2ac60 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  <dist ){.       
2ac70 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
2ac80 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
2ac90 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b        dist = d2;
2aca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2acb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2acc0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2acd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ace0 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
2acf0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
2ad00 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
2ad10 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c  byte(&aData[8+cl
2ad20 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20  osest*4]);.     
2ad30 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61     testcase( iPa
2ad40 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  ge==mxPage );.  
2ad50 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e        if( iPage>
2ad60 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
2ad70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2ad80 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2ad90 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2ada0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2adb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2adc0 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67    testcase( iPag
2add0 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  e==mxPage );.   
2ade0 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68       if( !search
2adf0 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c  List .         |
2ae00 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79  | (iPage==nearby
2ae10 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62   || (iPage<nearb
2ae20 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  y && eMode==BTAL
2ae30 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20  LOC_LE)) .      
2ae40 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
2ae50 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20  nt noContent;.  
2ae60 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
2ae70 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
2ae80 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
2ae90 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20  TE: %d was leaf 
2aea0 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e  %d of %d on trun
2aeb0 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20  k %d".          
2aec0 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72         ": %d mor
2aed0 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c  e free pages\n",
2aee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2aef0 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73    *pPgno, closes
2af00 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e  t+1, k, pTrunk->
2af10 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  pgno, n-1));.   
2af20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2af30 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
2af40 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
2af50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2af60 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f   ) goto end_allo
2af70 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2af80 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74       if( closest
2af90 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  <k-1 ){.        
2afa0 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74      memcpy(&aDat
2afb0 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20  a[8+closest*4], 
2afc0 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34  &aData[4+k*4], 4
2afd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2afe0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
2aff0 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  e(&aData[4], k-1
2b000 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43  );.          noC
2b010 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47  ontent = !btreeG
2b020 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
2b030 2c 20 2a 70 50 67 6e 6f 29 20 3f 20 50 41 47 45  , *pPgno) ? PAGE
2b040 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
2b050 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  : 0;.          r
2b060 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
2b070 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
2b080 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29  Page, noContent)
2b090 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2b0a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2b0b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2b0c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2b0d0 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
2b0e0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2b0f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2b100 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b110 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2b120 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
2b130 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2b140 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b150 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
2b160 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2b170 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73    }.      releas
2b180 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
2b190 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72  );.      pPrevTr
2b1a0 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68  unk = 0;.    }wh
2b1b0 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20  ile( searchList 
2b1c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2b1d0 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  /* There are no 
2b1e0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
2b1f0 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64  elist, so append
2b200 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74   a new page to t
2b210 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
2b220 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a  se image..    **
2b230 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  .    ** Normally
2b240 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f  , new pages allo
2b250 63 61 74 65 64 20 62 79 20 74 68 69 73 20 62 6c  cated by this bl
2b260 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65  ock can be reque
2b270 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20  sted from the.  
2b280 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72    ** pager layer
2b290 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f   with the 'no-co
2b2a0 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e  ntent' flag set.
2b2b0 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 74   This prevents t
2b2c0 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
2b2d0 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72  from trying to r
2b2e0 65 61 64 20 74 68 65 20 70 61 67 65 73 20 63 6f  ead the pages co
2b2f0 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e  ntent from disk.
2b300 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
2b310 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  .    ** current 
2b320 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
2b330 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20  already run one 
2b340 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e  or more incremen
2b350 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a  tal-vacuum.    *
2b360 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68  * steps, then th
2b370 65 20 70 61 67 65 20 77 65 20 61 72 65 20 61 62  e page we are ab
2b380 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  out to allocate 
2b390 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74  may contain cont
2b3a0 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ent.    ** that 
2b3b0 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 74  is required in t
2b3c0 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f  he event of a ro
2b3d0 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20  llback. In this 
2b3e0 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20  case, do.    ** 
2b3f0 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63  not set the no-c
2b400 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69  ontent flag. Thi
2b410 73 20 63 61 75 73 65 73 20 74 68 65 20 70 61 67  s causes the pag
2b420 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a  er to load and j
2b430 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68  ournal.    ** th
2b440 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63  e current page c
2b450 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76  ontent before ov
2b460 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  erwriting it..  
2b470 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
2b480 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
2b490 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c  will not actuall
2b4a0 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61  y attempt to loa
2b4b0 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20  d or journal .  
2b4c0 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72    ** content for
2b4d0 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 72   any page that r
2b4e0 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70  eally does lie p
2b4f0 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
2b500 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
2b510 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  ** file on disk.
2b520 20 53 6f 20 74 68 65 20 65 66 66 65 63 74 73 20   So the effects 
2b530 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65  of disabling the
2b540 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69   no-content opti
2b550 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  mization.    ** 
2b560 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65  here are confine
2b570 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73  d to those pages
2b580 20 74 68 61 74 20 6c 69 65 20 62 65 74 77 65 65   that lie betwee
2b590 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  n the end of the
2b5a0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
2b5b0 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65   image and the e
2b5c0 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nd of the databa
2b5d0 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
2b5e0 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65      int bNoConte
2b5f0 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d  nt = (0==IfNotOm
2b600 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75  itAV(pBt->bDoTru
2b610 6e 63 61 74 65 29 29 20 3f 20 50 41 47 45 52 5f  ncate)) ? PAGER_
2b620 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20  GET_NOCONTENT : 
2b630 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  0;..    rc = sql
2b640 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2b650 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
2b660 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
2b670 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2b680 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a    pBt->nPage++;.
2b690 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61      if( pBt->nPa
2b6a0 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge==PENDING_BYTE
2b6b0 5f 50 41 47 45 28 70 42 74 29 20 29 20 70 42 74  _PAGE(pBt) ) pBt
2b6c0 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e  ->nPage++;..#ifn
2b6d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2b6e0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
2b6f0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2b700 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50  um && PTRMAP_ISP
2b710 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50  AGE(pBt, pBt->nP
2b720 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  age) ){.      /*
2b730 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72   If *pPgno refer
2b740 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d  s to a pointer-m
2b750 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74  ap page, allocat
2b760 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a  e two new pages.
2b770 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20        ** at the 
2b780 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
2b790 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20  instead of one. 
2b7a0 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61  The first alloca
2b7b0 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ted page.      *
2b7c0 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20  * becomes a new 
2b7d0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
2b7e0 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20  , the second is 
2b7f0 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  used by the call
2b800 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  er..      */.   
2b810 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20     MemPage *pPg 
2b820 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45  = 0;.      TRACE
2b830 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
2b840 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
2b850 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61   (pointer-map pa
2b860 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61  ge)\n", pBt->nPa
2b870 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ge));.      asse
2b880 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  rt( pBt->nPage!=
2b890 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2b8a0 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20  E(pBt) );.      
2b8b0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
2b8c0 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67  e(pBt, pBt->nPag
2b8d0 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74  e, &pPg, bNoCont
2b8e0 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ent);.      if( 
2b8f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2b900 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2b910 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2b920 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  pPg->pDbPage);. 
2b930 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2b940 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  ge(pPg);.      }
2b950 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2b960 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2b970 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20   pBt->nPage++;. 
2b980 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50       if( pBt->nP
2b990 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age==PENDING_BYT
2b9a0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20 70  E_PAGE(pBt) ){ p
2b9b0 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20  Bt->nPage++; }. 
2b9c0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2b9d0 70 75 74 34 62 79 74 65 28 32 38 20 2b 20 28 75  put4byte(28 + (u
2b9e0 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  8*)pBt->pPage1->
2b9f0 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67  aData, pBt->nPag
2ba00 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d  e);.    *pPgno =
2ba10 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20   pBt->nPage;..  
2ba20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
2ba30 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
2ba40 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
2ba50 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
2ba60 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70  e(pBt, *pPgno, p
2ba70 70 50 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e  pPage, bNoConten
2ba80 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  t);.    if( rc )
2ba90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2baa0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2bab0 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
2bac0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2bad0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2bae0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
2baf0 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
2bb00 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45  .    }.    TRACE
2bb10 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
2bb20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
2bb30 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20  \n", *pPgno));. 
2bb40 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70   }..  assert( *p
2bb50 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
2bb60 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
2bb70 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61  .end_allocate_pa
2bb80 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ge:.  releasePag
2bb90 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c  e(pTrunk);.  rel
2bba0 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
2bbb0 75 6e 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  unk);.  if( rc==
2bbc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2bbd0 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
2bbe0 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a  rPageRefcount((*
2bbf0 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
2bc00 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  )>1 ){.      rel
2bc10 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
2bc20 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65  );.      *ppPage
2bc30 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
2bc40 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2bc50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
2bc60 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49    (*ppPage)->isI
2bc70 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  nit = 0;.  }else
2bc80 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
2bc90 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
2bca0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
2bcb0 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
2bcc0 77 72 69 74 65 61 62 6c 65 28 28 2a 70 70 50 61  writeable((*ppPa
2bcd0 67 65 29 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ge)->pDbPage) );
2bce0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2bcf0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2bd00 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
2bd10 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74  add page iPage t
2bd20 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2bd30 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a  ile free-list. .
2bd40 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
2bd50 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
2bd60 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20  s not already a 
2bd70 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65  part of the free
2bd80 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  -list..**.** The
2bd90 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
2bda0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
2bdb0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
2bdc0 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61  ction is optiona
2bdd0 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  l..** If the cal
2bde0 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68  ler happens to h
2bdf0 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ave a pointer to
2be00 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
2be10 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  ect .** correspo
2be20 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50  nding to page iP
2be30 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61  age handy, it ma
2be40 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65  y pass it as the
2be50 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a   second value. .
2be60 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  ** Otherwise, it
2be70 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a   may pass NULL..
2be80 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74  **.** If a point
2be90 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20  er to a MemPage 
2bea0 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64  object is passed
2beb0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
2bec0 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20  rgument,.** its 
2bed0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
2bee0 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62  is not altered b
2bef0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
2bf00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
2bf10 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65  reePage2(BtShare
2bf20 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20  d *pBt, MemPage 
2bf30 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20  *pMemPage, Pgno 
2bf40 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  iPage){.  MemPag
2bf50 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20  e *pTrunk = 0;  
2bf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bf70 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   Free-list trunk
2bf80 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
2bf90 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  iTrunk = 0;     
2bfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bfb0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
2bfc0 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
2bfd0 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50   page */ .  MemP
2bfe0 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
2bff0 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20  t->pPage1;      
2c000 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e  /* Local referen
2c010 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
2c020 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2c030 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c040 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65        /* Page be
2c050 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62  ing freed. May b
2c060 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74  e NULL. */.  int
2c070 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
2c080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c090 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
2c0a0 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
2c0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c0c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
2c0d0 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ial number of pa
2c0e0 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74  ges on free-list
2c0f0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
2c100 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2c110 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
2c120 0a 20 20 61 73 73 65 72 74 28 20 69 50 61 67 65  .  assert( iPage
2c130 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >1 );.  assert( 
2c140 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65  !pMemPage || pMe
2c150 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61  mPage->pgno==iPa
2c160 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65  ge );..  if( pMe
2c170 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  mPage ){.    pPa
2c180 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20  ge = pMemPage;. 
2c190 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
2c1a0 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ef(pPage->pDbPag
2c1b0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
2c1c0 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61   pPage = btreePa
2c1d0 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50  geLookup(pBt, iP
2c1e0 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  age);.  }..  /* 
2c1f0 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Increment the fr
2c200 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e  ee page count on
2c210 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20   pPage1 */.  rc 
2c220 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2c230 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
2c240 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
2c250 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
2c260 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65  ut;.  nFree = ge
2c270 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
2c280 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75  aData[36]);.  pu
2c290 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
2c2a0 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65  aData[36], nFree
2c2b0 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d  +1);..  if( pBt-
2c2c0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
2c2d0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b  SECURE_DELETE ){
2c2e0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
2c2f0 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74  ecure_delete opt
2c300 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ion is enabled, 
2c310 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61  then.    ** alwa
2c320 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69  ys fully overwri
2c330 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
2c340 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
2c350 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
2c360 28 20 28 21 70 50 61 67 65 20 26 26 20 28 28 72  ( (!pPage && ((r
2c370 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
2c380 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50  (pBt, iPage, &pP
2c390 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20  age, 0))!=0) ). 
2c3a0 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20      ||          
2c3b0 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33    ((rc = sqlite3
2c3c0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
2c3d0 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a  ->pDbPage))!=0).
2c3e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
2c3f0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2c400 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
2c410 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30  (pPage->aData, 0
2c420 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  , pPage->pBt->pa
2c430 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
2c440 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
2c450 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
2c460 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61  -vacuum, write a
2c470 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70  n entry in the p
2c480 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20  ointer-map.  ** 
2c490 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
2c4a0 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65   the page is fre
2c4b0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53  e..  */.  if( IS
2c4c0 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
2c4d0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
2c4e0 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46   iPage, PTRMAP_F
2c4f0 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29  REEPAGE, 0, &rc)
2c500 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
2c510 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2c520 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
2c530 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61  manipulate the a
2c540 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66  ctual database f
2c550 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75  ree-list structu
2c560 72 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  re. There are tw
2c570 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69  o.  ** possibili
2c580 74 69 65 73 2e 20 49 66 20 74 68 65 20 66 72 65  ties. If the fre
2c590 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e  e-list is curren
2c5a0 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66  tly empty, or if
2c5b0 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
2c5c0 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
2c5d0 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66  e free-list is f
2c5e0 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70  ull, then this p
2c5f0 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  age will become 
2c600 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d  a.  ** new free-
2c610 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
2c620 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77   Otherwise, it w
2c630 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61  ill become a lea
2c640 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69  f of the.  ** fi
2c650 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  rst trunk page i
2c660 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72  n the current fr
2c670 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c  ee-list. This bl
2c680 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a  ock tests if it.
2c690 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65    ** is possible
2c6a0 20 74 6f 20 61 64 64 20 74 68 65 20 70 61 67 65   to add the page
2c6b0 20 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c   as a new free-l
2c6c0 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20  ist leaf..  */. 
2c6d0 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b   if( nFree!=0 ){
2c6e0 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20  .    u32 nLeaf; 
2c6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c700 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72  * Initial number
2c710 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f   of leaf cells o
2c720 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  n trunk page */.
2c730 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65  .    iTrunk = ge
2c740 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
2c750 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
2c760 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
2c770 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
2c780 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
2c790 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2c7a0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
2c7b0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2c7c0 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d    }..    nLeaf =
2c7d0 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
2c7e0 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
2c7f0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
2c800 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a  sableSize>32 );.
2c810 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20      if( nLeaf > 
2c820 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65  (u32)pBt->usable
2c830 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20  Size/4 - 2 ){.  
2c840 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2c850 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2c860 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
2c870 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
2c880 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33   if( nLeaf < (u3
2c890 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  2)pBt->usableSiz
2c8a0 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20  e/4 - 8 ){.     
2c8b0 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
2c8c0 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f   there is room o
2c8d0 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  n the trunk page
2c8e0 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70   to insert the p
2c8f0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  age.      ** bei
2c900 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6e 65  ng freed as a ne
2c910 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a  w leaf..      **
2c920 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  .      ** Note t
2c930 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  hat the trunk pa
2c940 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  ge is not really
2c950 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63   full until it c
2c960 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a  ontains.      **
2c970 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
2c980 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75  2 entries, not u
2c990 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
2c9a0 65 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61  entries as we ha
2c9b0 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65  ve.      ** code
2c9c0 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61  d.  But due to a
2c9d0 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e   coding error in
2c9e0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
2c9f0 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20  ite prior to.   
2ca00 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74     ** 3.6.0, dat
2ca10 61 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65  abases with free
2ca20 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73  list trunk pages
2ca30 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68   holding more th
2ca40 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62  an.      ** usab
2ca50 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74  leSize/4 - 8 ent
2ca60 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70  ries will be rep
2ca70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74  orted as corrupt
2ca80 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20  .  In order.    
2ca90 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e    ** to maintain
2caa0 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
2cab0 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c  tibility with ol
2cac0 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
2cad0 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a  SQLite,.      **
2cae0 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   we will continu
2caf0 65 20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68  e to restrict th
2cb00 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
2cb10 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a  ies to usableSiz
2cb20 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a  e/4 - 8.      **
2cb30 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f   for now.  At so
2cb40 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
2cb50 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65  future (once eve
2cb60 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64  ryone has upgrad
2cb70 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33  ed.      ** to 3
2cb80 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77  .6.0 or later) w
2cb90 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65  e should conside
2cba0 72 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e  r fixing the con
2cbb0 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20  ditional above. 
2cbc0 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20       ** to read 
2cbd0 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22  "usableSize/4-2"
2cbe0 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61   instead of "usa
2cbf0 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20  bleSize/4-8"..  
2cc00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
2cc10 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2cc20 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
2cc30 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
2cc40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2cc50 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
2cc60 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
2cc70 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20  [4], nLeaf+1);. 
2cc80 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
2cc90 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  &pTrunk->aData[8
2cca0 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65  +nLeaf*4], iPage
2ccb0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2ccc0 50 61 67 65 20 26 26 20 28 70 42 74 2d 3e 62 74  Page && (pBt->bt
2ccd0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
2cce0 55 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29  URE_DELETE)==0 )
2ccf0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2cd00 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
2cd10 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2cd20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2cd30 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 53       rc = btreeS
2cd40 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
2cd50 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
2cd60 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  }.      TRACE(("
2cd70 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65  FREE-PAGE: %d le
2cd80 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  af on trunk page
2cd90 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67   %d\n",pPage->pg
2cda0 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29  no,pTrunk->pgno)
2cdb0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  );.      goto fr
2cdc0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
2cdd0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63  }.  }..  /* If c
2cde0 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20  ontrol flows to 
2cdf0 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
2ce00 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73   it was not poss
2ce10 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a  ible to add the.
2ce20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65    ** the page be
2ce30 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6c  ing freed as a l
2ce40 65 61 66 20 70 61 67 65 20 6f 66 20 74 68 65 20  eaf page of the 
2ce50 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74  first trunk in t
2ce60 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20  he free-list..  
2ce70 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61  ** Possibly beca
2ce80 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73  use the free-lis
2ce90 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70  t is empty, or p
2cea0 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20  ossibly because 
2ceb0 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20  the .  ** first 
2cec0 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65  trunk in the fre
2ced0 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20  e-list is full. 
2cee0 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20  Either way, the 
2cef0 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
2cf00 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d  .  ** will becom
2cf10 65 20 74 68 65 20 6e 65 77 20 66 69 72 73 74 20  e the new first 
2cf20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
2cf30 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a  e free-list..  *
2cf40 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30  /.  if( pPage==0
2cf50 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   && SQLITE_OK!=(
2cf60 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
2cf70 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70  e(pBt, iPage, &p
2cf80 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20  Page, 0)) ){.   
2cf90 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
2cfa0 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  ut;.  }.  rc = s
2cfb0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2cfc0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2cfd0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2cfe0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
2cff0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2d000 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70    }.  put4byte(p
2d010 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72  Page->aData, iTr
2d020 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65  unk);.  put4byte
2d030 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34  (&pPage->aData[4
2d040 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74  ], 0);.  put4byt
2d050 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
2d060 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20  [32], iPage);.  
2d070 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
2d080 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20  E: %d new trunk 
2d090 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25  page replacing %
2d0a0 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d\n", pPage->pgn
2d0b0 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72  o, iTrunk));..fr
2d0c0 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66  eepage_out:.  if
2d0d0 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70  ( pPage ){.    p
2d0e0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
2d0f0 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  ;.  }.  releaseP
2d100 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65  age(pPage);.  re
2d110 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
2d120 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2d130 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  }.static void fr
2d140 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  eePage(MemPage *
2d150 70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29  pPage, int *pRC)
2d160 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d  {.  if( (*pRC)==
2d170 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d180 20 2a 70 52 43 20 3d 20 66 72 65 65 50 61 67 65   *pRC = freePage
2d190 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50  2(pPage->pBt, pP
2d1a0 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  age, pPage->pgno
2d1b0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2d1c0 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f  Free any overflo
2d1d0 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74  w pages associat
2d1e0 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ed with the give
2d1f0 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  n Cell..*/.stati
2d200 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28  c int clearCell(
2d210 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
2d220 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2d230 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65  Cell){.  BtShare
2d240 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
2d250 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  pBt;.  CellInfo 
2d260 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66  info;.  Pgno ovf
2d270 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b  lPgno;.  int rc;
2d280 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20  .  int nOvfl;.  
2d290 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  u32 ovflPageSize
2d2a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
2d2b0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2d2c0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
2d2d0 78 29 20 29 3b 0a 20 20 62 74 72 65 65 50 61 72  x) );.  btreePar
2d2e0 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
2d2f0 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
2d300 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
2d310 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72  flow==0 ){.    r
2d320 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2d330 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77    /* No overflow
2d340 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77   pages. Return w
2d350 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
2d360 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69  thing */.  }.  i
2d370 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f  f( pCell+info.iO
2d380 76 65 72 66 6c 6f 77 2b 33 20 3e 20 70 50 61 67  verflow+3 > pPag
2d390 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e  e->aData+pPage->
2d3a0 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20 20 20 20  maskPage ){.    
2d3b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2d3c0 52 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f 2a 20  RRUPT_BKPT;  /* 
2d3d0 43 65 6c 6c 20 65 78 74 65 6e 64 73 20 70 61 73  Cell extends pas
2d3e0 74 20 65 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f  t end of page */
2d3f0 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20  .  }.  ovflPgno 
2d400 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
2d410 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
2d420 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  ]);.  assert( pB
2d430 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20  t->usableSize > 
2d440 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53  4 );.  ovflPageS
2d450 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
2d460 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76  eSize - 4;.  nOv
2d470 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c  fl = (info.nPayl
2d480 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  oad - info.nLoca
2d490 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  l + ovflPageSize
2d4a0 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69   - 1)/ovflPageSi
2d4b0 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 76  ze;.  assert( ov
2d4c0 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76  flPgno==0 || nOv
2d4d0 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28  fl>0 );.  while(
2d4e0 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20   nOvfl-- ){.    
2d4f0 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a  Pgno iNext = 0;.
2d500 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76      MemPage *pOv
2d510 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  fl = 0;.    if( 
2d520 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76  ovflPgno<2 || ov
2d530 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65  flPgno>btreePage
2d540 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
2d550 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20      /* 0 is not 
2d560 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  a legal page num
2d570 62 65 72 20 61 6e 64 20 70 61 67 65 20 31 20 63  ber and page 1 c
2d580 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20  annot be an .   
2d590 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
2d5a0 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69  age. Therefore i
2d5b0 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20  f ovflPgno<2 or 
2d5c0 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
2d5d0 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69  the .      ** fi
2d5e0 6c 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  le the database 
2d5f0 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e  must be corrupt.
2d600 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
2d610 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2d620 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
2d630 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20  if( nOvfl ){.   
2d640 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
2d650 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66  lowPage(pBt, ovf
2d660 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26  lPgno, &pOvfl, &
2d670 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66  iNext);.      if
2d680 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2d690 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
2d6a0 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f   ( pOvfl || ((pO
2d6b0 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c  vfl = btreePageL
2d6c0 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50  ookup(pBt, ovflP
2d6d0 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20  gno))!=0) ).    
2d6e0 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
2d6f0 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76  PageRefcount(pOv
2d700 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a  fl->pDbPage)!=1.
2d710 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
2d720 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73  There is no reas
2d730 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68  on any cursor sh
2d740 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74  ould have an out
2d750 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
2d760 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ce .      ** to 
2d770 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
2d780 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20   belonging to a 
2d790 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69  cell that is bei
2d7a0 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74  ng deleted/updat
2d7b0 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20  ed..      ** So 
2d7c0 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  if there exists 
2d7d0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65  more than one re
2d7e0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20  ference to this 
2d7f0 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20  page, then it . 
2d800 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74       ** must not
2d810 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76   really be an ov
2d820 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20  erflow page and 
2d830 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
2d840 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20  t be corrupt. . 
2d850 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65       ** It is he
2d860 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20  lpful to detect 
2d870 74 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c  this before call
2d880 69 6e 67 20 66 72 65 65 50 61 67 65 32 28 29 2c  ing freePage2(),
2d890 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72   as .      ** fr
2d8a0 65 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65  eePage2() may ze
2d8b0 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  ro the page cont
2d8c0 65 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d 64  ents if secure-d
2d8d0 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20  elete mode is.  
2d8e0 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20      ** enabled. 
2d8f0 49 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f  If this 'overflo
2d900 77 27 20 70 61 67 65 20 68 61 70 70 65 6e 73 20  w' page happens 
2d910 74 6f 20 62 65 20 61 20 70 61 67 65 20 74 68 61  to be a page tha
2d920 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  t the.      ** c
2d930 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74 69  aller is iterati
2d940 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73  ng through or us
2d950 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65  ing in some othe
2d960 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20  r way, this.    
2d970 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62    ** can be prob
2d980 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a  lematic..      *
2d990 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
2d9a0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2d9b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2d9c0 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
2d9d0 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76  2(pBt, pOvfl, ov
2d9e0 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a  flPgno);.    }..
2d9f0 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b      if( pOvfl ){
2da00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
2da10 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e  gerUnref(pOvfl->
2da20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  pDbPage);.    }.
2da30 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2da40 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c  urn rc;.    ovfl
2da50 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20  Pgno = iNext;.  
2da60 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
2da70 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
2da80 72 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73  reate the byte s
2da90 65 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20  equence used to 
2daa0 72 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c  represent a cell
2dab0 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a   on page pPage.*
2dac0 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74  * and write that
2dad0 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69   byte sequence i
2dae0 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76  nto pCell[].  Ov
2daf0 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
2db00 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  .** allocated an
2db10 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e  d filled in as n
2db20 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63  ecessary.  The c
2db30 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65  alling procedure
2db40 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62  .** is responsib
2db50 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75  le for making su
2db60 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  re sufficient sp
2db70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  ace has been all
2db80 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43  ocated.** for pC
2db90 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  ell[]..**.** Not
2dba0 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65  e that pCell doe
2dbb0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
2dbc0 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f  need to point to
2dbd0 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74   the pPage->aDat
2dbe0 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c  a.** area.  pCel
2dbf0 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  l might point to
2dc00 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20   some temporary 
2dc10 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65  storage.  The ce
2dc20 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f  ll will.** be co
2dc30 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69  nstructed in thi
2dc40 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61  s temporary area
2dc50 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74   then copied int
2dc60 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a  o pPage->aData.*
2dc70 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  * later..*/.stat
2dc80 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c  ic int fillInCel
2dc90 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
2dca0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
2dcb0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
2dcc0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
2dcd0 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69  e cell */.  unsi
2dce0 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
2dcf0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ,          /* Co
2dd00 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
2dd10 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e  he cell */.  con
2dd20 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69  st void *pKey, i
2dd30 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54  64 nKey,    /* T
2dd40 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73  he key */.  cons
2dd50 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e  t void *pData,in
2dd60 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68  t nData,   /* Th
2dd70 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
2dd80 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20  nZero,          
2dd90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
2dda0 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74  tra zero bytes t
2ddb0 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74  o append to pDat
2ddc0 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69  a */.  int *pnSi
2ddd0 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
2dde0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63        /* Write c
2ddf0 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f  ell size here */
2de00 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f  .){.  int nPaylo
2de10 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  ad;.  const u8 *
2de20 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63  pSrc;.  int nSrc
2de30 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73  , n, rc;.  int s
2de40 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50  paceLeft;.  MemP
2de50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a  age *pOvfl = 0;.
2de60 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65    MemPage *pToRe
2de70 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73  lease = 0;.  uns
2de80 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69  igned char *pPri
2de90 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  or;.  unsigned c
2dea0 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20  har *pPayload;. 
2deb0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2dec0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50   pPage->pBt;.  P
2ded0 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30  gno pgnoOvfl = 0
2dee0 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b  ;.  int nHeader;
2def0 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
2df00 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
2df10 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2df20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
2df30 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67  x) );..  /* pPag
2df40 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  e is not necessa
2df50 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73  rily writeable s
2df60 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74  ince pCell might
2df70 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20   be auxiliary.  
2df80 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63 65 20  ** buffer space 
2df90 74 68 61 74 20 69 73 20 73 65 70 61 72 61 74 65  that is separate
2dfa0 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20   from the pPage 
2dfb0 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20  buffer area */. 
2dfc0 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70   assert( pCell<p
2dfd0 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70  Page->aData || p
2dfe0 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44  Cell>=&pPage->aD
2dff0 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
2e000 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
2e010 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
2e020 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
2e030 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
2e040 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68  /* Fill in the h
2e050 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61  eader. */.  nHea
2e060 64 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 21  der = 0;.  if( !
2e070 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2e080 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b     nHeader += 4;
2e090 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
2e0a0 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20  ->hasData ){.   
2e0b0 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
2e0c0 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e  arint32(&pCell[n
2e0d0 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e  Header], nData+n
2e0e0 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Zero);.  }else{.
2e0f0 20 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72      nData = nZer
2e100 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65  o = 0;.  }.  nHe
2e110 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
2e120 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  t(&pCell[nHeader
2e130 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29  ], *(u64*)&nKey)
2e140 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
2e150 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
2e160 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73  ll, &info);.  as
2e170 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64  sert( info.nHead
2e180 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20  er==nHeader );. 
2e190 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b   assert( info.nK
2e1a0 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73  ey==nKey );.  as
2e1b0 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61  sert( info.nData
2e1c0 3d 3d 28 75 33 32 29 28 6e 44 61 74 61 2b 6e 5a  ==(u32)(nData+nZ
2e1d0 65 72 6f 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  ero) );.  .  /* 
2e1e0 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c  Fill in the payl
2e1f0 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61  oad */.  nPayloa
2e200 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72  d = nData + nZer
2e210 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  o;.  if( pPage->
2e220 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53  intKey ){.    pS
2e230 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  rc = pData;.    
2e240 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20  nSrc = nData;.  
2e250 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d    nData = 0;.  }
2e260 65 6c 73 65 7b 20 0a 20 20 20 20 69 66 28 20 4e  else{ .    if( N
2e270 45 56 45 52 28 6e 4b 65 79 3e 30 78 37 66 66 66  EVER(nKey>0x7fff
2e280 66 66 66 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 29  ffff || pKey==0)
2e290 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2e2a0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2e2b0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
2e2c0 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69 6e 74  nPayload += (int
2e2d0 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20  )nKey;.    pSrc 
2e2e0 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63  = pKey;.    nSrc
2e2f0 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20   = (int)nKey;.  
2e300 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e  }.  *pnSize = in
2e310 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63  fo.nSize;.  spac
2e320 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f  eLeft = info.nLo
2e330 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20  cal;.  pPayload 
2e340 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  = &pCell[nHeader
2e350 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70  ];.  pPrior = &p
2e360 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
2e370 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20  low];..  while( 
2e380 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20  nPayload>0 ){.  
2e390 20 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d    if( spaceLeft=
2e3a0 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
2e3b0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2e3c0 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20  CUUM.      Pgno 
2e3d0 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e  pgnoPtrmap = pgn
2e3e0 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c  oOvfl; /* Overfl
2e3f0 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d  ow page pointer-
2e400 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a  map entry page *
2e410 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
2e420 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
2e430 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20         do{.     
2e440 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b       pgnoOvfl++;
2e450 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65  .        } while
2e460 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52  ( .          PTR
2e470 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
2e480 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e  pgnoOvfl) || pgn
2e490 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42  oOvfl==PENDING_B
2e4a0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20  YTE_PAGE(pBt) . 
2e4b0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
2e4c0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  }.#endif.      r
2e4d0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
2e4e0 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66  ePage(pBt, &pOvf
2e4f0 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67  l, &pgnoOvfl, pg
2e500 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e  noOvfl, 0);.#ifn
2e510 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2e520 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
2e530 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
2e540 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
2e550 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68  o-vacuum, and th
2e560 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73  e second or subs
2e570 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  equent.      ** 
2e580 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
2e590 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64   being allocated
2e5a0 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74  , add an entry t
2e5b0 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
2e5c0 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  p.      ** for t
2e5d0 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20  hat page now. . 
2e5e0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2e5f0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
2e600 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
2e610 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20  age, then write 
2e620 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20  a partial entry 
2e630 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  .      ** to the
2e640 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66   pointer-map. If
2e650 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e   we write nothin
2e660 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65  g to this pointe
2e670 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20  r-map slot,.    
2e680 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70    ** then the op
2e690 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f  timistic overflo
2e6a0 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69  w chain processi
2e6b0 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28  ng in clearCell(
2e6c0 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d  ).      ** may m
2e6d0 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20  isinterpret the 
2e6e0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 76 61  uninitialized va
2e6f0 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20  lues and delete 
2e700 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f  the.      ** wro
2e710 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ng pages from th
2e720 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
2e730 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
2e740 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
2e750 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
2e760 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54  ){.        u8 eT
2e770 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61  ype = (pgnoPtrma
2e780 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  p?PTRMAP_OVERFLO
2e790 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  W2:PTRMAP_OVERFL
2e7a0 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74  OW1);.        pt
2e7b0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
2e7c0 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67  oOvfl, eType, pg
2e7d0 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a  noPtrmap, &rc);.
2e7e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2e7f0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
2e800 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a  asePage(pOvfl);.
2e810 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e820 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
2e830 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2e840 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
2e850 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
2e860 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2e870 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
2e880 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  f pToRelease is 
2e890 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50  not zero than pP
2e8a0 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f  rior points into
2e8b0 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
2e8c0 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65       ** of pToRe
2e8d0 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72  lease.  Make sur
2e8e0 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  e pToRelease is 
2e8f0 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e  still writeable.
2e900 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
2e910 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20  ( pToRelease==0 
2e920 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
2e930 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65  swriteable(pToRe
2e940 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20  lease->pDbPage) 
2e950 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
2e960 70 50 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f  pPrior is part o
2e970 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20  f the data area 
2e980 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d  of pPage, then m
2e990 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20  ake sure pPage. 
2e9a0 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c       ** is still
2e9b0 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20   writeable */.  
2e9c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69      assert( pPri
2e9d0 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  or<pPage->aData 
2e9e0 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67  || pPrior>=&pPag
2e9f0 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
2ea00 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
2ea10 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
2ea20 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2ea30 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
2ea40 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ;..      put4byt
2ea50 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76  e(pPrior, pgnoOv
2ea60 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  fl);.      relea
2ea70 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
2ea80 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c  e);.      pToRel
2ea90 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20  ease = pOvfl;.  
2eaa0 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76      pPrior = pOv
2eab0 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  fl->aData;.     
2eac0 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
2ead0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79  , 0);.      pPay
2eae0 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61  load = &pOvfl->a
2eaf0 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73  Data[4];.      s
2eb00 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e  paceLeft = pBt->
2eb10 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
2eb20 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50      }.    n = nP
2eb30 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20  ayload;.    if( 
2eb40 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20  n>spaceLeft ) n 
2eb50 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20  = spaceLeft;..  
2eb60 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61    /* If pToRelea
2eb70 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74  se is not zero t
2eb80 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69  han pPayload poi
2eb90 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
2eba0 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66  a area.    ** of
2ebb0 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61   pToRelease.  Ma
2ebc0 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61  ke sure pToRelea
2ebd0 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  se is still writ
2ebe0 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73  eable. */.    as
2ebf0 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65  sert( pToRelease
2ec00 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  ==0 || sqlite3Pa
2ec10 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2ec20 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61  ToRelease->pDbPa
2ec30 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ge) );..    /* I
2ec40 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61  f pPayload is pa
2ec50 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
2ec60 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68  rea of pPage, th
2ec70 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61  en make sure pPa
2ec80 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69  ge.    ** is sti
2ec90 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a  ll writeable */.
2eca0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 79      assert( pPay
2ecb0 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74  load<pPage->aDat
2ecc0 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26  a || pPayload>=&
2ecd0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
2ece0 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
2ecf0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
2ed00 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2ed10 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2ed20 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e  e) );..    if( n
2ed30 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  Src>0 ){.      i
2ed40 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20  f( n>nSrc ) n = 
2ed50 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65  nSrc;.      asse
2ed60 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20  rt( pSrc );.    
2ed70 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
2ed80 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20  d, pSrc, n);.   
2ed90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
2eda0 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30  mset(pPayload, 0
2edb0 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , n);.    }.    
2edc0 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20  nPayload -= n;. 
2edd0 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     pPayload += n
2ede0 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b  ;.    pSrc += n;
2edf0 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a  .    nSrc -= n;.
2ee00 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d      spaceLeft -=
2ee10 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63   n;.    if( nSrc
2ee20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72  ==0 ){.      nSr
2ee30 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20  c = nData;.     
2ee40 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20   pSrc = pData;. 
2ee50 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61     }.  }.  relea
2ee60 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
2ee70 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
2ee80 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2ee90 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68   Remove the i-th
2eea0 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
2eeb0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2eec0 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e  effects pPage on
2eed0 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20  ly..** The cell 
2eee0 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66  content is not f
2eef0 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61  reed or dealloca
2ef00 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75  ted.  It is assu
2ef10 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
2ef20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73  cell content has
2ef30 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d   been copied som
2ef40 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68  eplace else.  Th
2ef50 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a  is routine just.
2ef60 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72  ** removes the r
2ef70 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
2ef80 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
2ef90 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74  .**.** "sz" must
2efa0 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
2efb0 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63  f bytes in the c
2efc0 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ell..*/.static v
2efd0 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d  oid dropCell(Mem
2efe0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
2eff0 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e   idx, int sz, in
2f000 74 20 2a 70 52 43 29 7b 0a 20 20 75 33 32 20 70  t *pRC){.  u32 p
2f010 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  c;         /* Of
2f020 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e  fset to cell con
2f030 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69  tent of cell bei
2f040 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  ng deleted */.  
2f050 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
2f060 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  /* pPage->aData 
2f070 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20  */.  u8 *ptr;   
2f080 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
2f090 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e  move bytes aroun
2f0a0 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20  d within data[] 
2f0b0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
2f0c0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
2f0d0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
2f0e0 20 68 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20   hdr;        /* 
2f0f0 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  Beginning of the
2f100 20 68 65 61 64 65 72 2e 20 20 30 20 6d 6f 73 74   header.  0 most
2f110 20 70 61 67 65 73 2e 20 20 31 30 30 20 70 61 67   pages.  100 pag
2f120 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70  e 1 */..  if( *p
2f130 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  RC ) return;..  
2f140 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26  assert( idx>=0 &
2f150 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  & idx<pPage->nCe
2f160 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
2f170 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61  sz==cellSize(pPa
2f180 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73  ge, idx) );.  as
2f190 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2f1a0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2f1b0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
2f1c0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2f1d0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
2f1e0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
2f1f0 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61   );.  data = pPa
2f200 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72  ge->aData;.  ptr
2f210 20 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c   = &pPage->aCell
2f220 49 64 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63  Idx[2*idx];.  pc
2f230 20 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29   = get2byte(ptr)
2f240 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
2f250 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65  >hdrOffset;.  te
2f260 73 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32  stcase( pc==get2
2f270 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
2f280 5d 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  ]) );.  testcase
2f290 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e  ( pc+sz==pPage->
2f2a0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2f2b0 29 3b 0a 20 20 69 66 28 20 70 63 20 3c 20 28 75  );.  if( pc < (u
2f2c0 33 32 29 67 65 74 32 62 79 74 65 28 26 64 61 74  32)get2byte(&dat
2f2d0 61 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b  a[hdr+5]) || pc+
2f2e0 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d  sz > pPage->pBt-
2f2f0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
2f300 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45     *pRC = SQLITE
2f310 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2f320 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
2f330 20 72 63 20 3d 20 66 72 65 65 53 70 61 63 65 28   rc = freeSpace(
2f340 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a  pPage, pc, sz);.
2f350 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2f360 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
2f370 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 50 61  eturn;.  }.  pPa
2f380 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 6d  ge->nCell--;.  m
2f390 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74 72 2b  emmove(ptr, ptr+
2f3a0 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65  2, 2*(pPage->nCe
2f3b0 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20 70 75  ll - idx));.  pu
2f3c0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2f3d0 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  +3], pPage->nCel
2f3e0 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  l);.  pPage->nFr
2f3f0 65 65 20 2b 3d 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  ee += 2;.}../*.*
2f400 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63  * Insert a new c
2f410 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20  ell on pPage at 
2f420 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20  cell index "i". 
2f430 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f   pCell points to
2f440 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
2f450 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a  of the cell..**.
2f460 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63  ** If the cell c
2f470 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20  ontent will fit 
2f480 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  on the page, the
2f490 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20  n put it there. 
2f4a0 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e   If it.** will n
2f4b0 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b  ot fit, then mak
2f4c0 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
2f4d0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74  cell content int
2f4e0 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54  o pTemp if.** pT
2f4f0 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e  emp is not null.
2f500 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20    Regardless of 
2f510 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20  pTemp, allocate 
2f520 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69  a new entry.** i
2f530 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b  n pPage->apOvfl[
2f540 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f  ] and make it po
2f550 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  int to the cell 
2f560 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a  content (either.
2f570 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74  ** in pTemp or t
2f580 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c  he original pCel
2f590 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f  l) and also reco
2f5a0 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a  rd its index. .*
2f5b0 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  * Allocating a n
2f5c0 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67  ew entry in pPag
2f5d0 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69  e->aCell[] impli
2f5e0 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67  es that .** pPag
2f5f0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20  e->nOverflow is 
2f600 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a  incremented..**.
2f610 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e  ** If nSkip is n
2f620 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f  on-zero, then do
2f630 20 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69   not copy the fi
2f640 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20  rst nSkip bytes 
2f650 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20  of the.** cell. 
2f660 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
2f670 6f 76 65 72 77 72 69 74 65 20 74 68 65 6d 20 61  overwrite them a
2f680 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
2f690 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a  on returns. If.*
2f6a0 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a  * nSkip is non-z
2f6b0 65 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20  ero, then pCell 
2f6c0 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f  may not point to
2f6d0 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f   an invalid memo
2f6e0 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20  ry location .** 
2f6f0 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  (but pCell+nSkip
2f700 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
2f710 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
2f720 64 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20  d insertCell(.  
2f730 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
2f740 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77    /* Page into w
2f750 68 69 63 68 20 77 65 20 61 72 65 20 63 6f 70 79  hich we are copy
2f760 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  ing */.  int i, 
2f770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
2f780 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74  w cell becomes t
2f790 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20  he i-th cell of 
2f7a0 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  the page */.  u8
2f7b0 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
2f7c0 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68  /* Content of th
2f7d0 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20  e new cell */.  
2f7e0 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20  int sz,         
2f7f0 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f    /* Bytes of co
2f800 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a  ntent in pCell *
2f810 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20  /.  u8 *pTemp,  
2f820 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74        /* Temp st
2f830 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f 72 20  orage space for 
2f840 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64  pCell, if needed
2f850 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c   */.  Pgno iChil
2f860 64 2c 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f  d,      /* If no
2f870 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65 20  n-zero, replace 
2f880 66 69 72 73 74 20 34 20 62 79 74 65 73 20 77 69  first 4 bytes wi
2f890 74 68 20 74 68 69 73 20 76 61 6c 75 65 20 2a 2f  th this value */
2f8a0 0a 20 20 69 6e 74 20 2a 70 52 43 20 20 20 20 20  .  int *pRC     
2f8b0 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61 6e 64       /* Read and
2f8c0 20 77 72 69 74 65 20 72 65 74 75 72 6e 20 63 6f   write return co
2f8d0 64 65 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a  de from here */.
2f8e0 29 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d 20 30  ){.  int idx = 0
2f8f0 3b 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20  ;      /* Where 
2f900 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c  to write new cel
2f910 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74  l content in dat
2f920 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20  a[] */.  int j; 
2f930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2f940 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
2f950 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20  int end;        
2f960 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
2f970 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 63 65  past the last ce
2f980 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61  ll pointer in da
2f990 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  ta[] */.  int in
2f9a0 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  s;          /* I
2f9b0 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77  ndex in data[] w
2f9c0 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f  here new cell po
2f9d0 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72 74 65  inter is inserte
2f9e0 64 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  d */.  int cellO
2f9f0 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72  ffset;   /* Addr
2fa00 65 73 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c  ess of first cel
2fa10 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74  l pointer in dat
2fa20 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  a[] */.  u8 *dat
2fa30 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  a;         /* Th
2fa40 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
2fa50 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20   whole page */. 
2fa60 20 69 6e 74 20 6e 53 6b 69 70 20 3d 20 28 69 43   int nSkip = (iC
2fa70 68 69 6c 64 20 3f 20 34 20 3a 20 30 29 3b 0a 0a  hild ? 4 : 0);..
2fa80 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
2fa90 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
2faa0 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65  i>=0 && i<=pPage
2fab0 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e  ->nCell+pPage->n
2fac0 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73  Overflow );.  as
2fad0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
2fae0 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67  ll<=MX_CELL(pPag
2faf0 65 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45  e->pBt) && MX_CE
2fb00 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d  LL(pPage->pBt)<=
2fb10 31 30 39 32 31 20 29 3b 0a 20 20 61 73 73 65 72  10921 );.  asser
2fb20 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
2fb30 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70  low<=ArraySize(p
2fb40 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29 3b  Page->apOvfl) );
2fb50 0a 20 20 61 73 73 65 72 74 28 20 41 72 72 61 79  .  assert( Array
2fb60 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76  Size(pPage->apOv
2fb70 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65 28 70  fl)==ArraySize(p
2fb80 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29 3b  Page->aiOvfl) );
2fb90 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2fba0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
2fbb0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
2fbc0 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c   );.  /* The cel
2fbd0 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c  l should normall
2fbe0 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65  y be sized corre
2fbf0 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20  ctly.  However, 
2fc00 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20  when moving a.  
2fc10 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c  ** malformed cel
2fc20 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61  l from a leaf pa
2fc30 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f  ge to an interio
2fc40 72 20 70 61 67 65 2c 20 69 66 20 74 68 65 20 63  r page, if the c
2fc50 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61  ell size.  ** wa
2fc60 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20  nted to be less 
2fc70 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72  than 4 but got r
2fc80 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f  ounded up to 4 o
2fc90 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e  n the leaf, then
2fca0 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74   size.  ** might
2fcb0 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38 20   be less than 8 
2fcc0 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69  (leaf-size + poi
2fcd0 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e 74  nter) on the int
2fce0 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e  erior node.  Hen
2fcf0 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72 6d  ce.  ** the term
2fd00 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69 6e   after the || in
2fd10 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
2fd20 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73  ssert(). */.  as
2fd30 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69  sert( sz==cellSi
2fd40 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
2fd50 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26  ll) || (sz==8 &&
2fd60 20 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20   iChild>0) );.  
2fd70 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  if( pPage->nOver
2fd80 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61  flow || sz+2>pPa
2fd90 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
2fda0 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20   if( pTemp ){.  
2fdb0 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
2fdc0 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53  +nSkip, pCell+nS
2fdd0 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a  kip, sz-nSkip);.
2fde0 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
2fdf0 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  emp;.    }.    i
2fe00 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
2fe10 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
2fe20 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  l, iChild);.    
2fe30 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d  }.    j = pPage-
2fe40 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20  >nOverflow++;.  
2fe50 20 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74    assert( j<(int
2fe60 29 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  )(sizeof(pPage->
2fe70 61 70 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70  apOvfl)/sizeof(p
2fe80 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29  Page->apOvfl[0])
2fe90 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
2fea0 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c  apOvfl[j] = pCel
2feb0 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 69  l;.    pPage->ai
2fec0 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69  Ovfl[j] = (u16)i
2fed0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
2fee0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
2fef0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
2ff00 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
2ff10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2ff20 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
2ff30 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
2ff40 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  n;.    }.    ass
2ff50 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2ff60 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2ff70 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
2ff80 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
2ff90 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 63 65 6c  ->aData;.    cel
2ffa0 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
2ffb0 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20  >cellOffset;.   
2ffc0 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65   end = cellOffse
2ffd0 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
2ffe0 6c 6c 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65  ll;.    ins = ce
2fff0 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a  llOffset + 2*i;.
30000 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
30010 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a  eSpace(pPage, sz
30020 2c 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28  , &idx);.    if(
30030 20 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 72 63   rc ){ *pRC = rc
30040 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20  ; return; }.    
30050 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 53  /* The allocateS
30060 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20 67  pace() routine g
30070 75 61 72 61 6e 74 65 65 73 20 74 68 65 20 66 6f  uarantees the fo
30080 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 70 72 6f 70  llowing two prop
30090 65 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66  erties.    ** if
300a0 20 69 74 20 72 65 74 75 72 6e 73 20 73 75 63 63   it returns succ
300b0 65 73 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ess */.    asser
300c0 74 28 20 69 64 78 20 3e 3d 20 65 6e 64 2b 32 20  t( idx >= end+2 
300d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
300e0 64 78 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50  dx+sz <= (int)pP
300f0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
30100 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67  Size );.    pPag
30110 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20  e->nCell++;.    
30120 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20  pPage->nFree -= 
30130 28 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20  (u16)(2 + sz);. 
30140 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
30150 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c  idx+nSkip], pCel
30160 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69  l+nSkip, sz-nSki
30170 70 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69  p);.    if( iChi
30180 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34  ld ){.      put4
30190 62 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c  byte(&data[idx],
301a0 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a   iChild);.    }.
301b0 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74      memmove(&dat
301c0 61 5b 69 6e 73 2b 32 5d 2c 20 26 64 61 74 61 5b  a[ins+2], &data[
301d0 69 6e 73 5d 2c 20 65 6e 64 2d 69 6e 73 29 3b 0a  ins], end-ins);.
301e0 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
301f0 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20  ta[ins], idx);. 
30200 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
30210 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
30220 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  et+3], pPage->nC
30230 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ell);.#ifndef SQ
30240 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
30250 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61  CUUM.    if( pPa
30260 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  ge->pBt->autoVac
30270 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  uum ){.      /* 
30280 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e  The cell may con
30290 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
302a0 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
302b0 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65  ge. If so, write
302c0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  .      ** the en
302d0 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72  try for the over
302e0 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74  flow page into t
302f0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
30300 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
30310 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
30320 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52  pPage, pCell, pR
30330 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  C);.    }.#endif
30340 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
30350 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c  d a list of cell
30360 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68  s to a page.  Th
30370 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65  e page should be
30380 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79   initially empty
30390 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61  ..** The cells a
303a0 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
303b0 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65   fit on the page
303c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
303d0 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20   assemblePage(. 
303e0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
303f0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
30400 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20  o be assemblied 
30410 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20  */.  int nCell, 
30420 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
30430 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f  mber of cells to
30440 20 61 64 64 20 74 6f 20 74 68 69 73 20 70 61 67   add to this pag
30450 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
30460 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ll,      /* Poin
30470 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64  ters to cell bod
30480 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53  ies */.  u16 *aS
30490 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ize        /* Si
304a0 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  zes of the cells
304b0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
304c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
304d0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
304e0 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b 20 20 20  u8 *pCellptr;   
304f0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
30500 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  next cell pointe
30510 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62  r */.  int cellb
30520 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72  ody;     /* Addr
30530 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c  ess of next cell
30540 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 20   body */.  u8 * 
30550 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61  const data = pPa
30560 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20  ge->aData;      
30570 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
30580 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50  r to data for pP
30590 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  age */.  const i
305a0 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  nt hdr = pPage->
305b0 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20  hdrOffset;      
305c0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
305d0 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50 61 67  f header on pPag
305e0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  e */.  const int
305f0 20 6e 55 73 61 62 6c 65 20 3d 20 70 50 61 67 65   nUsable = pPage
30600 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
30610 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a  e; /* Usable siz
30620 65 20 6f 66 20 70 61 67 65 20 2a 2f 0a 0a 20 20  e of page */..  
30630 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
30640 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
30650 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
30660 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
30670 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
30680 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c  ;.  assert( nCel
30690 6c 3e 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d 28  l>=0 && nCell<=(
306a0 69 6e 74 29 4d 58 5f 43 45 4c 4c 28 70 50 61 67  int)MX_CELL(pPag
306b0 65 2d 3e 70 42 74 29 0a 20 20 20 20 20 20 20 20  e->pBt).        
306c0 20 20 20 20 26 26 20 28 69 6e 74 29 4d 58 5f 43      && (int)MX_C
306d0 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c  ELL(pPage->pBt)<
306e0 3d 31 30 39 32 31 29 3b 0a 20 20 61 73 73 65 72  =10921);.  asser
306f0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
30700 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
30710 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
30720 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
30730 68 65 20 70 61 67 65 20 68 61 73 20 6a 75 73 74  he page has just
30740 20 62 65 65 6e 20 7a 65 72 6f 65 64 20 62 79 20   been zeroed by 
30750 7a 65 72 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20  zeroPage() */.  
30760 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
30770 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Cell==0 );.  ass
30780 65 72 74 28 20 67 65 74 32 62 79 74 65 4e 6f 74  ert( get2byteNot
30790 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35  Zero(&data[hdr+5
307a0 5d 29 3d 3d 6e 55 73 61 62 6c 65 20 29 3b 0a 0a  ])==nUsable );..
307b0 20 20 70 43 65 6c 6c 70 74 72 20 3d 20 26 70 50    pCellptr = &pP
307c0 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 43  age->aCellIdx[nC
307d0 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f  ell*2];.  cellbo
307e0 64 79 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20  dy = nUsable;.  
307f0 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69  for(i=nCell-1; i
30800 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 75  >=0; i--){.    u
30810 31 36 20 73 7a 20 3d 20 61 53 69 7a 65 5b 69 5d  16 sz = aSize[i]
30820 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2d  ;.    pCellptr -
30830 3d 20 32 3b 0a 20 20 20 20 63 65 6c 6c 62 6f 64  = 2;.    cellbod
30840 79 20 2d 3d 20 73 7a 3b 0a 20 20 20 20 70 75 74  y -= sz;.    put
30850 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20  2byte(pCellptr, 
30860 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d  cellbody);.    m
30870 65 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c  emcpy(&data[cell
30880 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d  body], apCell[i]
30890 2c 20 73 7a 29 3b 0a 20 20 7d 0a 20 20 70 75 74  , sz);.  }.  put
308a0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
308b0 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 70 75  3], nCell);.  pu
308c0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
308d0 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a  +5], cellbody);.
308e0 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d    pPage->nFree -
308f0 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b 20 6e 55 73  = (nCell*2 + nUs
30900 61 62 6c 65 20 2d 20 63 65 6c 6c 62 6f 64 79 29  able - cellbody)
30910 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
30920 20 3d 20 28 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d   = (u16)nCell;.}
30930 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
30940 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73  owing parameters
30950 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d   determine how m
30960 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61 67  any adjacent pag
30970 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a  es get involved.
30980 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e  ** in a balancin
30990 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e  g operation.  NN
309a0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
309b0 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  f neighbors on e
309c0 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66  ither side.** of
309d0 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 70   the page that p
309e0 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68  articipate in th
309f0 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72  e balancing oper
30a00 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68  ation.  NB is th
30a10 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65  e.** total numbe
30a20 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  r of pages that 
30a30 70 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e 63  participate, inc
30a40 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72 67 65  luding the targe
30a50 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e  t page and.** NN
30a60 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
30a70 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a  ther side..**.**
30a80 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c   The minimum val
30a90 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f  ue of NN is 1 (o
30aa0 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63 72  f course).  Incr
30ab0 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20  easing NN above 
30ac0 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33 29  1.** (to 2 or 3)
30ad0 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74 20   gives a modest 
30ae0 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53  improvement in S
30af0 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54 45  ELECT and DELETE
30b00 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20   performance.** 
30b10 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20  in exchange for 
30b20 61 20 6c 61 72 67 65 72 20 64 65 67 72 61 64 61  a larger degrada
30b30 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20 61  tion in INSERT a
30b40 6e 64 20 55 50 44 41 54 45 20 70 65 72 66 6f 72  nd UPDATE perfor
30b50 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61  mance..** The va
30b60 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61 72  lue of NN appear
30b70 73 20 74 6f 20 67 69 76 65 20 74 68 65 20 62 65  s to give the be
30b80 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72 61  st results overa
30b90 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  ll..*/.#define N
30ba0 4e 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20  N 1             
30bb0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69  /* Number of nei
30bc0 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
30bd0 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 2a   side of pPage *
30be0 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e  /.#define NB (NN
30bf0 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54 6f  *2+1)      /* To
30c00 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c 76  tal pages involv
30c10 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  ed in the balanc
30c20 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53  e */...#ifndef S
30c30 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b  QLITE_OMIT_QUICK
30c40 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68  BALANCE./*.** Th
30c50 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61  is version of ba
30c60 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20  lance() handles 
30c70 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69  the common speci
30c80 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a  al case where.**
30c90 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20   a new entry is 
30ca0 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f  being inserted o
30cb0 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69  n the extreme ri
30cc0 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a  ght-end of the.*
30cd0 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72  * tree, in other
30ce0 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65   words, when the
30cf0 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20   new entry will 
30d00 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65  become the large
30d10 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74  st.** entry in t
30d20 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49  he tree..**.** I
30d30 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67  nstead of trying
30d40 20 74 6f 20 62 61 6c 61 6e 63 65 20 74 68 65 20   to balance the 
30d50 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  3 right-most lea
30d60 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64  f pages, just ad
30d70 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20  d.** a new page 
30d80 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  to the right-han
30d90 64 20 73 69 64 65 20 61 6e 64 20 70 75 74 20 74  d side and put t
30da0 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79  he one new entry
30db0 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65   in.** that page
30dc0 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73 20 74  .  This leaves t
30dd0 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66  he right side of
30de0 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68   the tree somewh
30df0 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64  at.** unbalanced
30e00 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72 65 20  .  But odds are 
30e10 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20  that we will be 
30e20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e  inserting new en
30e30 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20  tries.** at the 
30e40 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61  end soon afterwa
30e50 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c  rds so the nearl
30e60 79 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c  y empty page wil
30e70 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c  l quickly.** fil
30e80 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67  l up.  On averag
30e90 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69  e..**.** pPage i
30ea0 73 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  s the leaf page 
30eb0 77 68 69 63 68 20 69 73 20 74 68 65 20 72 69 67  which is the rig
30ec0 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20  ht-most page in 
30ed0 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61  the tree..** pPa
30ee0 72 65 6e 74 20 69 73 20 69 74 73 20 70 61 72 65  rent is its pare
30ef0 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20  nt.  pPage must 
30f00 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76  have a single ov
30f10 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20  erflow entry.** 
30f20 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68  which is also th
30f30 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
30f40 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  ry on the page..
30f50 2a 2a 0a 2a 2a 20 54 68 65 20 70 53 70 61 63 65  **.** The pSpace
30f60 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20   buffer is used 
30f70 74 6f 20 73 74 6f 72 65 20 61 20 74 65 6d 70 6f  to store a tempo
30f80 72 61 72 79 20 63 6f 70 79 20 6f 66 20 74 68 65  rary copy of the
30f90 20 64 69 76 69 64 65 72 0a 2a 2a 20 63 65 6c 6c   divider.** cell
30fa0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6e   that will be in
30fb0 73 65 72 74 65 64 20 69 6e 74 6f 20 70 50 61 72  serted into pPar
30fc0 65 6e 74 2e 20 53 75 63 68 20 61 20 63 65 6c 6c  ent. Such a cell
30fd0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34   consists of a 4
30fe0 0a 2a 2a 20 62 79 74 65 20 70 61 67 65 20 6e 75  .** byte page nu
30ff0 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79  mber followed by
31000 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67   a variable leng
31010 74 68 20 69 6e 74 65 67 65 72 2e 20 49 6e 20 6f  th integer. In o
31020 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61  ther.** words, a
31030 74 20 6d 6f 73 74 20 31 33 20 62 79 74 65 73 2e  t most 13 bytes.
31040 20 48 65 6e 63 65 20 74 68 65 20 70 53 70 61 63   Hence the pSpac
31050 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65  e buffer must be
31060 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20 31 33 20   at.** least 13 
31070 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
31080 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
31090 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61  ance_quick(MemPa
310a0 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 4d 65 6d  ge *pParent, Mem
310b0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
310c0 2a 70 53 70 61 63 65 29 7b 0a 20 20 42 74 53 68  *pSpace){.  BtSh
310d0 61 72 65 64 20 2a 63 6f 6e 73 74 20 70 42 74 20  ared *const pBt 
310e0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 20 20 20  = pPage->pBt;   
310f0 20 2f 2a 20 42 2d 54 72 65 65 20 44 61 74 61 62   /* B-Tree Datab
31100 61 73 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ase */.  MemPage
31110 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
31120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31130 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64   Newly allocated
31140 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72   page */.  int r
31150 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
31160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31170 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
31180 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77  /.  Pgno pgnoNew
31190 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
311a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
311b0 20 6e 75 6d 62 65 72 20 6f 66 20 70 4e 65 77 20   number of pNew 
311c0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
311d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
311e0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
311f0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
31200 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
31210 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74  riteable(pParent
31220 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
31230 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
31240 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a  Overflow==1 );..
31250 20 20 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20    /* This error 
31260 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 77  condition is now
31270 20 63 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f   caught prior to
31280 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 66   reaching this f
31290 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28  unction */.  if(
312a0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30   pPage->nCell==0
312b0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
312c0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a  _CORRUPT_BKPT;..
312d0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
312e0 6e 65 77 20 70 61 67 65 2e 20 54 68 69 73 20 70  new page. This p
312f0 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  age will become 
31300 74 68 65 20 72 69 67 68 74 2d 73 69 62 6c 69 6e  the right-siblin
31310 67 20 6f 66 20 0a 20 20 2a 2a 20 70 50 61 67 65  g of .  ** pPage
31320 2e 20 4d 61 6b 65 20 74 68 65 20 70 61 72 65 6e  . Make the paren
31330 74 20 70 61 67 65 20 77 72 69 74 61 62 6c 65 2c  t page writable,
31340 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 77   so that the new
31350 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20   divider cell.  
31360 2a 2a 20 6d 61 79 20 62 65 20 69 6e 73 65 72 74  ** may be insert
31370 65 64 2e 20 49 66 20 62 6f 74 68 20 74 68 65 73  ed. If both thes
31380 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65  e operations are
31390 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70 72 6f   successful, pro
313a0 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  ceed..  */.  rc 
313b0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
313c0 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20  age(pBt, &pNew, 
313d0 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b  &pgnoNew, 0, 0);
313e0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
313f0 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 75 38  TE_OK ){..    u8
31400 20 2a 70 4f 75 74 20 3d 20 26 70 53 70 61 63 65   *pOut = &pSpace
31410 5b 34 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65  [4];.    u8 *pCe
31420 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 70 4f 76  ll = pPage->apOv
31430 66 6c 5b 30 5d 3b 0a 20 20 20 20 75 31 36 20 73  fl[0];.    u16 s
31440 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65  zCell = cellSize
31450 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
31460 29 3b 0a 20 20 20 20 75 38 20 2a 70 53 74 6f 70  );.    u8 *pStop
31470 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ;..    assert( s
31480 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
31490 74 65 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62  teable(pNew->pDb
314a0 50 61 67 65 29 20 29 3b 0a 20 20 20 20 61 73 73  Page) );.    ass
314b0 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
314c0 61 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45  a[0]==(PTF_INTKE
314d0 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50  Y|PTF_LEAFDATA|P
314e0 54 46 5f 4c 45 41 46 29 20 29 3b 0a 20 20 20 20  TF_LEAF) );.    
314f0 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 50  zeroPage(pNew, P
31500 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
31510 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29  AFDATA|PTF_LEAF)
31520 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61  ;.    assemblePa
31530 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65  ge(pNew, 1, &pCe
31540 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20  ll, &szCell);.. 
31550 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
31560 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
31570 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65  database, update
31580 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
31590 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74  .    ** with ent
315a0 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77  ries for the new
315b0 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70   page, and any p
315c0 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20  ointer from the 
315d0 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20  .    ** cell on 
315e0 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f  the page to an o
315f0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
31600 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65   either of these
31610 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f  .    ** operatio
31620 6e 73 20 66 61 69 6c 73 2c 20 74 68 65 20 72 65  ns fails, the re
31630 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 65 74  turn code is set
31640 2c 20 62 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  , but the conten
31650 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ts.    ** of the
31660 20 70 61 72 65 6e 74 20 70 61 67 65 20 61 72 65   parent page are
31670 20 73 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74   still manipulat
31680 65 64 20 62 79 20 74 68 68 20 63 6f 64 65 20 62  ed by thh code b
31690 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61  elow..    ** Tha
316a0 74 20 69 73 20 4f 6b 2c 20 61 74 20 74 68 69 73  t is Ok, at this
316b0 20 70 6f 69 6e 74 20 74 68 65 20 70 61 72 65 6e   point the paren
316c0 74 20 70 61 67 65 20 69 73 20 67 75 61 72 61 6e  t page is guaran
316d0 74 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  teed to.    ** b
316e0 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  e marked as dirt
316f0 79 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20  y. Returning an 
31700 65 72 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20  error code will 
31710 63 61 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 72  cause a.    ** r
31720 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67  ollback, undoing
31730 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64   any changes mad
31740 65 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  e to the parent 
31750 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
31760 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
31770 4d 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  M ){.      ptrma
31780 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65  pPut(pBt, pgnoNe
31790 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  w, PTRMAP_BTREE,
317a0 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20   pParent->pgno, 
317b0 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &rc);.      if( 
317c0 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e  szCell>pNew->min
317d0 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  Local ){.       
317e0 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
317f0 72 28 70 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26  r(pNew, pCell, &
31800 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc);.      }.   
31810 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65   }.  .    /* Cre
31820 61 74 65 20 61 20 64 69 76 69 64 65 72 20 63 65  ate a divider ce
31830 6c 6c 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74  ll to insert int
31840 6f 20 70 50 61 72 65 6e 74 2e 20 54 68 65 20 64  o pParent. The d
31850 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 20 20  ivider cell.    
31860 2a 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ** consists of a
31870 20 34 2d 62 79 74 65 20 70 61 67 65 20 6e 75 6d   4-byte page num
31880 62 65 72 20 28 74 68 65 20 70 61 67 65 20 6e 75  ber (the page nu
31890 6d 62 65 72 20 6f 66 20 70 50 61 67 65 29 20 61  mber of pPage) a
318a0 6e 64 0a 20 20 20 20 2a 2a 20 61 20 76 61 72 69  nd.    ** a vari
318b0 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 20  able length key 
318c0 76 61 6c 75 65 20 28 77 68 69 63 68 20 6d 75 73  value (which mus
318d0 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 76 61  t be the same va
318e0 6c 75 65 20 61 73 20 74 68 65 0a 20 20 20 20 2a  lue as the.    *
318f0 2a 20 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e  * largest key on
31900 20 70 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a   pPage)..    **.
31910 20 20 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74      ** To find t
31920 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76  he largest key v
31930 61 6c 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66  alue on pPage, f
31940 69 72 73 74 20 66 69 6e 64 20 74 68 65 20 72 69  irst find the ri
31950 67 68 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a  ght-most .    **
31960 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20   cell on pPage. 
31970 54 68 65 20 66 69 72 73 74 20 74 77 6f 20 66 69  The first two fi
31980 65 6c 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c  elds of this cel
31990 6c 20 61 72 65 20 74 68 65 20 0a 20 20 20 20 2a  l are the .    *
319a0 2a 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20  * record-length 
319b0 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67  (a variable leng
319c0 74 68 20 69 6e 74 65 67 65 72 20 61 74 20 6d 6f  th integer at mo
319d0 73 74 20 33 32 2d 62 69 74 73 20 69 6e 20 73 69  st 32-bits in si
319e0 7a 65 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74  ze).    ** and t
319f0 68 65 20 6b 65 79 20 76 61 6c 75 65 20 28 61 20  he key value (a 
31a00 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
31a10 69 6e 74 65 67 65 72 2c 20 6d 61 79 20 68 61 76  integer, may hav
31a20 65 20 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20  e any value)..  
31a30 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f    ** The first o
31a40 66 20 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29  f the while(...)
31a50 20 6c 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69   loops below ski
31a60 70 73 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f  ps over the reco
31a70 72 64 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a  rd-length.    **
31a80 20 66 69 65 6c 64 2e 20 54 68 65 20 73 65 63 6f   field. The seco
31a90 6e 64 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f  nd while(...) lo
31aa0 6f 70 20 63 6f 70 69 65 73 20 74 68 65 20 6b 65  op copies the ke
31ab0 79 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65  y value from the
31ac0 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20  .    ** cell on 
31ad0 70 50 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70  pPage into the p
31ae0 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20  Space buffer..  
31af0 20 20 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d    */.    pCell =
31b00 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
31b10 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29   pPage->nCell-1)
31b20 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70  ;.    pStop = &p
31b30 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Cell[9];.    whi
31b40 6c 65 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26  le( (*(pCell++)&
31b50 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70  0x80) && pCell<p
31b60 53 74 6f 70 20 29 3b 0a 20 20 20 20 70 53 74 6f  Stop );.    pSto
31b70 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20  p = &pCell[9];. 
31b80 20 20 20 77 68 69 6c 65 28 20 28 28 2a 28 70 4f     while( ((*(pO
31b90 75 74 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b  ut++) = *(pCell+
31ba0 2b 29 29 26 30 78 38 30 29 20 26 26 20 70 43 65  +))&0x80) && pCe
31bb0 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20  ll<pStop );..   
31bc0 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e   /* Insert the n
31bd0 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  ew divider cell 
31be0 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f  into pParent. */
31bf0 0a 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28  .    insertCell(
31c00 70 50 61 72 65 6e 74 2c 20 70 50 61 72 65 6e 74  pParent, pParent
31c10 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c  ->nCell, pSpace,
31c20 20 28 69 6e 74 29 28 70 4f 75 74 2d 70 53 70 61   (int)(pOut-pSpa
31c30 63 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ce),.           
31c40 20 20 20 20 30 2c 20 70 50 61 67 65 2d 3e 70 67      0, pPage->pg
31c50 6e 6f 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f  no, &rc);..    /
31c60 2a 20 53 65 74 20 74 68 65 20 72 69 67 68 74 2d  * Set the right-
31c70 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66  child pointer of
31c80 20 70 50 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e   pParent to poin
31c90 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  t to the new pag
31ca0 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79  e. */.    put4by
31cb0 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
31cc0 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
31cd0 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65  ffset+8], pgnoNe
31ce0 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65  w);.  .    /* Re
31cf0 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65  lease the refere
31d00 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70  nce to the new p
31d10 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65  age. */.    rele
31d20 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20  asePage(pNew);. 
31d30 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
31d40 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
31d50 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
31d60 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a  LANCE */..#if 0.
31d70 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
31d80 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ion does not con
31d90 74 72 69 62 75 74 65 20 61 6e 79 74 68 69 6e 67  tribute anything
31da0 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f   to the operatio
31db0 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20  n of SQLite..** 
31dc0 69 74 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20  it is sometimes 
31dd0 61 63 74 69 76 61 74 65 64 20 74 65 6d 70 6f 72  activated tempor
31de0 61 72 69 6c 79 20 77 68 69 6c 65 20 64 65 62 75  arily while debu
31df0 67 67 69 6e 67 20 63 6f 64 65 20 72 65 73 70 6f  gging code respo
31e00 6e 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73  nsible .** for s
31e10 65 74 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d  etting pointer-m
31e20 61 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73  ap entries..*/.s
31e30 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
31e40 43 68 65 63 6b 50 61 67 65 73 28 4d 65 6d 50 61  CheckPages(MemPa
31e50 67 65 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74  ge **apPage, int
31e60 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69   nPage){.  int i
31e70 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  , j;.  for(i=0; 
31e80 69 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  i<nPage; i++){. 
31e90 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75     Pgno n;.    u
31ea0 38 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  8 e;.    MemPage
31eb0 20 2a 70 50 61 67 65 20 3d 20 61 70 50 61 67 65   *pPage = apPage
31ec0 5b 69 5d 3b 0a 20 20 20 20 42 74 53 68 61 72 65  [i];.    BtShare
31ed0 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
31ee0 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
31ef0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
31f00 3b 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ;..    for(j=0; 
31f10 6a 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  j<pPage->nCell; 
31f20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c  j++){.      Cell
31f30 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
31f40 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20   u8 *z;.     .  
31f50 20 20 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c      z = findCell
31f60 28 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20  (pPage, j);.    
31f70 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
31f80 50 74 72 28 70 50 61 67 65 2c 20 7a 2c 20 26 69  Ptr(pPage, z, &i
31f90 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nfo);.      if( 
31fa0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29  info.iOverflow )
31fb0 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6f  {.        Pgno o
31fc0 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
31fd0 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  z[info.iOverflow
31fe0 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  ]);.        ptrm
31ff0 61 70 47 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c  apGet(pBt, ovfl,
32000 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20   &e, &n);.      
32010 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61    assert( n==pPa
32020 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50  ge->pgno && e==P
32030 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
32040 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
32050 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
32060 66 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  f ){.        Pgn
32070 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79  o child = get4by
32080 74 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 70  te(z);.        p
32090 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68  trmapGet(pBt, ch
320a0 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20  ild, &e, &n);.  
320b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d        assert( n=
320c0 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20  =pPage->pgno && 
320d0 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
320e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
320f0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
32100 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50  >leaf ){.      P
32110 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34  gno child = get4
32120 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
32130 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
32140 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70  set+8]);.      p
32150 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68  trmapGet(pBt, ch
32160 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20  ild, &e, &n);.  
32170 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70      assert( n==p
32180 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d  Page->pgno && e=
32190 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b  =PTRMAP_BTREE );
321a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
321b0 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
321c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
321d0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
321e0 63 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74  copy the content
321f0 73 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  s of the b-tree 
32200 6e 6f 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20  node stored .** 
32210 6f 6e 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f  on page pFrom to
32220 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70 61   page pTo. If pa
32230 67 65 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74  ge pFrom was not
32240 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68   a leaf page, th
32250 65 6e 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  en.** the pointe
32260 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
32270 72 20 65 61 63 68 20 63 68 69 6c 64 20 70 61 67  r each child pag
32280 65 20 61 72 65 20 75 70 64 61 74 65 64 20 73 6f  e are updated so
32290 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 72   that the.** par
322a0 65 6e 74 20 70 61 67 65 20 73 74 6f 72 65 64 20  ent page stored 
322b0 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  in the pointer m
322c0 61 70 20 69 73 20 70 61 67 65 20 70 54 6f 2e 20  ap is page pTo. 
322d0 49 66 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e  If pFrom contain
322e0 65 64 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20  ed.** any cells 
322f0 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 70 61  with overflow pa
32300 67 65 20 70 6f 69 6e 74 65 72 73 2c 20 74 68 65  ge pointers, the
32310 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  n the correspond
32320 69 6e 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d  ing pointer.** m
32330 61 70 20 65 6e 74 72 69 65 73 20 61 72 65 20 61  ap entries are a
32340 6c 73 6f 20 75 70 64 61 74 65 64 20 73 6f 20 74  lso updated so t
32350 68 61 74 20 74 68 65 20 70 61 72 65 6e 74 20 70  hat the parent p
32360 61 67 65 20 69 73 20 70 61 67 65 20 70 54 6f 2e  age is page pTo.
32370 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20  .**.** If pFrom 
32380 69 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72  is currently car
32390 72 79 69 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c  rying any overfl
323a0 6f 77 20 63 65 6c 6c 73 20 28 65 6e 74 72 69 65  ow cells (entrie
323b0 73 20 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50  s in the.** MemP
323c0 61 67 65 2e 61 70 4f 76 66 6c 5b 5d 20 61 72 72  age.apOvfl[] arr
323d0 61 79 29 2c 20 74 68 65 79 20 61 72 65 20 6e 6f  ay), they are no
323e0 74 20 63 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e  t copied to pTo.
323f0 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72   .**.** Before r
32400 65 74 75 72 6e 69 6e 67 2c 20 70 61 67 65 20 70  eturning, page p
32410 54 6f 20 69 73 20 72 65 69 6e 69 74 69 61 6c 69  To is reinitiali
32420 7a 65 64 20 75 73 69 6e 67 20 62 74 72 65 65 49  zed using btreeI
32430 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a  nitPage()..**.**
32440 20 54 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   The performance
32450 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
32460 6e 20 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61  n is not critica
32470 6c 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73  l. It is only us
32480 65 64 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61  ed by .** the ba
32490 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28  lance_shallower(
324a0 29 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65  ) and balance_de
324b0 65 70 65 72 28 29 20 70 72 6f 63 65 64 75 72 65  eper() procedure
324c0 73 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a  s, neither of.**
324d0 20 77 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65   which are calle
324e0 64 20 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f  d often under no
324f0 72 6d 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63  rmal circumstanc
32500 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
32510 69 64 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65  id copyNodeConte
32520 6e 74 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f  nt(MemPage *pFro
32530 6d 2c 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c  m, MemPage *pTo,
32540 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66   int *pRC){.  if
32550 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45  ( (*pRC)==SQLITE
32560 5f 4f 4b 20 29 7b 0a 20 20 20 20 42 74 53 68 61  _OK ){.    BtSha
32570 72 65 64 20 2a 20 63 6f 6e 73 74 20 70 42 74 20  red * const pBt 
32580 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20  = pFrom->pBt;.  
32590 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 46 72    u8 * const aFr
325a0 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74  om = pFrom->aDat
325b0 61 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73  a;.    u8 * cons
325c0 74 20 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61  t aTo = pTo->aDa
325d0 74 61 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73  ta;.    int cons
325e0 74 20 69 46 72 6f 6d 48 64 72 20 3d 20 70 46 72  t iFromHdr = pFr
325f0 6f 6d 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  om->hdrOffset;. 
32600 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f     int const iTo
32610 48 64 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e  Hdr = ((pTo->pgn
32620 6f 3d 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29  o==1) ? 100 : 0)
32630 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  ;.    int rc;.  
32640 20 20 69 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a    int iData;.  .
32650 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70    .    assert( p
32660 46 72 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  From->isInit );.
32670 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
32680 6d 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72  m->nFree>=iToHdr
32690 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
326a0 67 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b  get2byte(&aFrom[
326b0 69 46 72 6f 6d 48 64 72 2b 35 5d 29 20 3c 3d 20  iFromHdr+5]) <= 
326c0 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65  (int)pBt->usable
326d0 53 69 7a 65 20 29 3b 0a 20 20 0a 20 20 20 20 2f  Size );.  .    /
326e0 2a 20 43 6f 70 79 20 74 68 65 20 62 2d 74 72 65  * Copy the b-tre
326f0 65 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66  e node content f
32700 72 6f 6d 20 70 61 67 65 20 70 46 72 6f 6d 20 74  rom page pFrom t
32710 6f 20 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20  o page pTo. */. 
32720 20 20 20 69 44 61 74 61 20 3d 20 67 65 74 32 62     iData = get2b
32730 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d  yte(&aFrom[iFrom
32740 48 64 72 2b 35 5d 29 3b 0a 20 20 20 20 6d 65 6d  Hdr+5]);.    mem
32750 63 70 79 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c  cpy(&aTo[iData],
32760 20 26 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20   &aFrom[iData], 
32770 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
32780 69 44 61 74 61 29 3b 0a 20 20 20 20 6d 65 6d 63  iData);.    memc
32790 70 79 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c  py(&aTo[iToHdr],
327a0 20 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72   &aFrom[iFromHdr
327b0 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66  ], pFrom->cellOf
327c0 66 73 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e  fset + 2*pFrom->
327d0 6e 43 65 6c 6c 29 3b 0a 20 20 0a 20 20 20 20 2f  nCell);.  .    /
327e0 2a 20 52 65 69 6e 69 74 69 61 6c 69 7a 65 20 70  * Reinitialize p
327f0 61 67 65 20 70 54 6f 20 73 6f 20 74 68 61 74 20  age pTo so that 
32800 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
32810 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75  the MemPage stru
32820 63 74 75 72 65 0a 20 20 20 20 2a 2a 20 6d 61 74  cture.    ** mat
32830 63 68 20 74 68 65 20 6e 65 77 20 64 61 74 61 2e  ch the new data.
32840 20 54 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   The initializat
32850 69 6f 6e 20 6f 66 20 70 54 6f 20 63 61 6e 20 61  ion of pTo can a
32860 63 74 75 61 6c 6c 79 20 66 61 69 6c 20 75 6e 64  ctually fail und
32870 65 72 0a 20 20 20 20 2a 2a 20 66 61 69 72 6c 79  er.    ** fairly
32880 20 6f 62 73 63 75 72 65 20 63 69 72 63 75 6d 73   obscure circums
32890 74 61 6e 63 65 73 2c 20 65 76 65 6e 20 74 68 6f  tances, even tho
328a0 75 67 68 20 69 74 20 69 73 20 61 20 63 6f 70 79  ugh it is a copy
328b0 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   of initialized 
328c0 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 70 46 72  .    ** page pFr
328d0 6f 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  om..    */.    p
328e0 54 6f 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  To->isInit = 0;.
328f0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e      rc = btreeIn
32900 69 74 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 20  itPage(pTo);.   
32910 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
32920 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43  OK ){.      *pRC
32930 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74   = rc;.      ret
32940 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  urn;.    }.  .  
32950 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
32960 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
32970 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20  atabase, update 
32980 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
32990 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 66  entries.    ** f
329a0 6f 72 20 61 6e 79 20 62 2d 74 72 65 65 20 6f 72  or any b-tree or
329b0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
329c0 74 68 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e  that pTo now con
329d0 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65  tains the pointe
329e0 72 73 20 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20  rs to..    */.  
329f0 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
32a00 55 4d 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43  UM ){.      *pRC
32a10 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61   = setChildPtrma
32a20 70 73 28 70 54 6f 29 3b 0a 20 20 20 20 7d 0a 20  ps(pTo);.    }. 
32a30 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
32a40 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72   routine redistr
32a50 69 62 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20  ibutes cells on 
32a60 74 68 65 20 69 50 61 72 65 6e 74 49 64 78 27 74  the iParentIdx't
32a70 68 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65  h child of pPare
32a80 6e 74 0a 2a 2a 20 28 68 65 72 65 61 66 74 65 72  nt.** (hereafter
32a90 20 22 74 68 65 20 70 61 67 65 22 29 20 61 6e 64   "the page") and
32aa0 20 75 70 20 74 6f 20 32 20 73 69 62 6c 69 6e 67   up to 2 sibling
32ab0 73 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61  s so that all pa
32ac0 67 65 73 20 68 61 76 65 20 61 62 6f 75 74 20 74  ges have about t
32ad0 68 65 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e  he.** same amoun
32ae0 74 20 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e  t of free space.
32af0 20 55 73 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c   Usually a singl
32b00 65 20 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74  e sibling on eit
32b10 68 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 0a  her side of the.
32b20 2a 2a 20 70 61 67 65 20 61 72 65 20 75 73 65 64  ** page are used
32b30 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e   in the balancin
32b40 67 2c 20 74 68 6f 75 67 68 20 62 6f 74 68 20 73  g, though both s
32b50 69 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f  iblings might co
32b60 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73  me from one.** s
32b70 69 64 65 20 69 66 20 74 68 65 20 70 61 67 65 20  ide if the page 
32b80 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 72 20  is the first or 
32b90 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74  last child of it
32ba0 73 20 70 61 72 65 6e 74 2e 20 49 66 20 74 68 65  s parent. If the
32bb0 20 70 61 67 65 20 0a 2a 2a 20 68 61 73 20 66 65   page .** has fe
32bc0 77 65 72 20 74 68 61 6e 20 32 20 73 69 62 6c 69  wer than 2 sibli
32bd0 6e 67 73 20 28 73 6f 6d 65 74 68 69 6e 67 20 77  ngs (something w
32be0 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61  hich can only ha
32bf0 70 70 65 6e 20 69 66 20 74 68 65 20 70 61 67 65  ppen if the page
32c00 0a 2a 2a 20 69 73 20 61 20 72 6f 6f 74 20 70 61  .** is a root pa
32c10 67 65 20 6f 72 20 61 20 63 68 69 6c 64 20 6f 66  ge or a child of
32c20 20 61 20 72 6f 6f 74 20 70 61 67 65 29 20 74 68   a root page) th
32c30 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65  en all available
32c40 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72   siblings.** par
32c50 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20  ticipate in the 
32c60 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a  balancing..**.**
32c70 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   The number of s
32c80 69 62 6c 69 6e 67 73 20 6f 66 20 74 68 65 20 70  iblings of the p
32c90 61 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63  age might be inc
32ca0 72 65 61 73 65 64 20 6f 72 20 64 65 63 72 65 61  reased or decrea
32cb0 73 65 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f  sed by .** one o
32cc0 72 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f  r two in an effo
32cd0 72 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73  rt to keep pages
32ce0 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74   nearly full but
32cf0 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20   not over full. 
32d00 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
32d10 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
32d20 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f  ne is called, so
32d30 6d 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  me of the cells 
32d40 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d  on the page.** m
32d50 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c  ight not actuall
32d60 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 4d  y be stored in M
32d70 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20  emPage.aData[]. 
32d80 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a  This can happen.
32d90 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ** if the page i
32da0 73 20 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69 73  s overfull. This
32db0 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73   routine ensures
32dc0 20 74 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20   that all cells 
32dd0 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20  allocated.** to 
32de0 74 68 65 20 70 61 67 65 20 61 6e 64 20 69 74 73  the page and its
32df0 20 73 69 62 6c 69 6e 67 73 20 66 69 74 20 69 6e   siblings fit in
32e00 74 6f 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  to MemPage.aData
32e10 5b 5d 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  [] before return
32e20 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  ing..**.** In th
32e30 65 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61  e course of bala
32e40 6e 63 69 6e 67 20 74 68 65 20 70 61 67 65 20 61  ncing the page a
32e50 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73 2c  nd its siblings,
32e60 20 63 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a   cells may be.**
32e70 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 6f   inserted into o
32e80 72 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  r removed from t
32e90 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 28  he parent page (
32ea0 70 50 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20  pParent). Doing 
32eb0 73 6f 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65 20  so.** may cause 
32ec0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
32ed0 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75  to become overfu
32ee0 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e  ll or underfull.
32ef0 20 49 66 20 74 68 69 73 0a 2a 2a 20 68 61 70 70   If this.** happ
32f00 65 6e 73 2c 20 69 74 20 69 73 20 74 68 65 20 72  ens, it is the r
32f10 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
32f20 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69   the caller to i
32f30 6e 76 6f 6b 65 20 74 68 65 20 63 6f 72 72 65 63  nvoke the correc
32f40 74 0a 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72  t.** balancing r
32f50 6f 75 74 69 6e 65 20 74 6f 20 66 69 78 20 74 68  outine to fix th
32f60 69 73 20 70 72 6f 62 6c 65 6d 20 28 73 65 65 20  is problem (see 
32f70 74 68 65 20 62 61 6c 61 6e 63 65 28 29 20 72 6f  the balance() ro
32f80 75 74 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49  utine). .**.** I
32f90 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  f this routine f
32fa0 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61  ails for any rea
32fb0 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65  son, it might le
32fc0 61 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ave the database
32fd0 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74  .** in a corrupt
32fe0 65 64 20 73 74 61 74 65 2e 20 53 6f 20 69 66 20  ed state. So if 
32ff0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69  this routine fai
33000 6c 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ls, the database
33010 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f   should.** be ro
33020 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
33030 20 54 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   The third argum
33040 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
33050 74 69 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65  tion, aOvflSpace
33060 2c 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  , is a pointer t
33070 6f 20 61 0a 2a 2a 20 62 75 66 66 65 72 20 62 69  o a.** buffer bi
33080 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
33090 20 6f 6e 65 20 70 61 67 65 2e 20 49 66 20 77 68   one page. If wh
330a0 69 6c 65 20 69 6e 73 65 72 74 69 6e 67 20 63 65  ile inserting ce
330b0 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72  lls into the par
330c0 65 6e 74 0a 2a 2a 20 70 61 67 65 20 28 70 50 61  ent.** page (pPa
330d0 72 65 6e 74 29 20 74 68 65 20 70 61 72 65 6e 74  rent) the parent
330e0 20 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76   page becomes ov
330f0 65 72 66 75 6c 6c 2c 20 74 68 69 73 20 62 75 66  erfull, this buf
33100 66 65 72 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  fer is.** used t
33110 6f 20 73 74 6f 72 65 20 74 68 65 20 70 61 72 65  o store the pare
33120 6e 74 27 73 20 6f 76 65 72 66 6c 6f 77 20 63 65  nt's overflow ce
33130 6c 6c 73 2e 20 42 65 63 61 75 73 65 20 74 68 69  lls. Because thi
33140 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72  s function inser
33150 74 73 0a 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20  ts.** a maximum 
33160 6f 66 20 66 6f 75 72 20 64 69 76 69 64 65 72 20  of four divider 
33170 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70  cells into the p
33180 61 72 65 6e 74 20 70 61 67 65 2c 20 61 6e 64 20  arent page, and 
33190 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73  the maximum.** s
331a0 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 73 74  ize of a cell st
331b0 6f 72 65 64 20 77 69 74 68 69 6e 20 61 6e 20 69  ored within an i
331c0 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20  nternal node is 
331d0 61 6c 77 61 79 73 20 6c 65 73 73 20 74 68 61 6e  always less than
331e0 20 31 2f 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70   1/4.** of the p
331f0 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f  age-size, the aO
33200 76 66 6c 53 70 61 63 65 5b 5d 20 62 75 66 66 65  vflSpace[] buffe
33210 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  r is guaranteed 
33220 74 6f 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65  to be large.** e
33230 6e 6f 75 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76  nough for all ov
33240 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a  erflow cells..**
33250 0a 2a 2a 20 49 66 20 61 4f 76 66 6c 53 70 61 63  .** If aOvflSpac
33260 65 20 69 73 20 73 65 74 20 74 6f 20 61 20 6e 75  e is set to a nu
33270 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73  ll pointer, this
33280 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
33290 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  s .** SQLITE_NOM
332a0 45 4d 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  EM..*/.#if defin
332b0 65 64 28 5f 4d 53 43 5f 56 45 52 29 20 26 26 20  ed(_MSC_VER) && 
332c0 5f 4d 53 43 5f 56 45 52 20 3e 3d 20 31 37 30 30  _MSC_VER >= 1700
332d0 20 26 26 20 64 65 66 69 6e 65 64 28 5f 4d 5f 41   && defined(_M_A
332e0 52 4d 29 0a 23 70 72 61 67 6d 61 20 6f 70 74 69  RM).#pragma opti
332f0 6d 69 7a 65 28 22 22 2c 20 6f 66 66 29 0a 23 65  mize("", off).#e
33300 6e 64 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20  ndif.static int 
33310 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
33320 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
33330 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ent,            
33340 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67     /* Parent pag
33350 65 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 62 65  e of siblings be
33360 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a  ing balanced */.
33370 20 20 69 6e 74 20 69 50 61 72 65 6e 74 49 64 78    int iParentIdx
33380 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
33390 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22 74    /* Index of "t
333a0 68 65 20 70 61 67 65 22 20 69 6e 20 70 50 61 72  he page" in pPar
333b0 65 6e 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76  ent */.  u8 *aOv
333c0 66 6c 53 70 61 63 65 2c 20 20 20 20 20 20 20 20  flSpace,        
333d0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65           /* page
333e0 2d 73 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73  -size bytes of s
333f0 70 61 63 65 20 66 6f 72 20 70 61 72 65 6e 74 20  pace for parent 
33400 6f 76 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ovfl */.  int is
33410 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20  Root,           
33420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
33430 65 20 69 66 20 70 50 61 72 65 6e 74 20 69 73 20  e if pParent is 
33440 61 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20  a root-page */. 
33450 20 69 6e 74 20 62 42 75 6c 6b 20 20 20 20 20 20   int bBulk      
33460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33470 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
33480 20 63 61 6c 6c 20 69 73 20 70 61 72 74 20 6f 66   call is part of
33490 20 61 20 62 75 6c 6b 20 6c 6f 61 64 20 2a 2f 0a   a bulk load */.
334a0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
334b0 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
334c0 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64    /* The whole d
334d0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
334e0 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20   nCell = 0;     
334f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
33500 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
33510 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e  apCell[] */.  in
33520 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b  t nMaxCells = 0;
33530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
33540 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
33550 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20  apCell, szCell, 
33560 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20  aFrom. */.  int 
33570 6e 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20  nNew = 0;       
33580 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
33590 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  er of pages in a
335a0 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pNew[] */.  int 
335b0 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  nOld;           
335c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
335d0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  er of pages in a
335e0 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pOld[] */.  int 
335f0 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20  i, j, k;        
33600 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
33610 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
33620 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20  nt nxDiv;       
33630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
33640 65 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74  ext divider slot
33650 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65   in pParent->aCe
33660 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ll[] */.  int rc
33670 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
33680 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
33690 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
336a0 31 36 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  16 leafCorrectio
336b0 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34  n;          /* 4
336c0 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
336d0 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a  eaf.  0 if not *
336e0 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61  /.  int leafData
336f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33700 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 67   /* True if pPag
33710 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61  e is a leaf of a
33720 20 4c 45 41 46 44 41 54 41 20 74 72 65 65 20 2a   LEAFDATA tree *
33730 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70  /.  int usableSp
33740 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
33750 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61   /* Bytes in pPa
33760 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65  ge beyond the he
33770 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61  ader */.  int pa
33780 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  geFlags;        
33790 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
337a0 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  of pPage->aData[
337b0 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74  0] */.  int subt
337c0 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  otal;           
337d0 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c       /* Subtotal
337e0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c   of bytes in cel
337f0 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a  ls on one page *
33800 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65 31 20  /.  int iSpace1 
33810 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
33820 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64   /* First unused
33830 20 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 31   byte of aSpace1
33840 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66  [] */.  int iOvf
33850 6c 53 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20  lSpace = 0;     
33860 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
33870 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 4f 76  used byte of aOv
33880 66 6c 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69  flSpace[] */.  i
33890 6e 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20  nt szScratch;   
338a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
338b0 69 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d  ize of scratch m
338c0 65 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64 20  emory requested 
338d0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
338e0 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Old[NB];        
338f0 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75    /* pPage and u
33900 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67  p to two sibling
33910 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
33920 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20  apCopy[NB];     
33930 20 20 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63      /* Private c
33940 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d  opies of apOld[]
33950 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50   pages */.  MemP
33960 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d  age *apNew[NB+2]
33970 3b 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  ;        /* pPag
33980 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73  e and up to NB s
33990 69 62 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61  iblings after ba
339a0 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20  lancing */.  u8 
339b0 2a 70 52 69 67 68 74 3b 20 20 20 20 20 20 20 20  *pRight;        
339c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
339d0 61 74 69 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20  ation in parent 
339e0 6f 66 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67  of right-sibling
339f0 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38   pointer */.  u8
33a00 20 2a 61 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20   *apDiv[NB-1];  
33a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
33a20 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70  vider cells in p
33a30 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  Parent */.  int 
33a40 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  cntNew[NB+2];   
33a50 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
33a60 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20  x in aCell[] of 
33a70 63 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20  cell after i-th 
33a80 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  page */.  int sz
33a90 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
33aa0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e         /* Combin
33ab0 65 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73  ed size of cells
33ac0 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70   place on i-th p
33ad0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
33ae0 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Cell = 0;       
33af0 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c        /* All cel
33b00 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65  ls begin balance
33b10 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65  d */.  u16 *szCe
33b20 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
33b30 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a      /* Local siz
33b40 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69  e of all cells i
33b50 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  n apCell[] */.  
33b60 75 38 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20  u8 *aSpace1;    
33b70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33b80 53 70 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73  Space for copies
33b90 20 6f 66 20 64 69 76 69 64 65 72 73 20 63 65 6c   of dividers cel
33ba0 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ls */.  Pgno pgn
33bb0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
33bc0 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 76 61 72       /* Temp var
33bd0 20 74 6f 20 73 74 6f 72 65 20 61 20 70 61 67 65   to store a page
33be0 20 6e 75 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20   number in */.. 
33bf0 20 70 42 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e   pBt = pParent->
33c00 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
33c10 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
33c20 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
33c30 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
33c40 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
33c50 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
33c60 61 67 65 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20  age) );..#if 0. 
33c70 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
33c80 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20  : begin page %d 
33c90 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20  child of %d\n", 
33ca0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61  pPage->pgno, pPa
33cb0 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65  rent->pgno));.#e
33cc0 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68  ndif..  /* At th
33cd0 69 73 20 70 6f 69 6e 74 20 70 50 61 72 65 6e 74  is point pParent
33ce0 20 6d 61 79 20 68 61 76 65 20 61 74 20 6d 6f 73   may have at mos
33cf0 74 20 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63  t one overflow c
33d00 65 6c 6c 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a  ell. And if.  **
33d10 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 63   this overflow c
33d20 65 6c 6c 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ell is present, 
33d30 69 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 63  it must be the c
33d40 65 6c 6c 20 77 69 74 68 20 0a 20 20 2a 2a 20 69  ell with .  ** i
33d50 6e 64 65 78 20 69 50 61 72 65 6e 74 49 64 78 2e  ndex iParentIdx.
33d60 20 54 68 69 73 20 73 63 65 6e 61 72 69 6f 20 63   This scenario c
33d70 6f 6d 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20  omes about when 
33d80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
33d90 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 28 69 6e  ** is called (in
33da0 64 69 72 65 63 74 6c 79 29 20 66 72 6f 6d 20 73  directly) from s
33db0 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
33dc0 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  e()..  */.  asse
33dd0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  rt( pParent->nOv
33de0 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61  erflow==0 || pPa
33df0 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  rent->nOverflow=
33e00 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
33e10 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
33e20 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74  ow==0 || pParent
33e30 2d 3e 61 69 4f 76 66 6c 5b 30 5d 3d 3d 69 50 61  ->aiOvfl[0]==iPa
33e40 72 65 6e 74 49 64 78 20 29 3b 0a 0a 20 20 69 66  rentIdx );..  if
33e50 28 20 21 61 4f 76 66 6c 53 70 61 63 65 20 29 7b  ( !aOvflSpace ){
33e60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
33e70 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
33e80 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 73 69 62   /* Find the sib
33e90 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20 62 61  ling pages to ba
33ea0 6c 61 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61  lance. Also loca
33eb0 74 65 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20  te the cells in 
33ec0 70 50 61 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68  pParent .  ** th
33ed0 61 74 20 64 69 76 69 64 65 20 74 68 65 20 73 69  at divide the si
33ee0 62 6c 69 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d  blings. An attem
33ef0 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69  pt is made to fi
33f00 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  nd NN siblings o
33f10 6e 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 73  n .  ** either s
33f20 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f  ide of pPage. Mo
33f30 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  re siblings are 
33f40 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73  taken from one s
33f50 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20  ide, however, . 
33f60 20 2a 2a 20 69 66 20 74 68 65 72 65 20 61 72 65   ** if there are
33f70 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73   fewer than NN s
33f80 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f  iblings on the o
33f90 74 68 65 72 20 73 69 64 65 2e 20 49 66 20 70 50  ther side. If pP
33fa0 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e  arent.  ** has N
33fb0 42 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64  B or fewer child
33fc0 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69  ren then all chi
33fd0 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74  ldren of pParent
33fe0 20 61 72 65 20 74 61 6b 65 6e 2e 20 20 0a 20 20   are taken.  .  
33ff0 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f  **.  ** This loo
34000 70 20 61 6c 73 6f 20 64 72 6f 70 73 20 74 68 65  p also drops the
34010 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66   divider cells f
34020 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70  rom the parent p
34030 61 67 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 77  age. This.  ** w
34040 61 79 2c 20 74 68 65 20 72 65 6d 61 69 6e 64 65  ay, the remainde
34050 72 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  r of the functio
34060 6e 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  n does not have 
34070 74 6f 20 64 65 61 6c 20 77 69 74 68 20 61 6e 79  to deal with any
34080 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 63  .  ** overflow c
34090 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 61 72 65  ells in the pare
340a0 6e 74 20 70 61 67 65 2c 20 73 69 6e 63 65 20 69  nt page, since i
340b0 66 20 61 6e 79 20 65 78 69 73 74 65 64 20 74 68  f any existed th
340c0 65 79 20 77 69 6c 6c 0a 20 20 2a 2a 20 68 61 76  ey will.  ** hav
340d0 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72  e already been r
340e0 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  emoved..  */.  i
340f0 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65   = pParent->nOve
34100 72 66 6c 6f 77 20 2b 20 70 50 61 72 65 6e 74 2d  rflow + pParent-
34110 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20 69 3c  >nCell;.  if( i<
34120 32 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d  2 ){.    nxDiv =
34130 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
34140 20 61 73 73 65 72 74 28 20 62 42 75 6c 6b 3d 3d   assert( bBulk==
34150 30 20 7c 7c 20 62 42 75 6c 6b 3d 3d 31 20 29 3b  0 || bBulk==1 );
34160 0a 20 20 20 20 69 66 28 20 69 50 61 72 65 6e 74  .    if( iParent
34170 49 64 78 3d 3d 30 20 29 7b 20 20 20 20 20 20 20  Idx==0 ){       
34180 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
34190 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 20 20   nxDiv = 0;.    
341a0 7d 65 6c 73 65 20 69 66 28 20 69 50 61 72 65 6e  }else if( iParen
341b0 74 49 64 78 3d 3d 69 20 29 7b 0a 20 20 20 20 20  tIdx==i ){.     
341c0 20 6e 78 44 69 76 20 3d 20 69 2d 32 2b 62 42 75   nxDiv = i-2+bBu
341d0 6c 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  lk;.    }else{. 
341e0 20 20 20 20 20 61 73 73 65 72 74 28 20 62 42 75       assert( bBu
341f0 6c 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e  lk==0 );.      n
34200 78 44 69 76 20 3d 20 69 50 61 72 65 6e 74 49 64  xDiv = iParentId
34210 78 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  x-1;.    }.    i
34220 20 3d 20 32 2d 62 42 75 6c 6b 3b 0a 20 20 7d 0a   = 2-bBulk;.  }.
34230 20 20 6e 4f 6c 64 20 3d 20 69 2b 31 3b 0a 20 20    nOld = i+1;.  
34240 69 66 28 20 28 69 2b 6e 78 44 69 76 2d 70 50 61  if( (i+nxDiv-pPa
34250 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29  rent->nOverflow)
34260 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
34270 20 29 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d   ){.    pRight =
34280 20 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61   &pParent->aData
34290 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
342a0 73 65 74 2b 38 5d 3b 0a 20 20 7d 65 6c 73 65 7b  set+8];.  }else{
342b0 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 66 69  .    pRight = fi
342c0 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
342d0 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d  i+nxDiv-pParent-
342e0 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 7d  >nOverflow);.  }
342f0 0a 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79  .  pgno = get4by
34300 74 65 28 70 52 69 67 68 74 29 3b 0a 20 20 77 68  te(pRight);.  wh
34310 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 72 63  ile( 1 ){.    rc
34320 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
34330 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 61 70  e(pBt, pgno, &ap
34340 4f 6c 64 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20  Old[i], 0);.    
34350 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
34360 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c  memset(apOld, 0,
34370 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65   (i+1)*sizeof(Me
34380 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20  mPage*));.      
34390 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
343a0 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  anup;.    }.    
343b0 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61  nMaxCells += 1+a
343c0 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61  pOld[i]->nCell+a
343d0 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c  pOld[i]->nOverfl
343e0 6f 77 3b 0a 20 20 20 20 69 66 28 20 28 69 2d 2d  ow;.    if( (i--
343f0 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20  )==0 ) break;.. 
34400 20 20 20 69 66 28 20 69 2b 6e 78 44 69 76 3d 3d     if( i+nxDiv==
34410 70 50 61 72 65 6e 74 2d 3e 61 69 4f 76 66 6c 5b  pParent->aiOvfl[
34420 30 5d 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e  0] && pParent->n
34430 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
34440 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 70 50 61    apDiv[i] = pPa
34450 72 65 6e 74 2d 3e 61 70 4f 76 66 6c 5b 30 5d 3b  rent->apOvfl[0];
34460 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  .      pgno = ge
34470 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29  t4byte(apDiv[i])
34480 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d  ;.      szNew[i]
34490 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
344a0 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d  Parent, apDiv[i]
344b0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
344c0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
344d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
344e0 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e    apDiv[i] = fin
344f0 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
34500 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e  +nxDiv-pParent->
34510 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20  nOverflow);.    
34520 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
34530 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  e(apDiv[i]);.   
34540 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65     szNew[i] = ce
34550 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e  llSizePtr(pParen
34560 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 0a 20  t, apDiv[i]);.. 
34570 20 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65       /* Drop the
34580 20 63 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20 70   cell from the p
34590 61 72 65 6e 74 20 70 61 67 65 2e 20 61 70 44 69  arent page. apDi
345a0 76 5b 69 5d 20 73 74 69 6c 6c 20 70 6f 69 6e 74  v[i] still point
345b0 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  s to.      ** th
345c0 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 74 68  e cell within th
345d0 65 20 70 61 72 65 6e 74 2c 20 65 76 65 6e 20 74  e parent, even t
345e0 68 6f 75 67 68 20 69 74 20 68 61 73 20 62 65 65  hough it has bee
345f0 6e 20 64 72 6f 70 70 65 64 2e 0a 20 20 20 20 20  n dropped..     
34600 20 2a 2a 20 54 68 69 73 20 69 73 20 73 61 66 65   ** This is safe
34610 20 62 65 63 61 75 73 65 20 64 72 6f 70 70 69 6e   because droppin
34620 67 20 61 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76  g a cell only ov
34630 65 72 77 72 69 74 65 73 20 74 68 65 20 66 69 72  erwrites the fir
34640 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72  st.      ** four
34650 20 62 79 74 65 73 20 6f 66 20 69 74 2c 20 61 6e   bytes of it, an
34660 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  d this function 
34670 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 68  does not need th
34680 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a  e first.      **
34690 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 74   four bytes of t
346a0 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e  he divider cell.
346b0 20 53 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20   So the pointer 
346c0 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 0a 20  is safe to use. 
346d0 20 20 20 20 20 2a 2a 20 6c 61 74 65 72 20 6f 6e       ** later on
346e0 2e 20 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  .  .      **.   
346f0 20 20 20 2a 2a 20 42 75 74 20 6e 6f 74 20 69 66     ** But not if
34700 20 77 65 20 61 72 65 20 69 6e 20 73 65 63 75 72   we are in secur
34710 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49  e-delete mode. I
34720 6e 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20  n secure-delete 
34730 6d 6f 64 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74  mode,.      ** t
34740 68 65 20 64 72 6f 70 43 65 6c 6c 28 29 20 72 6f  he dropCell() ro
34750 75 74 69 6e 65 20 77 69 6c 6c 20 6f 76 65 72 77  utine will overw
34760 72 69 74 65 20 74 68 65 20 65 6e 74 69 72 65 20  rite the entire 
34770 63 65 6c 6c 20 77 69 74 68 20 7a 65 72 6f 65 73  cell with zeroes
34780 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68  ..      ** In th
34790 69 73 20 63 61 73 65 2c 20 74 65 6d 70 6f 72 61  is case, tempora
347a0 72 69 6c 79 20 63 6f 70 79 20 74 68 65 20 63 65  rily copy the ce
347b0 6c 6c 20 69 6e 74 6f 20 74 68 65 20 61 4f 76 66  ll into the aOvf
347c0 6c 53 70 61 63 65 5b 5d 0a 20 20 20 20 20 20 2a  lSpace[].      *
347d0 2a 20 62 75 66 66 65 72 2e 20 49 74 20 77 69 6c  * buffer. It wil
347e0 6c 20 62 65 20 63 6f 70 69 65 64 20 6f 75 74 20  l be copied out 
347f0 61 67 61 69 6e 20 61 73 20 73 6f 6f 6e 20 61 73  again as soon as
34800 20 74 68 65 20 61 53 70 61 63 65 5b 5d 20 62 75   the aSpace[] bu
34810 66 66 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73  ffer.      ** is
34820 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 2a 2f 0a   allocated.  */.
34830 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62        if( pBt->b
34840 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
34850 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  CURE_DELETE ){. 
34860 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b         int iOff;
34870 0a 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d  ..        iOff =
34880 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49   SQLITE_PTR_TO_I
34890 4e 54 28 61 70 44 69 76 5b 69 5d 29 20 2d 20 53  NT(apDiv[i]) - S
348a0 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
348b0 28 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 29  (pParent->aData)
348c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 69  ;.        if( (i
348d0 4f 66 66 2b 73 7a 4e 65 77 5b 69 5d 29 3e 28 69  Off+szNew[i])>(i
348e0 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
348f0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
34900 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
34910 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
34920 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64      memset(apOld
34930 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f  , 0, (i+1)*sizeo
34940 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20  f(MemPage*));.  
34950 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c          goto bal
34960 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
34970 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
34980 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
34990 4f 76 66 6c 53 70 61 63 65 5b 69 4f 66 66 5d 2c  OvflSpace[iOff],
349a0 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 4e 65 77   apDiv[i], szNew
349b0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
349c0 61 70 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76 66  apDiv[i] = &aOvf
349d0 6c 53 70 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d  lSpace[apDiv[i]-
349e0 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d 3b  pParent->aData];
349f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34a00 20 7d 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c   }.      dropCel
34a10 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44  l(pParent, i+nxD
34a20 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  iv-pParent->nOve
34a30 72 66 6c 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d 2c  rflow, szNew[i],
34a40 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
34a50 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78  ..  /* Make nMax
34a60 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65  Cells a multiple
34a70 20 6f 66 20 34 20 69 6e 20 6f 72 64 65 72 20 74   of 4 in order t
34a80 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62 79 74  o preserve 8-byt
34a90 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74  e.  ** alignment
34aa0 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20   */.  nMaxCells 
34ab0 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33  = (nMaxCells + 3
34ac0 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  )&~3;..  /*.  **
34ad0 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
34ae0 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  for memory struc
34af0 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d  tures.  */.  k =
34b00 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b   pBt->pageSize +
34b10 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d   ROUND8(sizeof(M
34b20 65 6d 50 61 67 65 29 29 3b 0a 20 20 73 7a 53 63  emPage));.  szSc
34b30 72 61 74 63 68 20 3d 0a 20 20 20 20 20 20 20 6e  ratch =.       n
34b40 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28  MaxCells*sizeof(
34b50 75 38 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  u8*)            
34b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70             /* ap
34b70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e  Cell */.     + n
34b80 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28  MaxCells*sizeof(
34b90 75 31 36 29 20 20 20 20 20 20 20 20 20 20 20 20  u16)            
34ba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a             /* sz
34bb0 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 70  Cell */.     + p
34bc0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 20 20 20  Bt->pageSize    
34bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34be0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53             /* aS
34bf0 70 61 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20  pace1 */.     + 
34c00 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20  k*nOld;         
34c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
34c30 61 67 65 20 63 6f 70 69 65 73 20 28 61 70 43 6f  age copies (apCo
34c40 70 79 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20  py) */.  apCell 
34c50 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68  = sqlite3Scratch
34c60 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74 63  Malloc( szScratc
34c70 68 20 29 3b 20 0a 20 20 69 66 28 20 61 70 43 65  h ); .  if( apCe
34c80 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ll==0 ){.    rc 
34c90 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
34ca0 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
34cb0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
34cc0 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26  szCell = (u16*)&
34cd0 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73  apCell[nMaxCells
34ce0 5d 3b 0a 20 20 61 53 70 61 63 65 31 20 3d 20 28  ];.  aSpace1 = (
34cf0 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78  u8*)&szCell[nMax
34d00 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74  Cells];.  assert
34d10 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
34d20 47 4e 4d 45 4e 54 28 61 53 70 61 63 65 31 29 20  GNMENT(aSpace1) 
34d30 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f  );..  /*.  ** Lo
34d40 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  ad pointers to a
34d50 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c  ll cells on sibl
34d60 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74 68  ing pages and th
34d70 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
34d80 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f    ** into the lo
34d90 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72  cal apCell[] arr
34da0 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73  ay.  Make copies
34db0 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
34dc0 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20  cells.  ** into 
34dd0 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
34de0 72 6f 6d 20 61 53 70 61 63 65 31 5b 5d 20 61 6e  rom aSpace1[] an
34df0 64 20 72 65 6d 6f 76 65 20 74 68 65 20 64 69 76  d remove the div
34e00 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  ider cells.  ** 
34e10 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20  from pParent..  
34e20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73  **.  ** If the s
34e30 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c  iblings are on l
34e40 65 61 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20  eaf pages, then 
34e50 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  the child pointe
34e60 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64  rs of the.  ** d
34e70 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65  ivider cells are
34e80 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74   stripped from t
34e90 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20  he cells before 
34ea0 74 68 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a  they are copied.
34eb0 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65    ** into aSpace
34ec0 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61  1[].  In this wa
34ed0 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  y, all cells in 
34ee0 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74  apCell[] are wit
34ef0 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20  hout.  ** child 
34f00 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69  pointers.  If si
34f10 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c  blings are not l
34f20 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20  eaves, then all 
34f30 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43  cell in.  ** apC
34f40 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68  ell[] include ch
34f50 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45  ild pointers.  E
34f60 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63  ither way, all c
34f70 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
34f80 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e  .  ** are alike.
34f90 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43  .  **.  ** leafC
34fa0 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66  orrection:  4 if
34fb0 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
34fc0 2e 20 20 30 20 69 66 20 70 50 61 67 65 20 69 73  .  0 if pPage is
34fd0 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a   not a leaf..  *
34fe0 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61 74 61  *       leafData
34ff0 3a 20 20 31 20 69 66 20 70 50 61 67 65 20 68 6f  :  1 if pPage ho
35000 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64  lds key+data and
35010 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f   pParent holds o
35020 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20  nly keys..  */. 
35030 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20   leafCorrection 
35040 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65 61 66  = apOld[0]->leaf
35050 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d  *4;.  leafData =
35060 20 61 70 4f 6c 64 5b 30 5d 2d 3e 68 61 73 44 61   apOld[0]->hasDa
35070 74 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ta;.  for(i=0; i
35080 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nOld; i++){.   
35090 20 69 6e 74 20 6c 69 6d 69 74 3b 0a 20 20 20 20   int limit;.    
350a0 0a 20 20 20 20 2f 2a 20 42 65 66 6f 72 65 20 64  .    /* Before d
350b0 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c  oing anything el
350c0 73 65 2c 20 74 61 6b 65 20 61 20 63 6f 70 79 20  se, take a copy 
350d0 6f 66 20 74 68 65 20 69 27 74 68 20 6f 72 69 67  of the i'th orig
350e0 69 6e 61 6c 20 73 69 62 6c 69 6e 67 0a 20 20 20  inal sibling.   
350f0 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20   ** The rest of 
35100 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
35110 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d  ll use data from
35120 20 74 68 65 20 63 6f 70 69 65 73 20 72 61 74 68   the copies rath
35130 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74  er.    ** that t
35140 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
35150 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67  s since the orig
35160 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20  inal pages will 
35170 62 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a  be in the.    **
35180 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e   process of bein
35190 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20  g overwritten.  
351a0 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
351b0 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d  pOld = apCopy[i]
351c0 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26 61 53   = (MemPage*)&aS
351d0 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65 53  pace1[pBt->pageS
351e0 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20 20 20  ize + k*i];.    
351f0 6d 65 6d 63 70 79 28 70 4f 6c 64 2c 20 61 70 4f  memcpy(pOld, apO
35200 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65  ld[i], sizeof(Me
35210 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 70 4f 6c  mPage));.    pOl
35220 64 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f 69 64  d->aData = (void
35230 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20 20 20  *)&pOld[1];.    
35240 6d 65 6d 63 70 79 28 70 4f 6c 64 2d 3e 61 44 61  memcpy(pOld->aDa
35250 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44  ta, apOld[i]->aD
35260 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 53 69  ata, pBt->pageSi
35270 7a 65 29 3b 0a 0a 20 20 20 20 6c 69 6d 69 74 20  ze);..    limit 
35280 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f  = pOld->nCell+pO
35290 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ld->nOverflow;. 
352a0 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76     if( pOld->nOv
352b0 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20  erflow>0 ){.    
352c0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d    for(j=0; j<lim
352d0 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  it; j++){.      
352e0 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c    assert( nCell<
352f0 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
35300 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
35310 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f  l] = findOverflo
35320 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a  wCell(pOld, j);.
35330 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
35340 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  Cell] = cellSize
35350 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c  Ptr(pOld, apCell
35360 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20  [nCell]);.      
35370 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20    nCell++;.     
35380 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
35390 20 20 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20      u8 *aData = 
353a0 70 4f 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20 20  pOld->aData;.   
353b0 20 20 20 75 31 36 20 6d 61 73 6b 50 61 67 65 20     u16 maskPage 
353c0 3d 20 70 4f 6c 64 2d 3e 6d 61 73 6b 50 61 67 65  = pOld->maskPage
353d0 3b 0a 20 20 20 20 20 20 75 31 36 20 63 65 6c 6c  ;.      u16 cell
353e0 4f 66 66 73 65 74 20 3d 20 70 4f 6c 64 2d 3e 63  Offset = pOld->c
353f0 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ellOffset;.     
35400 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69   for(j=0; j<limi
35410 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t; j++){.       
35420 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e   assert( nCell<n
35430 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
35440 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c      apCell[nCell
35450 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 76 32 28 61  ] = findCellv2(a
35460 44 61 74 61 2c 20 6d 61 73 6b 50 61 67 65 2c 20  Data, maskPage, 
35470 63 65 6c 6c 4f 66 66 73 65 74 2c 20 6a 29 3b 0a  cellOffset, j);.
35480 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
35490 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  Cell] = cellSize
354a0 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c  Ptr(pOld, apCell
354b0 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20  [nCell]);.      
354c0 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20    nCell++;.     
354d0 20 7d 0a 20 20 20 20 7d 20 20 20 20 20 20 20 0a   }.    }       .
354e0 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31      if( i<nOld-1
354f0 20 26 26 20 21 6c 65 61 66 44 61 74 61 29 7b 0a   && !leafData){.
35500 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20 28        u16 sz = (
35510 75 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20  u16)szNew[i];.  
35520 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20      u8 *pTemp;. 
35530 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
35540 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a  ll<nMaxCells );.
35550 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
35560 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ll] = sz;.      
35570 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 31  pTemp = &aSpace1
35580 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20 20  [iSpace1];.     
35590 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a   iSpace1 += sz;.
355a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a        assert( sz
355b0 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  <=pBt->maxLocal+
355c0 32 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  23 );.      asse
355d0 72 74 28 20 69 53 70 61 63 65 31 20 3c 3d 20 28  rt( iSpace1 <= (
355e0 69 6e 74 29 70 42 74 2d 3e 70 61 67 65 53 69 7a  int)pBt->pageSiz
355f0 65 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  e );.      memcp
35600 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69  y(pTemp, apDiv[i
35610 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 61 70  ], sz);.      ap
35620 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54  Cell[nCell] = pT
35630 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74 69  emp+leafCorrecti
35640 6f 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  on;.      assert
35650 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
35660 3d 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72 65  ==0 || leafCorre
35670 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20  ction==4 );.    
35680 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
35690 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20  = szCell[nCell] 
356a0 2d 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  - leafCorrection
356b0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c  ;.      if( !pOl
356c0 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  d->leaf ){.     
356d0 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
356e0 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a  orrection==0 );.
356f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
35700 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 3d  pOld->hdrOffset=
35710 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 );.        /*
35720 20 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74   The right point
35730 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  er of the child 
35740 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65  page pOld become
35750 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20  s the left.     
35760 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66     ** pointer of
35770 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
35780 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d  l */.        mem
35790 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  cpy(apCell[nCell
357a0 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b  ], &pOld->aData[
357b0 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65  8], 4);.      }e
357c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
357d0 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
357e0 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ion==4 );.      
357f0 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65    if( szCell[nCe
35800 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20  ll]<4 ){.       
35810 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c     /* Do not all
35820 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61  ow any cells sma
35830 6c 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74 65  ller than 4 byte
35840 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
35850 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
35860 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  4;.        }.   
35870 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c 6c     }.      nCell
35880 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ++;.    }.  }.. 
35890 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20   /*.  ** Figure 
358a0 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  out the number o
358b0 66 20 70 61 67 65 73 20 6e 65 65 64 65 64 20 74  f pages needed t
358c0 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c  o hold all nCell
358d0 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f   cells..  ** Sto
358e0 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69  re this number i
358f0 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d  n "k".  Also com
35900 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69  pute szNew[] whi
35910 63 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a  ch is the total.
35920 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c    ** size of all
35930 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d   cells on the i-
35940 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e  th page and cntN
35950 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68  ew[] which is th
35960 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20  e index.  ** in 
35970 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20  apCell[] of the 
35980 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65  cell that divide
35990 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61  s page i from pa
359a0 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63  ge i+1.  .  ** c
359b0 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20  ntNew[k] should 
359c0 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a  equal nCell..  *
359d0 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f  *.  ** Values co
359e0 6d 70 75 74 65 64 20 62 79 20 74 68 69 73 20 62  mputed by this b
359f0 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lock:.  **.  ** 
35a00 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65            k: The
35a10 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
35a20 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20   sibling pages. 
35a30 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a   **    szNew[i]:
35a40 20 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20   Spaced used on 
35a50 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67  the i-th sibling
35a60 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e   page..  **   cn
35a70 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69  tNew[i]: Index i
35a80 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73  n apCell[] and s
35a90 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20  zCell[] for the 
35aa0 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20  first cell to.  
35ab0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
35ac0 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65  the right of the
35ad0 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61   i-th sibling pa
35ae0 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53  ge..  ** usableS
35af0 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20  pace: Number of 
35b00 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
35b10 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68  vailable on each
35b20 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a   sibling..  ** .
35b30 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61    */.  usableSpa
35b40 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ce = pBt->usable
35b50 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66  Size - 12 + leaf
35b60 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f  Correction;.  fo
35b70 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30  r(subtotal=k=i=0
35b80 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
35b90 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e  .    assert( i<n
35ba0 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
35bb0 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65  subtotal += szCe
35bc0 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69  ll[i] + 2;.    i
35bd0 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73  f( subtotal > us
35be0 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20  ableSpace ){.   
35bf0 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75     szNew[k] = su
35c00 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b  btotal - szCell[
35c10 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77  i];.      cntNew
35c20 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69  [k] = i;.      i
35c30 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69  f( leafData ){ i
35c40 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74  --; }.      subt
35c50 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  otal = 0;.      
35c60 6b 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 6b  k++;.      if( k
35c70 3e 4e 42 2b 31 20 29 7b 20 72 63 20 3d 20 53 51  >NB+1 ){ rc = SQ
35c80 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
35c90 54 3b 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f  T; goto balance_
35ca0 63 6c 65 61 6e 75 70 3b 20 7d 0a 20 20 20 20 7d  cleanup; }.    }
35cb0 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20  .  }.  szNew[k] 
35cc0 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e  = subtotal;.  cn
35cd0 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b  tNew[k] = nCell;
35ce0 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20  .  k++;..  /*.  
35cf0 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63  ** The packing c
35d00 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 70  omputed by the p
35d10 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73  revious block is
35d20 20 62 69 61 73 65 64 20 74 6f 77 61 72 64 20 74   biased toward t
35d30 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a  he siblings.  **
35d40 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64   on the left sid
35d50 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69 62  e.  The left sib
35d60 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73  lings are always
35d70 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68   nearly full, wh
35d80 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67  ile the.  ** rig
35d90 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20  ht-most sibling 
35da0 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20  might be nearly 
35db0 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f  empty.  This blo
35dc0 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d  ck of code attem
35dd0 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75  pts.  ** to adju
35de0 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f  st the packing o
35df0 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65  f siblings to ge
35e00 74 20 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e  t a better balan
35e10 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ce..  **.  ** Th
35e20 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73  is adjustment is
35e30 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70   more than an op
35e40 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65  timization.  The
35e50 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d   packing above m
35e60 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20  ight.  ** be so 
35e70 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61  out of balance a
35e80 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e  s to be illegal.
35e90 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74    For example, t
35ea0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20  he right-most.  
35eb0 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74  ** sibling might
35ec0 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   be completely e
35ed0 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75  mpty.  This adju
35ee0 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70  stment is not op
35ef0 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66  tional..  */.  f
35f00 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69  or(i=k-1; i>0; i
35f10 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52  --){.    int szR
35f20 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b  ight = szNew[i];
35f30 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62    /* Size of sib
35f40 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68  ling on the righ
35f50 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c  t */.    int szL
35f60 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d  eft = szNew[i-1]
35f70 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62  ; /* Size of sib
35f80 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74  ling on the left
35f90 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20   */.    int r;  
35fa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
35fb0 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f  ndex of right-mo
35fc0 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20  st cell in left 
35fd0 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69  sibling */.    i
35fe0 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20 20 20  nt d;           
35ff0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
36000 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65  irst cell to the
36010 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20 73   left of right s
36020 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72  ibling */..    r
36030 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d   = cntNew[i-1] -
36040 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20   1;.    d = r + 
36050 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20  1 - leafData;.  
36060 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78    assert( d<nMax
36070 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73  Cells );.    ass
36080 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73  ert( r<nMaxCells
36090 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73   );.    while( s
360a0 7a 52 69 67 68 74 3d 3d 30 20 0a 20 20 20 20 20  zRight==0 .     
360b0 20 20 7c 7c 20 28 21 62 42 75 6c 6b 20 26 26 20    || (!bBulk && 
360c0 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64  szRight+szCell[d
360d0 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43  ]+2<=szLeft-(szC
360e0 65 6c 6c 5b 72 5d 2b 32 29 29 20 0a 20 20 20 20  ell[r]+2)) .    
360f0 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74  ){.      szRight
36100 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20   += szCell[d] + 
36110 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20  2;.      szLeft 
36120 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32  -= szCell[r] + 2
36130 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69  ;.      cntNew[i
36140 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d  -1]--;.      r =
36150 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31   cntNew[i-1] - 1
36160 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20  ;.      d = r + 
36170 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20  1 - leafData;.  
36180 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d    }.    szNew[i]
36190 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20   = szRight;.    
361a0 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c  szNew[i-1] = szL
361b0 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45  eft;.  }..  /* E
361c0 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f  ither we found o
361d0 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73  ne or more cells
361e0 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20   (cntnew[0])>0) 
361f0 6f 72 20 70 50 61 67 65 20 69 73 0a 20 20 2a 2a  or pPage is.  **
36200 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   a virtual root 
36210 70 61 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c  page.  A virtual
36220 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68   root page is wh
36230 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74  en the real root
36240 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61  .  ** page is pa
36250 67 65 20 31 20 61 6e 64 20 77 65 20 61 72 65 20  ge 1 and we are 
36260 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f  the only child o
36270 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a  f that page..  *
36280 2a 0a 20 20 2a 2a 20 55 50 44 41 54 45 3a 20 20  *.  ** UPDATE:  
36290 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65 6c  The assert() bel
362a0 6f 77 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  ow is not necess
362b0 61 72 69 6c 79 20 74 72 75 65 20 69 66 20 74 68  arily true if th
362c0 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
362d0 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2e  file is corrupt.
362e0 20 20 54 68 65 20 63 6f 72 72 75 70 74 69 6f 6e    The corruption
362f0 20 77 69 6c 6c 20 62 65 20 64 65 74 65 63 74 65   will be detecte
36300 64 20 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c  d and reported l
36310 61 74 65 72 0a 20 20 2a 2a 20 69 6e 20 74 68 69  ater.  ** in thi
36320 73 20 70 72 6f 63 65 64 75 72 65 20 73 6f 20 74  s procedure so t
36330 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
36340 74 6f 20 61 63 74 20 75 70 6f 6e 20 69 74 20 6e  to act upon it n
36350 6f 77 2e 0a 20 20 2a 2f 0a 23 69 66 20 30 0a 20  ow..  */.#if 0. 
36360 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b   assert( cntNew[
36370 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e 74  0]>0 || (pParent
36380 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61  ->pgno==1 && pPa
36390 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20  rent->nCell==0) 
363a0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 54 52 41  );.#endif..  TRA
363b0 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c  CE(("BALANCE: ol
363c0 64 3a 20 25 64 20 25 64 20 25 64 20 20 22 2c 0a  d: %d %d %d  ",.
363d0 20 20 20 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67      apOld[0]->pg
363e0 6e 6f 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32  no, .    nOld>=2
363f0 20 3f 20 61 70 4f 6c 64 5b 31 5d 2d 3e 70 67 6e   ? apOld[1]->pgn
36400 6f 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e  o : 0,.    nOld>
36410 3d 33 20 3f 20 61 70 4f 6c 64 5b 32 5d 2d 3e 70  =3 ? apOld[2]->p
36420 67 6e 6f 20 3a 20 30 0a 20 20 29 29 3b 0a 0a 20  gno : 0.  ));.. 
36430 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74   /*.  ** Allocat
36440 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20  e k new pages.  
36450 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20  Reuse old pages 
36460 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a  where possible..
36470 20 20 2a 2f 0a 20 20 69 66 28 20 61 70 4f 6c 64    */.  if( apOld
36480 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d 31 20 29 7b 0a  [0]->pgno<=1 ){.
36490 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
364a0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
364b0 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
364c0 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 70 61  leanup;.  }.  pa
364d0 67 65 46 6c 61 67 73 20 3d 20 61 70 4f 6c 64 5b  geFlags = apOld[
364e0 30 5d 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20  0]->aData[0];.  
364f0 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b  for(i=0; i<k; i+
36500 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  +){.    MemPage 
36510 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69  *pNew;.    if( i
36520 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  <nOld ){.      p
36530 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d  New = apNew[i] =
36540 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20   apOld[i];.     
36550 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20   apOld[i] = 0;. 
36560 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
36570 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
36580 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
36590 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20    nNew++;.      
365a0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
365b0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
365c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
365d0 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20  assert( i>0 );. 
365e0 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
365f0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
36600 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 2c 20 28   &pNew, &pgno, (
36610 62 42 75 6c 6b 20 3f 20 31 20 3a 20 70 67 6e 6f  bBulk ? 1 : pgno
36620 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ), 0);.      if(
36630 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
36640 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
36650 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65    apNew[i] = pNe
36660 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b  w;.      nNew++;
36670 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  ..      /* Set t
36680 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
36690 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77  ntry for the new
366a0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a   sibling page. *
366b0 2f 0a 20 20 20 20 20 20 69 66 28 20 49 53 41 55  /.      if( ISAU
366c0 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
366d0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
366e0 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50  t, pNew->pgno, P
366f0 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61  TRMAP_BTREE, pPa
36700 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29  rent->pgno, &rc)
36710 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
36720 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
36730 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61           goto ba
36740 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
36750 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
36760 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
36770 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61   Free any old pa
36780 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f  ges that were no
36790 74 20 72 65 75 73 65 64 20 61 73 20 6e 65 77 20  t reused as new 
367a0 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68  pages..  */.  wh
367b0 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20  ile( i<nOld ){. 
367c0 20 20 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c     freePage(apOl
367d0 64 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20  d[i], &rc);.    
367e0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
367f0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
36800 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
36810 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70  pOld[i]);.    ap
36820 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Old[i] = 0;.    
36830 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  i++;.  }..  /*. 
36840 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20   ** Put the new 
36850 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69  pages in accendi
36860 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20  ng order.  This 
36870 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65  helps to.  ** ke
36880 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ep entries in th
36890 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f  e disk file in o
368a0 72 64 65 72 20 73 6f 20 74 68 61 74 20 61 20 73  rder so that a s
368b0 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  can.  ** of the 
368c0 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61  table is a linea
368d0 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74  r scan through t
368e0 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20  he file.  That. 
368f0 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70   ** in turn help
36900 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  s the operating 
36910 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65  system to delive
36920 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f  r pages.  ** fro
36930 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20  m the disk more 
36940 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20  rapidly..  **.  
36950 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73  ** An O(n^2) ins
36960 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f  ertion sort algo
36970 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62  rithm is used, b
36980 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20  ut since.  ** n 
36990 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68  is never more th
369a0 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63  an NB (a small c
369b0 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73  onstant), that s
369c0 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62  hould.  ** not b
369d0 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a  e a problem..  *
369e0 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d  *.  ** When NB==
369f0 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69  3, this one opti
36a00 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74  mization makes t
36a10 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
36a20 20 61 62 6f 75 74 20 32 35 25 20 66 61 73 74 65   about 25% faste
36a30 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65  r for large inse
36a40 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74  rtions and delet
36a50 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ions..  */.  for
36a60 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b  (i=0; i<k-1; i++
36a70 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20  ){.    int minV 
36a80 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f  = apNew[i]->pgno
36a90 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d  ;.    int minI =
36aa0 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b   i;.    for(j=i+
36ab0 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20  1; j<k; j++){.  
36ac0 20 20 20 20 69 66 28 20 61 70 4e 65 77 5b 6a 5d      if( apNew[j]
36ad0 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69 67 6e 65 64  ->pgno<(unsigned
36ae0 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20  )minV ){.       
36af0 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20   minI = j;.     
36b00 20 20 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b     minV = apNew[
36b10 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20  j]->pgno;.      
36b20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
36b30 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20  minI>i ){.      
36b40 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20  MemPage *pT;.   
36b50 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d     pT = apNew[i]
36b60 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d  ;.      apNew[i]
36b70 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a   = apNew[minI];.
36b80 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49        apNew[minI
36b90 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20  ] = pT;.    }.  
36ba0 7d 0a 20 20 54 52 41 43 45 28 28 22 6e 65 77 3a  }.  TRACE(("new:
36bb0 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
36bc0 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
36bd0 25 64 29 5c 6e 22 2c 0a 20 20 20 20 61 70 4e 65  %d)\n",.    apNe
36be0 77 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e 65  w[0]->pgno, szNe
36bf0 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d  w[0],.    nNew>=
36c00 32 20 3f 20 61 70 4e 65 77 5b 31 5d 2d 3e 70 67  2 ? apNew[1]->pg
36c10 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20  no : 0, nNew>=2 
36c20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a  ? szNew[1] : 0,.
36c30 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 61 70      nNew>=3 ? ap
36c40 4e 65 77 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30  New[2]->pgno : 0
36c50 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65  , nNew>=3 ? szNe
36c60 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[2] : 0,.    nN
36c70 65 77 3e 3d 34 20 3f 20 61 70 4e 65 77 5b 33 5d  ew>=4 ? apNew[3]
36c80 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77  ->pgno : 0, nNew
36c90 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a  >=4 ? szNew[3] :
36ca0 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20   0,.    nNew>=5 
36cb0 3f 20 61 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e 6f  ? apNew[4]->pgno
36cc0 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20   : 0, nNew>=5 ? 
36cd0 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a  szNew[4] : 0));.
36ce0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
36cf0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
36d00 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
36d10 61 67 65 29 20 29 3b 0a 20 20 70 75 74 34 62 79  age) );.  put4by
36d20 74 65 28 70 52 69 67 68 74 2c 20 61 70 4e 65 77  te(pRight, apNew
36d30 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b  [nNew-1]->pgno);
36d40 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e  ..  /*.  ** Even
36d50 6c 79 20 64 69 73 74 72 69 62 75 74 65 20 74 68  ly distribute th
36d60 65 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c  e data in apCell
36d70 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65  [] across the ne
36d80 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e  w pages..  ** In
36d90 73 65 72 74 20 64 69 76 69 64 65 72 20 63 65 6c  sert divider cel
36da0 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20  ls into pParent 
36db0 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  as necessary..  
36dc0 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f  */.  j = 0;.  fo
36dd0 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69  r(i=0; i<nNew; i
36de0 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65  ++){.    /* Asse
36df0 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62  mble the new sib
36e00 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20  ling page. */.  
36e10 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20    MemPage *pNew 
36e20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  = apNew[i];.    
36e30 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65  assert( j<nMaxCe
36e40 6c 6c 73 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50  lls );.    zeroP
36e50 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46 6c  age(pNew, pageFl
36e60 61 67 73 29 3b 0a 20 20 20 20 61 73 73 65 6d 62  ags);.    assemb
36e70 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74  lePage(pNew, cnt
36e80 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c  New[i]-j, &apCel
36e90 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d  l[j], &szCell[j]
36ea0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
36eb0 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20  New->nCell>0 || 
36ec0 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e  (nNew==1 && cntN
36ed0 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20  ew[0]==0) );.   
36ee0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
36ef0 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a  Overflow==0 );..
36f00 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69      j = cntNew[i
36f10 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  ];..    /* If th
36f20 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61  e sibling page a
36f30 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77  ssembled above w
36f40 61 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  as not the right
36f50 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20  -most sibling,. 
36f60 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64     ** insert a d
36f70 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f  ivider cell into
36f80 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
36f90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
36fa0 65 72 74 28 20 69 3c 6e 4e 65 77 2d 31 20 7c 7c  ert( i<nNew-1 ||
36fb0 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 20   j==nCell );.   
36fc0 20 69 66 28 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a   if( j<nCell ){.
36fd0 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b        u8 *pCell;
36fe0 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70  .      u8 *pTemp
36ff0 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a  ;.      int sz;.
37000 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
37010 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
37020 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43 65      pCell = apCe
37030 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20  ll[j];.      sz 
37040 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65  = szCell[j] + le
37050 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
37060 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 4f 76      pTemp = &aOv
37070 66 6c 53 70 61 63 65 5b 69 4f 76 66 6c 53 70 61  flSpace[iOvflSpa
37080 63 65 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ce];.      if( !
37090 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  pNew->leaf ){.  
370a0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
370b0 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43  ew->aData[8], pC
370c0 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d  ell, 4);.      }
370d0 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61 74  else if( leafDat
370e0 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  a ){.        /* 
370f0 49 66 20 74 68 65 20 74 72 65 65 20 69 73 20 61  If the tree is a
37100 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c   leaf-data tree,
37110 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67   and the sibling
37120 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a 20  s are leaves, . 
37130 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74         ** then t
37140 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69 64  here is no divid
37150 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c  er cell in apCel
37160 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68  l[]. Instead, th
37170 65 20 64 69 76 69 64 65 72 20 0a 20 20 20 20 20  e divider .     
37180 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69     ** cell consi
37190 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67  sts of the integ
371a0 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72  er key for the r
371b0 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f  ight-most cell o
371c0 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  f .        ** th
371d0 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20 61  e sibling-page a
371e0 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f  ssembled above o
371f0 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  nly..        */.
37200 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f          CellInfo
37210 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a   info;.        j
37220 2d 2d 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65  --;.        btre
37230 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e  eParseCellPtr(pN
37240 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26  ew, apCell[j], &
37250 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  info);.        p
37260 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20  Cell = pTemp;.  
37270 20 20 20 20 20 20 73 7a 20 3d 20 34 20 2b 20 70        sz = 4 + p
37280 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
37290 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a  4], info.nKey);.
372a0 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20          pTemp = 
372b0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
372c0 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d          pCell -=
372d0 20 34 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   4;.        /* O
372e0 62 73 63 75 72 65 20 63 61 73 65 20 66 6f 72 20  bscure case for 
372f0 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74 72  non-leaf-data tr
37300 65 65 73 3a 20 49 66 20 74 68 65 20 63 65 6c 6c  ees: If the cell
37310 20 61 74 20 70 43 65 6c 6c 20 77 61 73 0a 20 20   at pCell was.  
37320 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
37330 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 61 20  sly stored on a 
37340 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69  leaf node, and i
37350 74 73 20 72 65 70 6f 72 74 65 64 20 73 69 7a 65  ts reported size
37360 20 77 61 73 20 34 0a 20 20 20 20 20 20 20 20 2a   was 4.        *
37370 2a 20 62 79 74 65 73 2c 20 74 68 65 6e 20 69 74  * bytes, then it
37380 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62 65   may actually be
37390 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
373a0 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28  is .        ** (
373b0 73 65 65 20 62 74 72 65 65 50 61 72 73 65 43 65  see btreeParseCe
373c0 6c 6c 50 74 72 28 29 2c 20 34 20 62 79 74 65 73  llPtr(), 4 bytes
373d0 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20   is the minimum 
373e0 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 20 20  size of.        
373f0 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75  ** any cell). Bu
37400 74 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  t it is importan
37410 74 20 74 6f 20 70 61 73 73 20 74 68 65 20 63 6f  t to pass the co
37420 72 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a 20  rrect size to . 
37430 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74         ** insert
37440 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61 72  Cell(), so repar
37450 73 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e  se the cell now.
37460 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
37470 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
37480 20 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72 20   this can never 
37490 68 61 70 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c  happen in an SQL
374a0 69 74 65 20 64 61 74 61 20 66 69 6c 65 2c 20 61  ite data file, a
374b0 73 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a  s all.        **
374c0 20 63 65 6c 6c 73 20 61 72 65 20 61 74 20 6c 65   cells are at le
374d0 61 73 74 20 34 20 62 79 74 65 73 2e 20 49 74 20  ast 4 bytes. It 
374e0 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 6e 20  only happens in 
374f0 62 2d 74 72 65 65 73 20 75 73 65 64 0a 20 20 20  b-trees used.   
37500 20 20 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75       ** to evalu
37510 61 74 65 20 22 49 4e 20 28 53 45 4c 45 43 54 20  ate "IN (SELECT 
37520 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c 61  ...)" and simila
37530 72 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20  r clauses..     
37540 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
37550 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29  ( szCell[j]==4 )
37560 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
37570 72 74 28 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  rt(leafCorrectio
37580 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20 20 20  n==4);.         
37590 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74   sz = cellSizePt
375a0 72 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c  r(pParent, pCell
375b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
375c0 20 20 20 7d 0a 20 20 20 20 20 20 69 4f 76 66 6c     }.      iOvfl
375d0 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20  Space += sz;.   
375e0 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70     assert( sz<=p
375f0 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33 20  Bt->maxLocal+23 
37600 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
37610 20 69 4f 76 66 6c 53 70 61 63 65 20 3c 3d 20 28   iOvflSpace <= (
37620 69 6e 74 29 70 42 74 2d 3e 70 61 67 65 53 69 7a  int)pBt->pageSiz
37630 65 20 29 3b 0a 20 20 20 20 20 20 69 6e 73 65 72  e );.      inser
37640 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e  tCell(pParent, n
37650 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c  xDiv, pCell, sz,
37660 20 70 54 65 6d 70 2c 20 70 4e 65 77 2d 3e 70 67   pTemp, pNew->pg
37670 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  no, &rc);.      
37680 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
37690 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  K ) goto balance
376a0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
376b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
376c0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
376d0 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
376e0 29 20 29 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b  ) );..      j++;
376f0 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a  .      nxDiv++;.
37700 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
37710 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a  rt( j==nCell );.
37720 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30    assert( nOld>0
37730 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e   );.  assert( nN
37740 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70  ew>0 );.  if( (p
37750 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c  ageFlags & PTF_L
37760 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75  EAF)==0 ){.    u
37770 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70 43  8 *zChild = &apC
37780 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61  opy[nOld-1]->aDa
37790 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  ta[8];.    memcp
377a0 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d  y(&apNew[nNew-1]
377b0 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69  ->aData[8], zChi
377c0 6c 64 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 69  ld, 4);.  }..  i
377d0 66 28 20 69 73 52 6f 6f 74 20 26 26 20 70 50 61  f( isRoot && pPa
377e0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26  rent->nCell==0 &
377f0 26 20 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  & pParent->hdrOf
37800 66 73 65 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e  fset<=apNew[0]->
37810 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 2f 2a 20  nFree ){.    /* 
37820 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  The root page of
37830 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 77 20   the b-tree now 
37840 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c  contains no cell
37850 73 2e 20 54 68 65 20 6f 6e 6c 79 20 73 69 62 6c  s. The only sibl
37860 69 6e 67 0a 20 20 20 20 2a 2a 20 70 61 67 65 20  ing.    ** page 
37870 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  is the right-chi
37880 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ld of the parent
37890 2e 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65  . Copy the conte
378a0 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  nts of the.    *
378b0 2a 20 63 68 69 6c 64 20 70 61 67 65 20 69 6e 74  * child page int
378c0 6f 20 74 68 65 20 70 61 72 65 6e 74 2c 20 64 65  o the parent, de
378d0 63 72 65 61 73 69 6e 67 20 74 68 65 20 6f 76 65  creasing the ove
378e0 72 61 6c 6c 20 68 65 69 67 68 74 20 6f 66 20 74  rall height of t
378f0 68 65 0a 20 20 20 20 2a 2a 20 62 2d 74 72 65 65  he.    ** b-tree
37900 20 73 74 72 75 63 74 75 72 65 20 62 79 20 6f 6e   structure by on
37910 65 2e 20 54 68 69 73 20 69 73 20 64 65 73 63 72  e. This is descr
37920 69 62 65 64 20 61 73 20 74 68 65 20 22 62 61 6c  ibed as the "bal
37930 61 6e 63 65 2d 73 68 61 6c 6c 6f 77 65 72 22 0a  ance-shallower".
37940 20 20 20 20 2a 2a 20 73 75 62 2d 61 6c 67 6f 72      ** sub-algor
37950 69 74 68 6d 20 69 6e 20 73 6f 6d 65 20 64 6f 63  ithm in some doc
37960 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20  umentation..    
37970 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69  **.    ** If thi
37980 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
37990 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 74 68  uum database, th
379a0 65 20 63 61 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f  e call to copyNo
379b0 64 65 43 6f 6e 74 65 6e 74 28 29 20 0a 20 20 20  deContent() .   
379c0 20 2a 2a 20 73 65 74 73 20 61 6c 6c 20 70 6f 69   ** sets all poi
379d0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
379e0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
379f0 6f 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  o database image
37a00 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 66   pages .    ** f
37a10 6f 72 20 77 68 69 63 68 20 74 68 65 20 70 6f 69  or which the poi
37a20 6e 74 65 72 20 69 73 20 73 74 6f 72 65 64 20 77  nter is stored w
37a30 69 74 68 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ithin the conten
37a40 74 20 62 65 69 6e 67 20 63 6f 70 69 65 64 2e 0a  t being copied..
37a50 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
37a60 65 20 73 65 63 6f 6e 64 20 61 73 73 65 72 74 20  e second assert 
37a70 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74  below verifies t
37a80 68 61 74 20 74 68 65 20 63 68 69 6c 64 20 70 61  hat the child pa
37a90 67 65 20 69 73 20 64 65 66 72 61 67 6d 65 6e 74  ge is defragment
37aa0 65 64 0a 20 20 20 20 2a 2a 20 28 69 74 20 6d 75  ed.    ** (it mu
37ab0 73 74 20 62 65 2c 20 61 73 20 69 74 20 77 61 73  st be, as it was
37ac0 20 6a 75 73 74 20 72 65 63 6f 6e 73 74 72 75 63   just reconstruc
37ad0 74 65 64 20 75 73 69 6e 67 20 61 73 73 65 6d 62  ted using assemb
37ae0 6c 65 50 61 67 65 28 29 29 2e 20 54 68 69 73 0a  lePage()). This.
37af0 20 20 20 20 2a 2a 20 69 73 20 69 6d 70 6f 72 74      ** is import
37b00 61 6e 74 20 69 66 20 74 68 65 20 70 61 72 65 6e  ant if the paren
37b10 74 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74  t page happens t
37b20 6f 20 62 65 20 70 61 67 65 20 31 20 6f 66 20 74  o be page 1 of t
37b30 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
37b40 2a 2a 20 69 6d 61 67 65 2e 20 20 2a 2f 0a 20 20  ** image.  */.  
37b50 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3d 3d    assert( nNew==
37b60 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
37b70 20 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65   apNew[0]->nFree
37b80 20 3d 3d 20 0a 20 20 20 20 20 20 20 20 28 67 65   == .        (ge
37b90 74 32 62 79 74 65 28 26 61 70 4e 65 77 5b 30 5d  t2byte(&apNew[0]
37ba0 2d 3e 61 44 61 74 61 5b 35 5d 29 2d 61 70 4e 65  ->aData[5])-apNe
37bb0 77 5b 30 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  w[0]->cellOffset
37bc0 2d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c  -apNew[0]->nCell
37bd0 2a 32 29 20 0a 20 20 20 20 29 3b 0a 20 20 20 20  *2) .    );.    
37be0 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28  copyNodeContent(
37bf0 61 70 4e 65 77 5b 30 5d 2c 20 70 50 61 72 65 6e  apNew[0], pParen
37c00 74 2c 20 26 72 63 29 3b 0a 20 20 20 20 66 72 65  t, &rc);.    fre
37c10 65 50 61 67 65 28 61 70 4e 65 77 5b 30 5d 2c 20  ePage(apNew[0], 
37c20 26 72 63 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  &rc);.  }else if
37c30 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
37c40 7b 0a 20 20 20 20 2f 2a 20 46 69 78 20 74 68 65  {.    /* Fix the
37c50 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
37c60 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65  ries for all the
37c70 20 63 65 6c 6c 73 20 74 68 61 74 20 77 65 72 65   cells that were
37c80 20 73 68 69 66 74 65 64 20 61 72 6f 75 6e 64 2e   shifted around.
37c90 20 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61   .    ** There a
37ca0 72 65 20 73 65 76 65 72 61 6c 20 64 69 66 66 65  re several diffe
37cb0 72 65 6e 74 20 74 79 70 65 73 20 6f 66 20 70 6f  rent types of po
37cc0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
37cd0 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 20  s that need to. 
37ce0 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77     ** be dealt w
37cf0 69 74 68 20 62 79 20 74 68 69 73 20 72 6f 75 74  ith by this rout
37d00 69 6e 65 2e 20 53 6f 6d 65 20 6f 66 20 74 68 65  ine. Some of the
37d10 73 65 20 68 61 76 65 20 62 65 65 6e 20 73 65 74  se have been set
37d20 20 61 6c 72 65 61 64 79 2c 20 62 75 74 0a 20 20   already, but.  
37d30 20 20 2a 2a 20 6d 61 6e 79 20 68 61 76 65 20 6e    ** many have n
37d40 6f 74 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ot. The followin
37d50 67 20 69 73 20 61 20 73 75 6d 6d 61 72 79 3a 0a  g is a summary:.
37d60 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
37d70 31 29 20 54 68 65 20 65 6e 74 72 69 65 73 20 61  1) The entries a
37d80 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6e  ssociated with n
37d90 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  ew sibling pages
37da0 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 0a 20   that were not. 
37db0 20 20 20 2a 2a 20 20 20 20 20 20 73 69 62 6c 69     **      sibli
37dc0 6e 67 73 20 77 68 65 6e 20 74 68 69 73 20 66 75  ngs when this fu
37dd0 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
37de0 64 2e 20 54 68 65 73 65 20 68 61 76 65 20 61 6c  d. These have al
37df0 72 65 61 64 79 0a 20 20 20 20 2a 2a 20 20 20 20  ready.    **    
37e00 20 20 62 65 65 6e 20 73 65 74 2e 20 57 65 20 64    been set. We d
37e10 6f 6e 27 74 20 6e 65 65 64 20 74 6f 20 77 6f 72  on't need to wor
37e20 72 79 20 61 62 6f 75 74 20 6f 6c 64 20 73 69 62  ry about old sib
37e30 6c 69 6e 67 73 20 74 68 61 74 20 77 65 72 65 0a  lings that were.
37e40 20 20 20 20 2a 2a 20 20 20 20 20 20 6d 6f 76 65      **      move
37e50 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69  d to the free-li
37e60 73 74 20 2d 20 74 68 65 20 66 72 65 65 50 61 67  st - the freePag
37e70 65 28 29 20 63 6f 64 65 20 68 61 73 20 74 61 6b  e() code has tak
37e80 65 6e 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 20  en care.    **  
37e90 20 20 20 20 6f 66 20 74 68 6f 73 65 2e 0a 20 20      of those..  
37ea0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 32 29    **.    **   2)
37eb0 20 54 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   The pointer-map
37ec0 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61   entries associa
37ed0 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72  ted with the fir
37ee0 73 74 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20  st overflow.    
37ef0 2a 2a 20 20 20 20 20 20 70 61 67 65 20 69 6e 20  **      page in 
37f00 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  any overflow cha
37f10 69 6e 73 20 75 73 65 64 20 62 79 20 6e 65 77 20  ins used by new 
37f20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 2e 20 54  divider cells. T
37f30 68 65 73 65 20 0a 20 20 20 20 2a 2a 20 20 20 20  hese .    **    
37f40 20 20 68 61 76 65 20 61 6c 73 6f 20 61 6c 72 65    have also alre
37f50 61 64 79 20 62 65 65 6e 20 74 61 6b 65 6e 20 63  ady been taken c
37f60 61 72 65 20 6f 66 20 62 79 20 74 68 65 20 69 6e  are of by the in
37f70 73 65 72 74 43 65 6c 6c 28 29 20 63 6f 64 65 2e  sertCell() code.
37f80 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
37f90 20 33 29 20 49 66 20 74 68 65 20 73 69 62 6c 69   3) If the sibli
37fa0 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74  ng pages are not
37fb0 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 74 68   leaves, then th
37fc0 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 6f 66  e child pages of
37fd0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 63 65 6c  .    **      cel
37fe0 6c 73 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65  ls stored on the
37ff0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 6d   sibling pages m
38000 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70  ay need to be up
38010 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  dated..    **.  
38020 20 20 2a 2a 20 20 20 34 29 20 49 66 20 74 68 65    **   4) If the
38030 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61   sibling pages a
38040 72 65 20 6e 6f 74 20 69 6e 74 65 72 6e 61 6c 20  re not internal 
38050 69 6e 74 6b 65 79 20 6e 6f 64 65 73 2c 20 74 68  intkey nodes, th
38060 65 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 20 20  en any.    **   
38070 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65     overflow page
38080 73 20 75 73 65 64 20 62 79 20 74 68 65 73 65 20  s used by these 
38090 63 65 6c 6c 73 20 6d 61 79 20 6e 65 65 64 20 74  cells may need t
380a0 6f 20 62 65 20 75 70 64 61 74 65 64 0a 20 20 20  o be updated.   
380b0 20 2a 2a 20 20 20 20 20 20 28 69 6e 74 65 72 6e   **      (intern
380c0 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73 20  al intkey nodes 
380d0 6e 65 76 65 72 20 63 6f 6e 74 61 69 6e 20 70 6f  never contain po
380e0 69 6e 74 65 72 73 20 74 6f 20 6f 76 65 72 66 6c  inters to overfl
380f0 6f 77 20 70 61 67 65 73 29 2e 0a 20 20 20 20 2a  ow pages)..    *
38100 2a 0a 20 20 20 20 2a 2a 20 20 20 35 29 20 49 66  *.    **   5) If
38110 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
38120 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65  es are not leave
38130 73 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 69 6e  s, then the poin
38140 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 20  ter-map.    **  
38150 20 20 20 20 65 6e 74 72 69 65 73 20 66 6f 72 20      entries for 
38160 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
38170 70 61 67 65 73 20 6f 66 20 65 61 63 68 20 73 69  pages of each si
38180 62 6c 69 6e 67 20 6d 61 79 20 6e 65 65 64 0a 20  bling may need. 
38190 20 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 62 65     **      to be
381a0 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a   updated..    **
381b0 0a 20 20 20 20 2a 2a 20 43 61 73 65 73 20 31 20  .    ** Cases 1 
381c0 61 6e 64 20 32 20 61 72 65 20 64 65 61 6c 74 20  and 2 are dealt 
381d0 77 69 74 68 20 61 62 6f 76 65 20 62 79 20 6f 74  with above by ot
381e0 68 65 72 20 63 6f 64 65 2e 20 54 68 65 20 6e 65  her code. The ne
381f0 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20  xt.    ** block 
38200 64 65 61 6c 73 20 77 69 74 68 20 63 61 73 65 73  deals with cases
38210 20 33 20 61 6e 64 20 34 20 61 6e 64 20 74 68 65   3 and 4 and the
38220 20 6f 6e 65 20 61 66 74 65 72 20 74 68 61 74 2c   one after that,
38230 20 63 61 73 65 20 35 2e 20 53 69 6e 63 65 0a 20   case 5. Since. 
38240 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 20 61 20     ** setting a 
38250 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
38260 79 20 69 73 20 61 20 72 65 6c 61 74 69 76 65 6c  y is a relativel
38270 79 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72  y expensive oper
38280 61 74 69 6f 6e 2c 20 74 68 69 73 0a 20 20 20 20  ation, this.    
38290 2a 2a 20 63 6f 64 65 20 6f 6e 6c 79 20 73 65 74  ** code only set
382a0 73 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  s pointer map en
382b0 74 72 69 65 73 20 66 6f 72 20 63 68 69 6c 64 20  tries for child 
382c0 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  or overflow page
382d0 73 20 74 68 61 74 20 68 61 76 65 0a 20 20 20 20  s that have.    
382e0 2a 2a 20 61 63 74 75 61 6c 6c 79 20 6d 6f 76 65  ** actually move
382f0 64 20 62 65 74 77 65 65 6e 20 70 61 67 65 73 2e  d between pages.
38300 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65    */.    MemPage
38310 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 30   *pNew = apNew[0
38320 5d 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ];.    MemPage *
38330 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 30 5d  pOld = apCopy[0]
38340 3b 0a 20 20 20 20 69 6e 74 20 6e 4f 76 65 72 66  ;.    int nOverf
38350 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65  low = pOld->nOve
38360 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69  rflow;.    int i
38370 4e 65 78 74 4f 6c 64 20 3d 20 70 4f 6c 64 2d 3e  NextOld = pOld->
38380 6e 43 65 6c 6c 20 2b 20 6e 4f 76 65 72 66 6c 6f  nCell + nOverflo
38390 77 3b 0a 20 20 20 20 69 6e 74 20 69 4f 76 65 72  w;.    int iOver
383a0 66 6c 6f 77 20 3d 20 28 6e 4f 76 65 72 66 6c 6f  flow = (nOverflo
383b0 77 20 3f 20 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c  w ? pOld->aiOvfl
383c0 5b 30 5d 20 3a 20 2d 31 29 3b 0a 20 20 20 20 6a  [0] : -1);.    j
383d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
383e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
383f0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6f 6c    /* Current 'ol
38400 64 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  d' sibling page 
38410 2a 2f 0a 20 20 20 20 6b 20 3d 20 30 3b 20 20 20  */.    k = 0;   
38420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
38440 72 65 6e 74 20 27 6e 65 77 27 20 73 69 62 6c 69  rent 'new' sibli
38450 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 66  ng page */.    f
38460 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i&