/ Hex Artifact Content
Login

Artifact 4195fed5741b4dbcc9831b623aec487258f3e62d:


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 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42 5f  >schemaFlags&DB_
1670: 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d 30  SchemaLoaded)==0
1680: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1690: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67  1;.  }..  /* Fig
16a0: 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f 74  ure out the root
16b0: 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20 6c  -page that the l
16c0: 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68 65  ock should be he
16d0: 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c 65  ld on. For table
16e0: 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20 74  .  ** b-trees, t
16f0: 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65 20  his is just the 
1700: 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
1710: 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72 65   b-tree being re
1720: 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74 74  ad or.  ** writt
1730: 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62 2d  en. For index b-
1740: 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68 65  trees, it is the
1750: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1760: 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a  e associated.  *
1770: 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 69  * table.  */.  i
1780: 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20 20  f( isIndex ){.  
1790: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20    HashElem *p;. 
17a0: 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48     for(p=sqliteH
17b0: 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65 6d  ashFirst(&pSchem
17c0: 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b 20  a->idxHash); p; 
17d0: 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  p=sqliteHashNext
17e0: 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64 65  (p)){.      Inde
17f0: 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65 78  x *pIdx = (Index
1800: 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74   *)sqliteHashDat
1810: 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  a(p);.      if( 
1820: 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e 74  pIdx->tnum==(int
1830: 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20  )iRoot ){.      
1840: 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d 3e 70    iTab = pIdx->p
1850: 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20 20 20  Table->tnum;.   
1860: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
1870: 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d 20 69  se{.    iTab = i
1880: 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Root;.  }..  /* 
1890: 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 72  Search for the r
18a0: 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 45 69  equired lock. Ei
18b0: 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c 6f 63  ther a write-loc
18c0: 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65 20 69  k on root-page i
18d0: 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77 72 69  Tab, a .  ** wri
18e0: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73  te-lock on the s
18f0: 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f 72 20  chema table, or 
1900: 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69  (if the client i
1910: 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20 20 2a  s reading) a.  *
1920: 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 69  * read-lock on i
1930: 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69 63 65  Tab will suffice
1940: 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20 61 6e  . Return 1 if an
1950: 79 20 6f 66 20 74 68 65 73 65 20 61 72 65 20 66  y of these are f
1960: 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f 72 28  ound.  */.  for(
1970: 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e 70 42  pLock=pBtree->pB
1980: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b  t->pLock; pLock;
1990: 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e   pLock=pLock->pN
19a0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 4c  ext){.    if( pL
19b0: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 42 74  ock->pBtree==pBt
19c0: 72 65 65 20 0a 20 20 20 20 20 26 26 20 28 70 4c  ree .     && (pL
19d0: 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ock->iTable==iTa
19e0: 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65 4c 6f  b || (pLock->eLo
19f0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 26  ck==WRITE_LOCK &
1a00: 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d  & pLock->iTable=
1a10: 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70 4c 6f  =1)).     && pLo
1a20: 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b  ck->eLock>=eLock
1a30: 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20 20 20  Type .    ){.   
1a40: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1a50: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 61 69   }.  }..  /* Fai
1a60: 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20  led to find the 
1a70: 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 2a  required lock. *
1a80: 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  /.  return 0;.}.
1a90: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1aa0: 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65  _DEBUG */..#ifde
1ab0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
1ac0: 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63  *.**** This func
1ad0: 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73 65 64  tion may be used
1ae0: 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65   as part of asse
1af0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
1b00: 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  only. ****.**.**
1b10: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
1b20: 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c 6c 65  it would be ille
1b30: 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65 20 74  gal for pBtree t
1b40: 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65  o write into the
1b50: 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  .** table or ind
1b60: 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69 52 6f  ex rooted at iRo
1b70: 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68 65 72  ot because other
1b80: 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74 69   shared connecti
1b90: 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d 75 6c  ons are.** simul
1ba0: 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64 69 6e  taneously readin
1bb0: 67 20 74 68 61 74 20 73 61 6d 65 20 74 61 62 6c  g that same tabl
1bc0: 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  e or index..**.*
1bd0: 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  * It is illegal 
1be0: 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72  for pBtree to wr
1bf0: 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  ite if some othe
1c00: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 74  r Btree object t
1c10: 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20 74 68  hat.** shares th
1c20: 65 20 73 61 6d 65 20 42 74 53 68 61 72 65 64 20  e same BtShared 
1c30: 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72 65 6e  object is curren
1c40: 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20 77  tly reading or w
1c50: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 69 52  riting.** the iR
1c60: 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78 63 65  oot table.  Exce
1c70: 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68 65 72  pt, if the other
1c80: 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 68 61   Btree object ha
1c90: 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d 75 6e  s the.** read-un
1ca0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73  committed flag s
1cb0: 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 4f  et, then it is O
1cc0: 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72 20  K for the other 
1cd0: 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68 61 76  object to.** hav
1ce0: 65 20 61 20 72 65 61 64 20 63 75 72 73 6f 72 2e  e a read cursor.
1cf0: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
1d00: 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69 74 69  le, before writi
1d10: 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74 20 6f  ng to any part o
1d20: 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  f the table or i
1d30: 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64 20 61  ndex.** rooted a
1d40: 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 6f 6e  t page iRoot, on
1d50: 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a 0a 2a  e should call:.*
1d60: 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20  *.**    assert( 
1d70: 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74  !hasReadConflict
1d80: 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 29  s(pBtree, iRoot)
1d90: 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   );.*/.static in
1da0: 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63  t hasReadConflic
1db0: 74 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65  ts(Btree *pBtree
1dc0: 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b 0a 20  , Pgno iRoot){. 
1dd0: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
1de0: 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
1df0: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
1e00: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
1e10: 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d  if( p->pgnoRoot=
1e20: 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26 26 20  =iRoot .     && 
1e30: 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74 72 65  p->pBtree!=pBtre
1e40: 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 70 2d  e.     && 0==(p-
1e50: 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61  >pBtree->db->fla
1e60: 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64  gs & SQLITE_Read
1e70: 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20 20 20  Uncommitted).   
1e80: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1e90: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
1ea0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
1eb0: 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65 66 20  if    /* #ifdef 
1ec0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
1ed0: 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f 20  ./*.** Query to 
1ee0: 73 65 65 20 69 66 20 42 74 72 65 65 20 68 61 6e  see if Btree han
1ef0: 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69 6e  dle p may obtain
1f00: 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20   a lock of type 
1f10: 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44 5f  eLock .** (READ_
1f20: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
1f30: 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  CK) on the table
1f40: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
1f50: 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a 20  iTab. Return.** 
1f60: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65  SQLITE_OK if the
1f70: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62 74   lock may be obt
1f80: 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69 6e  ained (by callin
1f90: 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64 43 61  g.** setSharedCa
1fa0: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2c  cheTableLock()),
1fb0: 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45   or SQLITE_LOCKE
1fc0: 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61  D if not..*/.sta
1fd0: 74 69 63 20 69 6e 74 20 71 75 65 72 79 53 68 61  tic int querySha
1fe0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1ff0: 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f  k(Btree *p, Pgno
2000: 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b 29   iTab, u8 eLock)
2010: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
2020: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
2030: 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20  Lock *pIter;..  
2040: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
2050: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
2060: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
2070: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20  Lock==READ_LOCK 
2080: 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  || eLock==WRITE_
2090: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
20a0: 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20  ( p->db!=0 );.  
20b0: 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64 62 2d  assert( !(p->db-
20c0: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65  >flags&SQLITE_Re
20d0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 7c 7c  adUncommitted)||
20e0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
20f0: 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20 20  K||iTab==1 );.  
2100: 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73 74  .  /* If request
2110: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
2120: 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 65 65  , then the Btree
2130: 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f 70   must have an op
2140: 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74 72  en write.  ** tr
2150: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 69  ansaction on thi
2160: 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62 76  s file. And, obv
2170: 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69 73  iously, for this
2180: 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65 20   to be so there 
2190: 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61 6e  .  ** must be an
21a0: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
21b0: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 66  saction on the f
21c0: 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f  ile itself..  */
21d0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
21e0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 28  ==READ_LOCK || (
21f0: 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72 20  p==pBt->pWriter 
2200: 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
2210: 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a 20  RANS_WRITE) );. 
2220: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2230: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42 74  READ_LOCK || pBt
2240: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
2250: 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
2260: 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75    .  /* This rou
2270: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
2280: 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61  if the shared-ca
2290: 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c  che is not enabl
22a0: 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e  ed */.  if( !p->
22b0: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
22c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73  ;.  }..  /* If s
22e0: 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  ome other connec
22f0: 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20  tion is holding 
2300: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
2310: 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71 75  k, the.  ** requ
2320: 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e  ested lock may n
2330: 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a  ot be obtained..
2340: 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
2350: 70 57 72 69 74 65 72 21 3d 70 20 26 26 20 28 70  pWriter!=p && (p
2360: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
2370: 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30  TS_EXCLUSIVE)!=0
2380: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
2390: 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
23a0: 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72  (p->db, pBt->pWr
23b0: 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72  iter->db);.    r
23c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
23d0: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
23e0: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74 65  .  }..  for(pIte
23f0: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
2400: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
2410: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a  ->pNext){.    /*
2420: 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 28   The condition (
2430: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c  pIter->eLock!=eL
2440: 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ock) in the foll
2450: 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a 20  owing if(...) . 
2460: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
2470: 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61 74  is a simplificat
2480: 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  ion of:.    **. 
2490: 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d     **   (eLock==
24a0: 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49  WRITE_LOCK || pI
24b0: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54  ter->eLock==WRIT
24c0: 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a 20  E_LOCK).    **. 
24d0: 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b     ** since we k
24e0: 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f 63  now that if eLoc
24f0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20 74  k==WRITE_LOCK, t
2500: 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hen no other con
2510: 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6d  nection.    ** m
2520: 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45 5f  ay hold a WRITE_
2530: 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c  LOCK on any tabl
2540: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 28  e in this file (
2550: 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e 0a  since there can.
2560: 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61      ** only be a
2570: 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29 2e   single writer).
2580: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
2590: 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b  rt( pIter->eLock
25a0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
25b0: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
25c0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  TE_LOCK );.    a
25d0: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
25e0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  AD_LOCK || pIter
25f0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70  ->pBtree==p || p
2600: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Iter->eLock==REA
2610: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
2620: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
2630: 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62  p && pIter->iTab
2640: 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74 65  le==iTab && pIte
2650: 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20  r->eLock!=eLock 
2660: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2670: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2680: 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d 3e  d(p->db, pIter->
2690: 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20 20  pBtree->db);.   
26a0: 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57 52     if( eLock==WR
26b0: 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ITE_LOCK ){.    
26c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
26d0: 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
26e0: 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46         pBt->btsF
26f0: 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e 44  lags |= BTS_PEND
2700: 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ING;.      }.   
2710: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2720: 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
2730: 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  CHE;.    }.  }. 
2740: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2750: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  K;.}.#endif /* !
2760: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
2770: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
2780: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2790: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
27a0: 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f  .** Add a lock o
27b0: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
27c0: 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c   root-page iTabl
27d0: 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  e to the shared-
27e0: 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79  btree used.** by
27f0: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e   Btree handle p.
2800: 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b   Parameter eLock
2810: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
2820: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a  READ_LOCK or .**
2830: 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a   WRITE_LOCK..**.
2840: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2850: 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f 6c   assumes the fol
2860: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
2870: 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69 65  (a) The specifie
2880: 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70  d Btree object p
2890: 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f   is connected to
28a0: 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20 20   a sharable.**  
28b0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 6f       database (o
28c0: 6e 65 20 77 69 74 68 20 74 68 65 20 42 74 53 68  ne with the BtSh
28d0: 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66 6c  ared.sharable fl
28e0: 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a 0a  ag set), and.**.
28f0: 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68 65  **   (b) No othe
2900: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73 20  r Btree objects 
2910: 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61 74  hold a lock that
2920: 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20   conflicts.**   
2930: 20 20 20 20 77 69 74 68 20 74 68 65 20 72 65 71      with the req
2940: 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e 65  uested lock (i.e
2950: 2e 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  . querySharedCac
2960: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68 61  heTableLock() ha
2970: 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65 61  s.**       alrea
2980: 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 61  dy been called a
2990: 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49  nd returned SQLI
29a0: 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51  TE_OK)..**.** SQ
29b0: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
29c0: 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  ned if the lock 
29d0: 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73 73  is added success
29e0: 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e 4f  fully. SQLITE_NO
29f0: 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75 72  MEM .** is retur
2a00: 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  ned if a malloc 
2a10: 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a 2a  attempt fails..*
2a20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
2a30: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a40: 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50  Lock(Btree *p, P
2a50: 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65  gno iTable, u8 e
2a60: 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65  Lock){.  BtShare
2a70: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
2a80: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b  .  BtLock *pLock
2a90: 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a   = 0;.  BtLock *
2aa0: 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  pIter;..  assert
2ab0: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2ac0: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2ad0: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2ae0: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  READ_LOCK || eLo
2af0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  ck==WRITE_LOCK )
2b00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
2b10: 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20  b!=0 );..  /* A 
2b20: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
2b30: 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  the read-uncommi
2b40: 74 74 65 64 20 66 6c 61 67 20 73 65 74 20 77 69  tted flag set wi
2b50: 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f 0a  ll never try to.
2b60: 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72 65    ** obtain a re
2b70: 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74 68  ad-lock using th
2b80: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65  is function. The
2b90: 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b 20   only read-lock 
2ba0: 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62 79  obtained.  ** by
2bb0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e   a connection in
2bc0: 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65   read-uncommitte
2bd0: 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68 65  d mode is on the
2be0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a   sqlite_master .
2bf0: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20    ** table, and 
2c00: 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62 74  that lock is obt
2c10: 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42 65  ained in BtreeBe
2c20: 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f 0a  ginTrans().  */.
2c30: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70 2d    assert( 0==(p-
2c40: 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  >db->flags&SQLIT
2c50: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  E_ReadUncommitte
2c60: 64 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  d) || eLock==WRI
2c70: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  TE_LOCK );..  /*
2c80: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
2c90: 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
2ca0: 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 61 62  lled on a sharab
2cb0: 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65 72 20  le b-tree after 
2cc0: 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62 65 65  it .  ** has bee
2cd0: 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61  n determined tha
2ce0: 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72 65  t no other b-tre
2cf0: 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c 69  e holds a confli
2d00: 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f 0a  cting lock.  */.
2d10: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61    assert( p->sha
2d20: 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72  rable );.  asser
2d30: 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75  t( SQLITE_OK==qu
2d40: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
2d50: 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c  bleLock(p, iTabl
2d60: 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20  e, eLock) );..  
2d70: 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63 68 20  /* First search 
2d80: 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e 20  the list for an 
2d90: 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e  existing lock on
2da0: 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a   this table. */.
2db0: 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
2dc0: 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
2dd0: 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
2de0: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65  t){.    if( pIte
2df0: 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  r->iTable==iTabl
2e00: 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74 72  e && pIter->pBtr
2e10: 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 70  ee==p ){.      p
2e20: 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20  Lock = pIter;.  
2e30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2e40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
2e50: 65 20 61 62 6f 76 65 20 73 65 61 72 63 68 20 64  e above search d
2e60: 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42 74  id not find a Bt
2e70: 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73 6f  Lock struct asso
2e80: 63 69 61 74 69 6e 67 20 42 74 72 65 65 20 70 0a  ciating Btree p.
2e90: 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20    ** with table 
2ea0: 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65  iTable, allocate
2eb0: 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74   one and link it
2ec0: 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a   into the list..
2ed0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63    */.  if( !pLoc
2ee0: 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d  k ){.    pLock =
2ef0: 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74   (BtLock *)sqlit
2f00: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
2f10: 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20  eof(BtLock));.  
2f20: 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a    if( !pLock ){.
2f30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2f40: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
2f50: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62  .    pLock->iTab
2f60: 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20  le = iTable;.   
2f70: 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d   pLock->pBtree =
2f80: 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70   p;.    pLock->p
2f90: 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63  Next = pBt->pLoc
2fa0: 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63  k;.    pBt->pLoc
2fb0: 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a  k = pLock;.  }..
2fc0: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c    /* Set the BtL
2fd0: 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ock.eLock variab
2fe0: 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  le to the maximu
2ff0: 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  m of the current
3000: 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74   lock.  ** and t
3010: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
3020: 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66  k. This means if
3030: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61   a write-lock wa
3040: 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20  s already held. 
3050: 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c   ** and a read-l
3060: 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77  ock requested, w
3070: 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63  e don't incorrec
3080: 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68  tly downgrade th
3090: 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61  e lock..  */.  a
30a0: 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43  ssert( WRITE_LOC
30b0: 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20  K>READ_LOCK );. 
30c0: 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b   if( eLock>pLock
30d0: 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  ->eLock ){.    p
30e0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c  Lock->eLock = eL
30f0: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ock;.  }..  retu
3100: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
3110: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
3120: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
3130: 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  CHE */..#ifndef 
3140: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
3150: 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52  ED_CACHE./*.** R
3160: 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74  elease all the t
3170: 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b  able locks (lock
3180: 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63  s obtained via c
3190: 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73  alls to.** the s
31a0: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
31b0: 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75  leLock() procedu
31c0: 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72 65  re) held by Btre
31d0: 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a  e object p..**.*
31e0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
31f0: 61 73 73 75 6d 65 73 20 74 68 61 74 20 42 74 72  assumes that Btr
3200: 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e  ee p has an open
3210: 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a   read or write .
3220: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
3230: 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20  If it does not, 
3240: 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 45 4e  then the BTS_PEN
3250: 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61 79  DING flag.** may
3260: 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20   be incorrectly 
3270: 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  cleared..*/.stat
3280: 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c  ic void clearAll
3290: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
32a0: 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b  Locks(Btree *p){
32b0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
32c0: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
32d0: 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26  ock **ppIter = &
32e0: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61  pBt->pLock;..  a
32f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
3300: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
3310: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3320: 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d  >sharable || 0==
3330: 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73  *ppIter );.  ass
3340: 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e  ert( p->inTrans>
3350: 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a  0 );..  while( *
3360: 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74  ppIter ){.    Bt
3370: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70  Lock *pLock = *p
3380: 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72  pIter;.    asser
3390: 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
33a0: 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56  s & BTS_EXCLUSIV
33b0: 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  E)==0 || pBt->pW
33c0: 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42  riter==pLock->pB
33d0: 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65  tree );.    asse
33e0: 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  rt( pLock->pBtre
33f0: 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63  e->inTrans>=pLoc
3400: 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  k->eLock );.    
3410: 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65  if( pLock->pBtre
3420: 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70  e==p ){.      *p
3430: 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70  pIter = pLock->p
3440: 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Next;.      asse
3450: 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c  rt( pLock->iTabl
3460: 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26  e!=1 || pLock==&
3470: 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20  p->lock );.     
3480: 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62   if( pLock->iTab
3490: 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  le!=1 ){.       
34a0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c   sqlite3_free(pL
34b0: 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ock);.      }.  
34c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
34d0: 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e  pIter = &pLock->
34e0: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
34f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 74  ..  assert( (pBt
3500: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
3510: 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c 20  _PENDING)==0 || 
3520: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
3530: 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74    if( pBt->pWrit
3540: 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74  er==p ){.    pBt
3550: 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20  ->pWriter = 0;. 
3560: 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
3570: 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53   &= ~(BTS_EXCLUS
3580: 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29  IVE|BTS_PENDING)
3590: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42  ;.  }else if( pB
35a0: 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  t->nTransaction=
35b0: 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =2 ){.    /* Thi
35c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
35d0: 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65 65 20  lled when Btree 
35e0: 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20  p is concluding 
35f0: 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e  its .    ** tran
3600: 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72  saction. If ther
3610: 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73  e currently exis
3620: 74 73 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64  ts a writer, and
3630: 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a   p is not.    **
3640: 20 74 68 61 74 20 77 72 69 74 65 72 2c 20 74 68   that writer, th
3650: 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
3660: 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63   locks held by c
3670: 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72  onnections other
3680: 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65  .    ** than the
3690: 20 77 72 69 74 65 72 20 6d 75 73 74 20 62 65 20   writer must be 
36a0: 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f  about to drop to
36b0: 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63   zero. In this c
36c0: 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74  ase.    ** set t
36d0: 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66  he BTS_PENDING f
36e0: 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a  lag to 0..    **
36f0: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65  .    ** If there
3700: 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
3710: 79 20 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e  y a writer, then
3720: 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75 73   BTS_PENDING mus
3730: 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f  t.    ** be zero
3740: 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69   already. So thi
3750: 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68  s next line is h
3760: 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20  armless in that 
3770: 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
3780: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
3790: 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a  = ~BTS_PENDING;.
37a0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
37b0: 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67  s function chang
37c0: 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63  es all write-loc
37d0: 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72 65 65  ks held by Btree
37e0: 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f 63   p into read-loc
37f0: 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ks..*/.static vo
3800: 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53  id downgradeAllS
3810: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
3820: 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a  ocks(Btree *p){.
3830: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
3840: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  = p->pBt;.  if( 
3850: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20  pBt->pWriter==p 
3860: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
3870: 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70  Lock;.    pBt->p
3880: 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Writer = 0;.    
3890: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
38a0: 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45   ~(BTS_EXCLUSIVE
38b0: 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20  |BTS_PENDING);. 
38c0: 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74     for(pLock=pBt
38d0: 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20  ->pLock; pLock; 
38e0: 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65  pLock=pLock->pNe
38f0: 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
3900: 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d  t( pLock->eLock=
3910: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c  =READ_LOCK || pL
3920: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ock->pBtree==p )
3930: 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 65  ;.      pLock->e
3940: 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b  Lock = READ_LOCK
3950: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
3960: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
3970: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3980: 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69  E */..static voi
3990: 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65  d releasePage(Me
39a0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
39b0: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
39c0: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a  ence */../*.****
39d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
39e0: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
39f0: 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a   assert() only *
3a00: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79  ***.**.** Verify
3a10: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
3a20: 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78   holds the mutex
3a30: 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65 64   on its BtShared
3a40: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3a50: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
3a60: 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  nt cursorHoldsMu
3a70: 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29  tex(BtCursor *p)
3a80: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
3a90: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
3aa0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  >pBt->mutex);.}.
3ab0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
3ac0: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
3ad0: 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66 20 74  rflow cache of t
3ae0: 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65 64  he cursor passed
3af0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
3b00: 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74 68  gument..** on th
3b10: 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73  e shared btree s
3b20: 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f  tructure pBt..*/
3b30: 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64  .#define invalid
3b40: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3b50: 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e 63 75  (pCur) (pCur->cu
3b60: 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
3b70: 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a  ValidOvfl)../*.*
3b80: 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65  * Invalidate the
3b90: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
3ba0: 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 61 6c  ist cache for al
3bb0: 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
3bc0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3bd0: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3be0: 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  e pBt..*/.static
3bf0: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3c00: 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
3c10: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
3c20: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
3c30: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3c40: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
3c50: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
3c60: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
3c70: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
3c80: 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  {.    invalidate
3c90: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 29  OverflowCache(p)
3ca0: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
3cb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
3cc0: 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73  RBLOB./*.** This
3cd0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
3ce0: 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69 66  led before modif
3cf0: 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
3d00: 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20  s of a table.** 
3d10: 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e  to invalidate an
3d20: 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f  y incrblob curso
3d30: 72 73 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  rs that are open
3d40: 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f   on the.** row o
3d50: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 77  r one of the row
3d60: 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64  s being modified
3d70: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
3d80: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
3d90: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
3da0: 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
3db0: 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62  ts of the.** tab
3dc0: 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  le is about to b
3dd0: 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68  e deleted. In th
3de0: 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61  is case invalida
3df0: 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a  te all incrblob.
3e00: 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ** cursors open 
3e10: 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69  on any row withi
3e20: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
3e30: 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52   root-page pgnoR
3e40: 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  oot..**.** Other
3e50: 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e  wise, if argumen
3e60: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69  t isClearTable i
3e70: 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68  s false, then th
3e80: 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f  e row with.** ro
3e90: 77 69 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e  wid iRow is bein
3ea0: 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65  g replaced or de
3eb0: 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  leted. In this c
3ec0: 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a  ase invalidate.*
3ed0: 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63  * only those inc
3ee0: 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70  rblob cursors op
3ef0: 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63 69  en on that speci
3f00: 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74  fic row..*/.stat
3f10: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
3f20: 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
3f30: 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  s(.  Btree *pBtr
3f40: 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ee,          /* 
3f50: 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
3f60: 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
3f70: 69 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20 20  i64 iRow,       
3f80: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
3f90: 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68 74 20  owid that might 
3fa0: 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20  be changing */. 
3fb0: 20 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c   int isClearTabl
3fc0: 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  e        /* True
3fd0: 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65   if all rows are
3fe0: 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a   being deleted *
3ff0: 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  /.){.  BtCursor 
4000: 2a 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  *p;.  BtShared *
4010: 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70 42  pBt = pBtree->pB
4020: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
4030: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
4040: 74 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20  tex(pBtree) );. 
4050: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
4060: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
4070: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d  xt){.    if( (p-
4080: 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
4090: 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 20 26 26  _Incrblob)!=0 &&
40a0: 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c   (isClearTable |
40b0: 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  | p->info.nKey==
40c0: 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20 20 70  iRow) ){.      p
40d0: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
40e0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 7d  R_INVALID;.    }
40f0: 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20  .  }.}..#else.  
4100: 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69 6f 6e  /* Stub function
4110: 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20 69   when INCRBLOB i
4120: 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20 23  s omitted */.  #
4130: 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74  define invalidat
4140: 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73  eIncrblobCursors
4150: 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f  (x,y,z).#endif /
4160: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
4170: 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  CRBLOB */../*.**
4180: 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66   Set bit pgno of
4190: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
41a0: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
41b0: 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  . This is called
41c0: 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65   .** when a page
41d0: 20 74 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79   that previously
41e0: 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20   contained data 
41f0: 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c  becomes a free-l
4200: 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67  ist leaf .** pag
4210: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53  e..**.** The BtS
4220: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4230: 74 20 62 69 74 76 65 63 20 65 78 69 73 74 73 20  t bitvec exists 
4240: 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61  to work around a
4250: 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67  n obscure.** bug
4260: 20 63 61 75 73 65 64 20 62 79 20 74 68 65 20 69   caused by the i
4270: 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77  nteraction of tw
4280: 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69  o useful IO opti
4290: 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75  mizations surrou
42a0: 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69  nding.** free-li
42b0: 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a  st leaf pages:.*
42c0: 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61  *.**   1) When a
42d0: 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c 65 74  ll data is delet
42e0: 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61  ed from a page a
42f0: 6e 64 20 74 68 65 20 70 61 67 65 20 62 65 63 6f  nd the page beco
4300: 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72  mes.**      a fr
4310: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4320: 65 2c 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  e, the page is n
4330: 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ot written to th
4340: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
4350: 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74     (as free-list
4360: 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74   leaf pages cont
4370: 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75  ain no meaningfu
4380: 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d  l data). Sometim
4390: 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20  es.**      such 
43a0: 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76  a page is not ev
43b0: 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61  en journalled (a
43c0: 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s it will not be
43d0: 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20   modified,.**   
43e0: 20 20 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f     why bother jo
43f0: 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a  urnalling it?)..
4400: 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20  **.**   2) When 
4410: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
4420: 20 70 61 67 65 20 69 73 20 72 65 75 73 65 64 2c   page is reused,
4430: 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20   its content is 
4440: 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20  not read.**     
4450: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
4460: 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f  se or written to
4470: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
4480: 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74  e (why should it
4490: 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20  .**      be, if 
44a0: 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c  it is not at all
44b0: 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a   meaningful?)..*
44c0: 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76  *.** By themselv
44d0: 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69  es, these optimi
44e0: 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e  zations work fin
44f0: 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20  e and provide a 
4500: 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d  handy.** perform
4510: 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75  ance boost to bu
4520: 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73  lk delete or ins
4530: 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20  ert operations. 
4540: 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61  However, if.** a
4550: 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74   page is moved t
4560: 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  o the free-list 
4570: 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65 64 20  and then reused 
4580: 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a  within the same.
4590: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  ** transaction, 
45a0: 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20  a problem comes 
45b0: 75 70 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  up. If the page 
45c0: 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65  is not journalle
45d0: 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20  d when.** it is 
45e0: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
45f0: 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73  e-list and it is
4600: 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61   also not journa
4610: 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20  lled when it.** 
4620: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
4630: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  m the free-list 
4640: 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e  and reused, then
4650: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
4660: 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73  ta.** may be los
4670: 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20  t. In the event 
4680: 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  of a rollback, i
4690: 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73  t may not be pos
46a0: 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74  sible.** to rest
46b0: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
46c0: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
46d0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a   configuration..
46e0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69  **.** The soluti
46f0: 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68 61 72  on is the BtShar
4700: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4710: 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20  itvec. Whenever 
4720: 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f  a page is .** mo
4730: 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20  ved to become a 
4740: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4750: 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70  age, the corresp
4760: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a  onding bit is.**
4770: 20 73 65 74 20 69 6e 20 74 68 65 20 62 69 74 76   set in the bitv
4780: 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c  ec. Whenever a l
4790: 65 61 66 20 70 61 67 65 20 69 73 20 65 78 74 72  eaf page is extr
47a0: 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  acted from the f
47b0: 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74  ree-list,.** opt
47c0: 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76  imization 2 abov
47d0: 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20  e is omitted if 
47e0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
47f0: 67 20 62 69 74 20 69 73 20 61 6c 72 65 61 64 79  g bit is already
4800: 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61  .** set in BtSha
4810: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e  red.pHasContent.
4820: 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   The contents of
4830: 20 74 68 65 20 62 69 74 76 65 63 20 61 72 65 20   the bitvec are 
4840: 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68  cleared.** at th
4850: 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74  e end of every t
4860: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
4870: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 53  tatic int btreeS
4880: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
4890: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
48a0: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63   pgno){.  int rc
48b0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
48c0: 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f  if( !pBt->pHasCo
48d0: 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73  ntent ){.    ass
48e0: 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e  ert( pgno<=pBt->
48f0: 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74  nPage );.    pBt
4900: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20  ->pHasContent = 
4910: 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
4920: 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b  ate(pBt->nPage);
4930: 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70  .    if( !pBt->p
4940: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
4950: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4960: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
4970: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
4980: 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71  E_OK && pgno<=sq
4990: 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28  lite3BitvecSize(
49a0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
49b0: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
49c0: 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
49d0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c  Bt->pHasContent,
49e0: 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65   pgno);.  }.  re
49f0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
4a00: 2a 20 51 75 65 72 79 20 74 68 65 20 42 74 53 68  * Query the BtSh
4a10: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4a20: 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54   vector..**.** T
4a30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
4a40: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72  called when a fr
4a50: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4a60: 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f  e is removed fro
4a70: 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69  m the.** free-li
4a80: 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74  st for reuse. It
4a90: 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69   returns false i
4aa0: 66 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  f it is safe to 
4ab0: 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20  retrieve the.** 
4ac0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
4ad0: 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74  ger layer with t
4ae0: 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20  he 'no-content' 
4af0: 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f  flag set. True o
4b00: 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
4b10: 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
4b20: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
4b30: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
4b40: 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a  gno){.  Bitvec *
4b50: 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  p = pBt->pHasCon
4b60: 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28  tent;.  return (
4b70: 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74  p && (pgno>sqlit
4b80: 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 29 20  e3BitvecSize(p) 
4b90: 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  || sqlite3Bitvec
4ba0: 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b  Test(p, pgno)));
4bb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
4bc0: 28 64 65 73 74 72 6f 79 29 20 74 68 65 20 42 74  (destroy) the Bt
4bd0: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
4be0: 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73 20  nt bitvec. This 
4bf0: 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76  should be.** inv
4c00: 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63  oked at the conc
4c10: 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77  lusion of each w
4c20: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
4c30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4c40: 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
4c50: 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a  ntent(BtShared *
4c60: 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42  pBt){.  sqlite3B
4c70: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 42 74  itvecDestroy(pBt
4c80: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a  ->pHasContent);.
4c90: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
4ca0: 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nt = 0;.}../*.**
4cb0: 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66 20   Release all of 
4cc0: 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70 61 67  the apPage[] pag
4cd0: 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2e  es for a cursor.
4ce0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4cf0: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
4d00: 75 72 73 6f 72 50 61 67 65 73 28 42 74 43 75 72  ursorPages(BtCur
4d10: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
4d20: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
4d30: 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  i<=pCur->iPage; 
4d40: 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  i++){.    releas
4d50: 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
4d60: 67 65 5b 69 5d 29 3b 0a 20 20 20 20 70 43 75 72  ge[i]);.    pCur
4d70: 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b  ->apPage[i] = 0;
4d80: 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 50 61  .  }.  pCur->iPa
4d90: 67 65 20 3d 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  ge = -1;.}.../*.
4da0: 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72  ** Save the curr
4db0: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
4dc0: 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61  ion in the varia
4dd0: 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b  bles BtCursor.nK
4de0: 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72  ey .** and BtCur
4df0: 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75  sor.pKey. The cu
4e00: 72 73 6f 72 27 73 20 73 74 61 74 65 20 69 73 20  rsor's state is 
4e10: 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45  set to CURSOR_RE
4e20: 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a  QUIRESEEK..**.**
4e30: 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
4e40: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
4e50: 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64   cursor is valid
4e60: 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55   (has eState==CU
4e70: 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70  RSOR_VALID).** p
4e80: 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
4e90: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a  this routine.  .
4ea0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
4eb0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
4ec0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
4ed0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
4ee0: 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
4ef0: 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
4f00: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30  e );.  assert( 0
4f10: 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a  ==pCur->pKey );.
4f20: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
4f30: 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
4f40: 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   );..  rc = sqli
4f50: 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
4f60: 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65  pCur, &pCur->nKe
4f70: 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  y);.  assert( rc
4f80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
4f90: 2f 2a 20 4b 65 79 53 69 7a 65 28 29 20 63 61 6e  /* KeySize() can
4fa0: 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f  not fail */..  /
4fb0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
4fc0: 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20 74 68  intKey table, th
4fd0: 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63 61 6c  en the above cal
4fe0: 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53 69 7a  l to BtreeKeySiz
4ff0: 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20  e().  ** stores 
5000: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
5010: 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49  in pCur->nKey. I
5020: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73  n this case this
5030: 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61   value is.  ** a
5040: 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69  ll that is requi
5050: 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  red. Otherwise, 
5060: 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74 20 6f  if pCur is not o
5070: 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79  pen on an intKey
5080: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65  .  ** table, the
5090: 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20 66  n malloc space f
50a0: 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  or and store the
50b0: 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65   pCur->nKey byte
50c0: 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64  s of key .  ** d
50d0: 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ata..  */.  if( 
50e0: 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  0==pCur->apPage[
50f0: 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  0]->intKey ){.  
5100: 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73    void *pKey = s
5110: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 28 69  qlite3Malloc( (i
5120: 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b  nt)pCur->nKey );
5130: 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b  .    if( pKey ){
5140: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
5150: 74 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72  te3BtreeKey(pCur
5160: 2c 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e  , 0, (int)pCur->
5170: 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20  nKey, pKey);.   
5180: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
5190: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
51a0: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65  pCur->pKey = pKe
51b0: 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  y;.      }else{.
51c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
51d0: 66 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20  free(pKey);.    
51e0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
51f0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
5200: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
5210: 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 75  }.  assert( !pCu
5220: 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
5230: 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70  tKey || !pCur->p
5240: 4b 65 79 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  Key );..  if( rc
5250: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5260: 20 20 20 62 74 72 65 65 52 65 6c 65 61 73 65 41     btreeReleaseA
5270: 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70 43  llCursorPages(pC
5280: 75 72 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65  ur);.    pCur->e
5290: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52  State = CURSOR_R
52a0: 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a  EQUIRESEEK;.  }.
52b0: 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65  .  invalidateOve
52c0: 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
52d0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
52e0: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
52f0: 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c   positions of al
5300: 6c 20 63 75 72 73 6f 72 73 20 28 65 78 63 65 70  l cursors (excep
5310: 74 20 70 45 78 63 65 70 74 29 20 74 68 61 74 20  t pExcept) that 
5320: 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74  are open on.** t
5330: 68 65 20 74 61 62 6c 65 20 20 77 69 74 68 20 72  he table  with r
5340: 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20  oot-page iRoot. 
5350: 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73  Usually, this is
5360: 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66   called just bef
5370: 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70 45  ore cursor.** pE
5380: 78 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f  xcept is used to
5390: 20 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62 6c   modify the tabl
53a0: 65 20 28 42 74 72 65 65 44 65 6c 65 74 65 28 29  e (BtreeDelete()
53b0: 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28   or BtreeInsert(
53c0: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ))..*/.static in
53d0: 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  t saveAllCursors
53e0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
53f0: 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75  Pgno iRoot, BtCu
5400: 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a  rsor *pExcept){.
5410: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
5420: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5430: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
5440: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
5450: 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20  ert( pExcept==0 
5460: 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d  || pExcept->pBt=
5470: 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d  =pBt );.  for(p=
5480: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
5490: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
54a0: 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70 74    if( p!=pExcept
54b0: 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c   && (0==iRoot ||
54c0: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52   p->pgnoRoot==iR
54d0: 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66  oot) ){.      if
54e0: 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  ( p->eState==CUR
54f0: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
5500: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61       int rc = sa
5510: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
5520: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
5530: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
5540: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
5550: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
5560: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5570: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
5580: 70 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20  p->iPage>0 );.  
5590: 20 20 20 20 20 20 62 74 72 65 65 52 65 6c 65 61        btreeRelea
55a0: 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73  seAllCursorPages
55b0: 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (p);.      }.   
55c0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
55d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
55e0: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75  .** Clear the cu
55f0: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
5600: 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ition..*/.void s
5610: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
5620: 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
5630: 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
5640: 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
5650: 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71  ex(pCur) );.  sq
5660: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
5670: 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e  >pKey);.  pCur->
5680: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72  pKey = 0;.  pCur
5690: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
56a0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a  R_INVALID;.}../*
56b0: 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73  .** In this vers
56c0: 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65  ion of BtreeMove
56d0: 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61  to, pKey is a pa
56e0: 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72  cked index recor
56f0: 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20  d.** such as is 
5700: 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65  generated by the
5710: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
5720: 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74  pcode.  Unpack t
5730: 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64  he.** record and
5740: 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65   then call Btree
5750: 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29  MovetoUnpacked()
5760: 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e   to do the work.
5770: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
5780: 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74  treeMoveto(.  Bt
5790: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
57a0: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e    /* Cursor open
57b0: 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f   on the btree to
57c0: 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a   be searched */.
57d0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
57e0: 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20  ey,   /* Packed 
57f0: 6b 65 79 20 69 66 20 74 68 65 20 62 74 72 65 65  key if the btree
5800: 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a   is an index */.
5810: 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20    i64 nKey,     
5820: 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
5830: 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e   key for tables.
5840: 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66    Size of pKey f
5850: 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  or indices */.  
5860: 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20 20  int bias,       
5870: 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72      /* Bias sear
5880: 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65  ch to the high e
5890: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
58a0: 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  s           /* W
58b0: 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75  rite search resu
58c0: 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
58d0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
58e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
58f0: 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20  tatus code */.  
5900: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
5910: 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e  pIdxKey;   /* Un
5920: 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
5930: 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 70 61 63   */.  char aSpac
5940: 65 5b 32 30 30 5d 3b 20 20 20 20 20 20 20 20 20  e[200];         
5950: 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66   /* Temp space f
5960: 6f 72 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20  or pIdxKey - to 
5970: 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a  avoid a malloc *
5980: 2f 0a 20 20 63 68 61 72 20 2a 70 46 72 65 65 20  /.  char *pFree 
5990: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79  = 0;..  if( pKey
59a0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
59b0: 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29  nKey==(i64)(int)
59c0: 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78  nKey );.    pIdx
59d0: 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Key = sqlite3Vdb
59e0: 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65  eAllocUnpackedRe
59f0: 63 6f 72 64 28 0a 20 20 20 20 20 20 20 20 70 43  cord(.        pC
5a00: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 61 53  ur->pKeyInfo, aS
5a10: 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70  pace, sizeof(aSp
5a20: 61 63 65 29 2c 20 26 70 46 72 65 65 0a 20 20 20  ace), &pFree.   
5a30: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78   );.    if( pIdx
5a40: 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Key==0 ) return 
5a50: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
5a60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63    sqlite3VdbeRec
5a70: 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e  ordUnpack(pCur->
5a80: 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e  pKeyInfo, (int)n
5a90: 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b  Key, pKey, pIdxK
5aa0: 65 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  ey);.    if( pId
5ab0: 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20  xKey->nField==0 
5ac0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5ad0: 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  DbFree(pCur->pKe
5ae0: 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65  yInfo->db, pFree
5af0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
5b00: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
5b10: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  KPT;.    }.  }el
5b20: 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20  se{.    pIdxKey 
5b30: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  = 0;.  }.  rc = 
5b40: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
5b50: 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c  toUnpacked(pCur,
5b60: 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20   pIdxKey, nKey, 
5b70: 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69  bias, pRes);.  i
5b80: 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20  f( pFree ){.    
5b90: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43  sqlite3DbFree(pC
5ba0: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  ur->pKeyInfo->db
5bb0: 2c 20 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20  , pFree);.  }.  
5bc0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5bd0: 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20  .** Restore the 
5be0: 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f  cursor to the po
5bf0: 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e  sition it was in
5c00: 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f   (or as close to
5c10: 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a   as possible).**
5c20: 20 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72   when saveCursor
5c30: 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63  Position() was c
5c40: 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74  alled. Note that
5c50: 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74   this call delet
5c60: 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64  es the .** saved
5c70: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73   position info s
5c80: 74 6f 72 65 64 20 62 79 20 73 61 76 65 43 75 72  tored by saveCur
5c90: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73  sorPosition(), s
5ca0: 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  o there can be.*
5cb0: 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66  * at most one ef
5cc0: 66 65 63 74 69 76 65 20 72 65 73 74 6f 72 65 43  fective restoreC
5cd0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
5ce0: 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20  call after each 
5cf0: 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f  .** saveCursorPo
5d00: 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61  sition()..*/.sta
5d10: 74 69 63 20 69 6e 74 20 62 74 72 65 65 52 65 73  tic int btreeRes
5d20: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5d30: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
5d40: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
5d50: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
5d60: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
5d70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
5d80: 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
5d90: 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
5da0: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
5db0: 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
5dc0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
5dd0: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20  Cur->skipNext;. 
5de0: 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74   }.  pCur->eStat
5df0: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
5e00: 49 44 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  ID;.  rc = btree
5e10: 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75  Moveto(pCur, pCu
5e20: 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e  r->pKey, pCur->n
5e30: 4b 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73  Key, 0, &pCur->s
5e40: 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20  kipNext);.  if( 
5e50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5e60: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
5e70: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
5e80: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
5e90: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
5ea0: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
5eb0: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
5ec0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
5ed0: 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20  R_INVALID );.   
5ee0: 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
5ef0: 65 78 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74  ext && pCur->eSt
5f00: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
5f10: 44 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  D ){.      pCur-
5f20: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
5f30: 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d  _SKIPNEXT;.    }
5f40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5f50: 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73  ;.}..#define res
5f60: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5f70: 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53  on(p) \.  (p->eS
5f80: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
5f90: 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20  UIRESEEK ? \.   
5fa0: 20 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f        btreeResto
5fb0: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
5fc0: 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20  (p) : \.        
5fd0: 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a   SQLITE_OK)../*.
5fe0: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65  ** Determine whe
5ff0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75  ther or not a cu
6000: 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66  rsor has moved f
6010: 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  rom the position
6020: 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20   it.** was last 
6030: 70 6c 61 63 65 64 20 61 74 2e 20 20 43 75 72 73  placed at.  Curs
6040: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
6050: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
6060: 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61  re pointing.** a
6070: 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74  t is deleted out
6080: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
6090: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
60a0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 6e 20  tine returns an 
60b0: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73 6f  error code if so
60c0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
60d0: 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74 65  ng.  The.** inte
60e0: 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64 20 69  ger *pHasMoved i
60f0: 73 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73  s set as follows
6100: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 30 3a 20 20 20  :.**.**    0:   
6110: 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 75 6e  The cursor is un
6120: 63 68 61 6e 67 65 64 0a 2a 2a 20 20 20 20 31 3a  changed.**    1:
6130: 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
6140: 20 73 74 69 6c 6c 20 70 6f 69 6e 74 69 6e 67 20   still pointing 
6150: 61 74 20 74 68 65 20 73 61 6d 65 20 72 6f 77 2c  at the same row,
6160: 20 62 75 74 20 74 68 65 20 70 6f 69 6e 74 65 72   but the pointer
6170: 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 72 65 74  s.**         ret
6180: 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
6190: 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 29 20  BtreeKeyFetch() 
61a0: 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  or sqlite3BtreeD
61b0: 61 74 61 46 65 74 63 68 28 29 0a 2a 2a 20 20 20  ataFetch().**   
61c0: 20 20 20 20 20 20 6d 69 67 68 74 20 6e 6f 77 20        might now 
61d0: 62 65 20 69 6e 76 61 6c 69 64 20 62 65 63 61 75  be invalid becau
61e0: 73 65 20 6f 66 20 61 20 62 61 6c 61 6e 63 65 28  se of a balance(
61f0: 29 20 6f 72 20 6f 74 68 65 72 20 63 68 61 6e 67  ) or other chang
6200: 65 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  e to the.**     
6210: 20 20 20 20 62 2d 74 72 65 65 2e 0a 2a 2a 20 20      b-tree..**  
6220: 20 20 32 3a 20 20 20 54 68 65 20 63 75 72 73 6f    2:   The curso
6230: 72 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 70  r is no longer p
6240: 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 72  ointing to the r
6250: 6f 77 2e 20 20 54 68 65 20 72 6f 77 20 6d 69 67  ow.  The row mig
6260: 68 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 20  ht have.**      
6270: 20 20 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20     been deleted 
6280: 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
6290: 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 69 6e  he cursor..*/.in
62a0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
62b0: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43  rsorHasMoved(BtC
62c0: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
62d0: 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20   *pHasMoved){.  
62e0: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70  int rc;..  if( p
62f0: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
6300: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
6310: 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b   *pHasMoved = 0;
6320: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6330: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20  TE_OK;.  }.  rc 
6340: 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
6350: 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
6360: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
6370: 70 48 61 73 4d 6f 76 65 64 20 3d 20 32 3b 0a 20  pHasMoved = 2;. 
6380: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
6390: 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  }.  if( pCur->eS
63a0: 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
63b0: 49 44 20 7c 7c 20 4e 45 56 45 52 28 70 43 75 72  ID || NEVER(pCur
63c0: 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 30 29 20 29  ->skipNext!=0) )
63d0: 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64  {.    *pHasMoved
63e0: 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 2;.  }else{. 
63f0: 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20     *pHasMoved = 
6400: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
6410: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
6420: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6430: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
6440: 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20  ** Given a page 
6450: 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75  number of a regu
6460: 6c 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67  lar database pag
6470: 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61  e, return the pa
6480: 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72  ge.** number for
6490: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
64a0: 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
64b0: 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f  ins the entry fo
64c0: 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70  r the.** input p
64d0: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a  age number..**.*
64e0: 2a 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20  * Return 0 (not 
64f0: 61 20 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f  a valid page) fo
6500: 72 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20  r pgno==1 since 
6510: 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70  there is.** no p
6520: 6f 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63  ointer map assoc
6530: 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20  iated with page 
6540: 31 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69 74  1.  The integrit
6550: 79 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a  y_check logic.**
6560: 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20 70   requires that p
6570: 74 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29  trmapPageno(*,1)
6580: 21 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  !=1..*/.static P
6590: 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f  gno ptrmapPageno
65a0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
65b0: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
65c0: 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  t nPagesPerMapPa
65d0: 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d  ge;.  Pgno iPtrM
65e0: 61 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72  ap, ret;.  asser
65f0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
6600: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
6610: 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c  ) );.  if( pgno<
6620: 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  2 ) return 0;.  
6630: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
6640: 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
6650: 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72  ize/5)+1;.  iPtr
6660: 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e  Map = (pgno-2)/n
6670: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b  PagesPerMapPage;
6680: 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61  .  ret = (iPtrMa
6690: 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  p*nPagesPerMapPa
66a0: 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20  ge) + 2; .  if( 
66b0: 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ret==PENDING_BYT
66c0: 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
66d0: 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20     ret++;.  }.  
66e0: 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
66f0: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e  *.** Write an en
6700: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
6710: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
6720: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64  This routine upd
6730: 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ates the pointer
6740: 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
6750: 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27  age number 'key'
6760: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d  .** so that it m
6770: 61 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79  aps to type 'eTy
6780: 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70  pe' and parent p
6790: 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f  age number 'pgno
67a0: 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43  '..**.** If *pRC
67b0: 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f   is initially no
67c0: 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49  n-zero (non-SQLI
67d0: 54 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73  TE_OK) then this
67e0: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61   routine is.** a
67f0: 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65   no-op.  If an e
6800: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
6810: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
6820: 6f 72 20 63 6f 64 65 20 69 73 20 77 72 69 74 74  or code is writt
6830: 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e  en.** into *pRC.
6840: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6850: 70 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72  ptrmapPut(BtShar
6860: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
6870: 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e  y, u8 eType, Pgn
6880: 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70  o parent, int *p
6890: 52 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  RC){.  DbPage *p
68a0: 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20  DbPage;  /* The 
68b0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
68c0: 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61   */.  u8 *pPtrma
68d0: 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  p;      /* The p
68e0: 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20  ointer map data 
68f0: 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61  */.  Pgno iPtrma
6900: 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  p;     /* The po
6910: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e  inter map page n
6920: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f  umber */.  int o
6930: 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  ffset;       /* 
6940: 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65  Offset in pointe
6950: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
6960: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
6970: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
6980: 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f   from subfunctio
6990: 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52  ns */..  if( *pR
69a0: 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  C ) return;..  a
69b0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
69c0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
69d0: 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68  utex) );.  /* Th
69e0: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
69f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73   page number mus
6a00: 74 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20  t never be used 
6a10: 61 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70  as a pointer map
6a20: 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72   page */.  asser
6a30: 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50  t( 0==PTRMAP_ISP
6a40: 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47  AGE(pBt, PENDING
6a50: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29  _BYTE_PAGE(pBt))
6a60: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
6a70: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
6a80: 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29  ;.  if( key==0 )
6a90: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  {.    *pRC = SQL
6aa0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
6ab0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
6ac0: 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  }.  iPtrmap = PT
6ad0: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
6ae0: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
6af0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
6b00: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
6b10: 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ap, &pDbPage);. 
6b20: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6b30: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  OK ){.    *pRC =
6b40: 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   rc;.    return;
6b50: 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20  .  }.  offset = 
6b60: 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54  PTRMAP_PTROFFSET
6b70: 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a  (iPtrmap, key);.
6b80: 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29    if( offset<0 )
6b90: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  {.    *pRC = SQL
6ba0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
6bb0: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61  ;.    goto ptrma
6bc0: 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73  p_exit;.  }.  as
6bd0: 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20  sert( offset <= 
6be0: 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65  (int)pBt->usable
6bf0: 53 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72  Size-5 );.  pPtr
6c00: 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  map = (u8 *)sqli
6c10: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
6c20: 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28  pDbPage);..  if(
6c30: 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b   eType!=pPtrmap[
6c40: 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62  offset] || get4b
6c50: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
6c60: 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20  set+1])!=parent 
6c70: 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50  ){.    TRACE(("P
6c80: 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64  TRMAP_UPDATE: %d
6c90: 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65  ->(%d,%d)\n", ke
6ca0: 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74  y, eType, parent
6cb0: 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63  ));.    *pRC= rc
6cc0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
6cd0: 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
6ce0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
6cf0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
6d00: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20  trmap[offset] = 
6d10: 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74  eType;.      put
6d20: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
6d30: 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74  ffset+1], parent
6d40: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74  );.    }.  }..pt
6d50: 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c  rmap_exit:.  sql
6d60: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
6d70: 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  DbPage);.}../*.*
6d80: 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20  * Read an entry 
6d90: 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72  from the pointer
6da0: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
6db0: 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76   routine retriev
6dc0: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
6dd0: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
6de0: 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67  e 'key', writing
6df0: 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64  .** the type and
6e00: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
6e10: 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61  ber to *pEType a
6e20: 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63  nd *pPgno respec
6e30: 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72  tively..** An er
6e40: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
6e50: 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e  rned if somethin
6e60: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74  g goes wrong, ot
6e70: 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f  herwise SQLITE_O
6e80: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
6e90: 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61   ptrmapGet(BtSha
6ea0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b  red *pBt, Pgno k
6eb0: 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20  ey, u8 *pEType, 
6ec0: 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20  Pgno *pPgno){.  
6ed0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
6ee0: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
6ef0: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
6f00: 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20  int iPtrmap;    
6f10: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
6f20: 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a  p page index */.
6f30: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
6f40: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
6f50: 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f  map page data */
6f60: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
6f70: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
6f80: 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e  of entry in poin
6f90: 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74  ter map */.  int
6fa0: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
6fb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
6fc0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
6fd0: 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50  ;..  iPtrmap = P
6fe0: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
6ff0: 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73  , key);.  rc = s
7000: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
7010: 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72  Bt->pPager, iPtr
7020: 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  map, &pDbPage);.
7030: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
7040: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
7050: 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75  }.  pPtrmap = (u
7060: 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  8 *)sqlite3Pager
7070: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
7080: 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54  ;..  offset = PT
7090: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
70a0: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
70b0: 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a  if( offset<0 ){.
70c0: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
70d0: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
70e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
70f0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7100: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66    }.  assert( of
7110: 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74  fset <= (int)pBt
7120: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29  ->usableSize-5 )
7130: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79  ;.  assert( pETy
7140: 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79  pe!=0 );.  *pETy
7150: 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66  pe = pPtrmap[off
7160: 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e  set];.  if( pPgn
7170: 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74  o ) *pPgno = get
7180: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
7190: 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71  ffset+1]);..  sq
71a0: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
71b0: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
71c0: 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45  *pEType<1 || *pE
71d0: 54 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20  Type>5 ) return 
71e0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
71f0: 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  KPT;.  return SQ
7200: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73  LITE_OK;.}..#els
7210: 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20  e /* if defined 
7220: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
7230: 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66  VACUUM */.  #def
7240: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c  ine ptrmapPut(w,
7250: 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66  x,y,z,rc).  #def
7260: 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c  ine ptrmapGet(w,
7270: 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  x,y,z) SQLITE_OK
7280: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
7290: 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79  pPutOvflPtr(x, y
72a0: 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  , rc).#endif../*
72b0: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65  .** Given a btre
72c0: 65 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c  e page and a cel
72d0: 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73  l index (0 means
72e0: 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
72f0: 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20  on.** the page, 
7300: 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f  1 means the seco
7310: 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20  nd cell, and so 
7320: 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20  forth) return a 
7330: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
7340: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a  e cell content..
7350: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
7360: 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f  ne works only fo
7370: 72 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20  r pages that do 
7380: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72  not contain over
7390: 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23  flow cells..*/.#
73a0: 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28  define findCell(
73b0: 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61  P,I) \.  ((P)->a
73c0: 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73  Data + ((P)->mas
73d0: 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65  kPage & get2byte
73e0: 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b  (&(P)->aCellIdx[
73f0: 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e  2*(I)]))).#defin
7400: 65 20 66 69 6e 64 43 65 6c 6c 76 32 28 44 2c 4d  e findCellv2(D,M
7410: 2c 4f 2c 49 29 20 28 44 2b 28 4d 26 67 65 74 32  ,O,I) (D+(M&get2
7420: 62 79 74 65 28 44 2b 28 4f 2b 32 2a 28 49 29 29  byte(D+(O+2*(I))
7430: 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ))).../*.** This
7440: 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20   a more complex 
7450: 76 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43  version of findC
7460: 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73  ell() that works
7470: 20 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68   for.** pages th
7480: 61 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76  at do contain ov
7490: 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f  erflow cells..*/
74a0: 0a 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64  .static u8 *find
74b0: 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d  OverflowCell(Mem
74c0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
74d0: 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69   iCell){.  int i
74e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
74f0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
7500: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
7510: 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61  ) );.  for(i=pPa
7520: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b  ge->nOverflow-1;
7530: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
7540: 20 69 6e 74 20 6b 3b 0a 20 20 20 20 6b 20 3d 20   int k;.    k = 
7550: 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 69 5d  pPage->aiOvfl[i]
7560: 3b 0a 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65  ;.    if( k<=iCe
7570: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ll ){.      if( 
7580: 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20  k==iCell ){.    
7590: 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
75a0: 2d 3e 61 70 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20  ->apOvfl[i];.   
75b0: 20 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c     }.      iCell
75c0: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  --;.    }.  }.  
75d0: 72 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28  return findCell(
75e0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d  pPage, iCell);.}
75f0: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20  ../*.** Parse a 
7600: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f  cell content blo
7610: 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74  ck and fill in t
7620: 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75  he CellInfo stru
7630: 63 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a  cture.  There.**
7640: 20 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e   are two version
7650: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
7660: 6f 6e 2e 20 20 62 74 72 65 65 50 61 72 73 65 43  on.  btreeParseC
7670: 65 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a  ell() takes a .*
7680: 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20  * cell index as 
7690: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
76a0: 65 6e 74 20 61 6e 64 20 62 74 72 65 65 50 61 72  ent and btreePar
76b0: 73 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20  seCellPtr() .** 
76c0: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
76d0: 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74  to the body of t
76e0: 68 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73  he cell as its s
76f0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
7700: 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69  **.** Within thi
7710: 73 20 66 69 6c 65 2c 20 74 68 65 20 70 61 72 73  s file, the pars
7720: 65 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61  eCell() macro ca
7730: 6e 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74  n be called inst
7740: 65 61 64 20 6f 66 0a 2a 2a 20 62 74 72 65 65 50  ead of.** btreeP
7750: 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20 55  arseCellPtr(). U
7760: 73 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c  sing some compil
7770: 65 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62  ers, this will b
7780: 65 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 73 74 61  e faster..*/.sta
7790: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61  tic void btreePa
77a0: 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65  rseCellPtr(.  Me
77b0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
77c0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
77d0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
77e0: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  l */.  u8 *pCell
77f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
7800: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
7810: 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20   cell text. */. 
7820: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
7830: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
7840: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
7850: 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e  re */.){.  u16 n
7860: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7870: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74     /* Number byt
7880: 65 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65  es in cell conte
7890: 6e 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  nt header */.  u
78a0: 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20  32 nPayload;    
78b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
78c0: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c   of bytes of cel
78d0: 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20  l payload */..  
78e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
78f0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
7900: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
7910: 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c  ..  pInfo->pCell
7920: 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65   = pCell;.  asse
7930: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
7940: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61  =0 || pPage->lea
7950: 66 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50  f==1 );.  n = pP
7960: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
7970: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  e;.  assert( n==
7980: 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20  4-4*pPage->leaf 
7990: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
79a0: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69 66  intKey ){.    if
79b0: 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
79c0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
79d0: 28 20 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( n==0 );.      
79e0: 6e 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  n = getVarint32(
79f0: 70 43 65 6c 6c 2c 20 6e 50 61 79 6c 6f 61 64 29  pCell, nPayload)
7a00: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7a10: 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b     nPayload = 0;
7a20: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20  .    }.    n += 
7a30: 67 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  getVarint(&pCell
7a40: 5b 6e 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66  [n], (u64*)&pInf
7a50: 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49  o->nKey);.    pI
7a60: 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61  nfo->nData = nPa
7a70: 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  yload;.  }else{.
7a80: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61      pInfo->nData
7a90: 20 3d 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67   = 0;.    n += g
7aa0: 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c  etVarint32(&pCel
7ab0: 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  l[n], nPayload);
7ac0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79  .    pInfo->nKey
7ad0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d   = nPayload;.  }
7ae0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
7af0: 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ad = nPayload;. 
7b00: 20 70 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20   pInfo->nHeader 
7b10: 3d 20 6e 3b 0a 20 20 74 65 73 74 63 61 73 65 28  = n;.  testcase(
7b20: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
7b30: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
7b40: 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f  testcase( nPaylo
7b50: 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad==pPage->maxLo
7b60: 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6c  cal+1 );.  if( l
7b70: 69 6b 65 6c 79 28 6e 50 61 79 6c 6f 61 64 3c 3d  ikely(nPayload<=
7b80: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29  pPage->maxLocal)
7b90: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
7ba0: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
7bb0: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
7bc0: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
7bd0: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
7be0: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
7bf0: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
7c00: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
7c10: 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49 6e 66  */.    if( (pInf
7c20: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29  o->nSize = (u16)
7c30: 28 6e 2b 6e 50 61 79 6c 6f 61 64 29 29 3c 34 20  (n+nPayload))<4 
7c40: 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d  ) pInfo->nSize =
7c50: 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   4;.    pInfo->n
7c60: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61  Local = (u16)nPa
7c70: 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f  yload;.    pInfo
7c80: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->iOverflow = 0;
7c90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
7ca0: 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20   If the payload 
7cb0: 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d  will not fit com
7cc0: 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c  pletely on the l
7cd0: 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61  ocal page, we ha
7ce0: 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 63  ve.    ** to dec
7cf0: 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  ide how much to 
7d00: 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e  store locally an
7d10: 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70  d how much to sp
7d20: 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20  ill onto.    ** 
7d30: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
7d40: 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73   The strategy is
7d50: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   to minimize the
7d60: 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65   amount of unuse
7d70: 64 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 6f  d.    ** space o
7d80: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  n overflow pages
7d90: 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74   while keeping t
7da0: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63  he amount of loc
7db0: 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 20 20 2a  al storage.    *
7dc0: 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e  * in between min
7dd0: 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63  Local and maxLoc
7de0: 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  al..    **.    *
7df0: 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e  * Warning:  chan
7e00: 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65  ging the way ove
7e10: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73  rflow payload is
7e20: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
7e30: 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79 20 77  any.    ** way w
7e40: 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  ill result in an
7e50: 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69   incompatible fi
7e60: 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a  le format..    *
7e70: 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63  /.    int minLoc
7e80: 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  al;  /* Minimum 
7e90: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
7ea0: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
7eb0: 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63  /.    int maxLoc
7ec0: 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20  al;  /* Maximum 
7ed0: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
7ee0: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
7ef0: 2f 0a 20 20 20 20 69 6e 74 20 73 75 72 70 6c 75  /.    int surplu
7f00: 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  s;   /* Overflow
7f10: 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62   payload availab
7f20: 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f  le for local sto
7f30: 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e  rage */..    min
7f40: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
7f50: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78  inLocal;.    max
7f60: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
7f70: 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72  axLocal;.    sur
7f80: 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  plus = minLocal 
7f90: 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69  + (nPayload - mi
7fa0: 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e  nLocal)%(pPage->
7fb0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
7fc0: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
7fd0: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
7fe0: 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  Local );.    tes
7ff0: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
8000: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
8010: 20 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d    if( surplus <=
8020: 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20   maxLocal ){.   
8030: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
8040: 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b   = (u16)surplus;
8050: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8060: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
8070: 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b  = (u16)minLocal;
8080: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f  .    }.    pInfo
8090: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75  ->iOverflow = (u
80a0: 31 36 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61  16)(pInfo->nLoca
80b0: 6c 20 2b 20 6e 29 3b 0a 20 20 20 20 70 49 6e 66  l + n);.    pInf
80c0: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f  o->nSize = pInfo
80d0: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b  ->iOverflow + 4;
80e0: 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 70  .  }.}.#define p
80f0: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
8100: 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a  iCell, pInfo) \.
8110: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
8120: 50 74 72 28 28 70 50 61 67 65 29 2c 20 66 69 6e  Ptr((pPage), fin
8130: 64 43 65 6c 6c 28 28 70 50 61 67 65 29 2c 20 28  dCell((pPage), (
8140: 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e 66 6f 29  iCell)), (pInfo)
8150: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  ).static void bt
8160: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20  reeParseCell(.  
8170: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8180: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
8190: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
81a0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ell */.  int iCe
81b0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
81c0: 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64   /* The cell ind
81d0: 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20  ex.  First cell 
81e0: 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  is 0 */.  CellIn
81f0: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
8200: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
8210: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
8220: 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50  {.  parseCell(pP
8230: 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66  age, iCell, pInf
8240: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  o);.}../*.** Com
8250: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e  pute the total n
8260: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
8270: 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73  hat a Cell needs
8280: 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   in the cell.** 
8290: 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65  data area of the
82a0: 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68   btree-page.  Th
82b0: 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20  e return number 
82c0: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c  includes the cel
82d0: 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72  l.** data header
82e0: 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70   and the local p
82f0: 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20  ayload, but not 
8300: 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
8310: 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63  e or.** the spac
8320: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65  e used by the ce
8330: 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  ll pointer..*/.s
8340: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
8350: 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  zePtr(MemPage *p
8360: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
8370: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20  {.  u8 *pIter = 
8380: 26 70 43 65 6c 6c 5b 70 50 61 67 65 2d 3e 63 68  &pCell[pPage->ch
8390: 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 75  ildPtrSize];.  u
83a0: 33 32 20 6e 53 69 7a 65 3b 0a 0a 23 69 66 64 65  32 nSize;..#ifde
83b0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
83c0: 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65   /* The value re
83d0: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66  turned by this f
83e0: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61  unction should a
83f0: 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d  lways be the sam
8400: 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43  e as.  ** the (C
8410: 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76  ellInfo.nSize) v
8420: 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f  alue found by do
8430: 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65  ing a full parse
8440: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c   of the.  ** cel
8450: 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42  l. If SQLITE_DEB
8460: 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  UG is defined, a
8470: 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68  n assert() at th
8480: 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a  e bottom of.  **
8490: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76   this function v
84a0: 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69  erifies that thi
84b0: 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e  s invariant is n
84c0: 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a  ot violated. */.
84d0: 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67    CellInfo debug
84e0: 69 6e 66 6f 3b 0a 20 20 62 74 72 65 65 50 61 72  info;.  btreePar
84f0: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
8500: 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e   pCell, &debugin
8510: 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  fo);.#endif..  i
8520: 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
8530: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
8540: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
8550: 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
8560: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
8570: 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53  rint32(pIter, nS
8580: 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ize);.    }else{
8590: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 30  .      nSize = 0
85a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
85b0: 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73  pIter now points
85c0: 20 61 74 20 74 68 65 20 36 34 2d 62 69 74 20 69   at the 64-bit i
85d0: 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65  nteger key value
85e0: 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  , a variable len
85f0: 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65  gth .    ** inte
8600: 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ger. The followi
8610: 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70  ng block moves p
8620: 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  Iter to point at
8630: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a   the first byte.
8640: 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20      ** past the 
8650: 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76  end of the key v
8660: 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e  alue. */.    pEn
8670: 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20  d = &pIter[9];. 
8680: 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65     while( (*pIte
8690: 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74  r++)&0x80 && pIt
86a0: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 65 6c  er<pEnd );.  }el
86b0: 73 65 7b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d  se{.    pIter +=
86c0: 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74   getVarint32(pIt
86d0: 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a  er, nSize);.  }.
86e0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
86f0: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
8700: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
8710: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
8720: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
8730: 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65   if( nSize>pPage
8740: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
8750: 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d    int minLocal =
8760: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
8770: 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69  ;.    nSize = mi
8780: 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20  nLocal + (nSize 
8790: 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70  - minLocal) % (p
87a0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
87b0: 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
87c0: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
87d0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
87e0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
87f0: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
8800: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
8810: 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67    if( nSize>pPag
8820: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
8830: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e       nSize = min
8840: 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  Local;.    }.   
8850: 20 6e 53 69 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d   nSize += 4;.  }
8860: 0a 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32  .  nSize += (u32
8870: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
8880: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 69 6e 69  ;..  /* The mini
8890: 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20  mum size of any 
88a0: 63 65 6c 6c 20 69 73 20 34 20 62 79 74 65 73 2e  cell is 4 bytes.
88b0: 20 2a 2f 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c   */.  if( nSize<
88c0: 34 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d  4 ){.    nSize =
88d0: 20 34 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72   4;.  }..  asser
88e0: 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69  t( nSize==debugi
88f0: 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 72  nfo.nSize );.  r
8900: 65 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65  eturn (u16)nSize
8910: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
8920: 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73  TE_DEBUG./* This
8930: 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65   variation on ce
8940: 6c 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75  llSizePtr() is u
8950: 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73  sed inside of as
8960: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
8970: 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74  s.** only. */.st
8980: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
8990: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
89a0: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
89b0: 72 65 74 75 72 6e 20 63 65 6c 6c 53 69 7a 65 50  return cellSizeP
89c0: 74 72 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65  tr(pPage, findCe
89d0: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29  ll(pPage, iCell)
89e0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
89f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8a00: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
8a10: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43  * If the cell pC
8a20: 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67  ell, part of pag
8a30: 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  e pPage contains
8a40: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
8a50: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
8a60: 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74  e, insert an ent
8a70: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
8a80: 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74  ter-map.** for t
8a90: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
8aa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8ab0: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
8ac0: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
8ad0: 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74  , u8 *pCell, int
8ae0: 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e   *pRC){.  CellIn
8af0: 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a  fo info;.  if( *
8b00: 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  pRC ) return;.  
8b10: 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30  assert( pCell!=0
8b20: 20 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65   );.  btreeParse
8b30: 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
8b40: 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
8b50: 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44  assert( (info.nD
8b60: 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ata+(pPage->intK
8b70: 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29  ey?0:info.nKey))
8b80: 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  ==info.nPayload 
8b90: 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f  );.  if( info.iO
8ba0: 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 50  verflow ){.    P
8bb0: 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62  gno ovfl = get4b
8bc0: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
8bd0: 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
8be0: 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65   ptrmapPut(pPage
8bf0: 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52  ->pBt, ovfl, PTR
8c00: 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70  MAP_OVERFLOW1, p
8c10: 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29  Page->pgno, pRC)
8c20: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
8c30: 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e  ./*.** Defragmen
8c40: 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  t the page given
8c50: 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65  .  All Cells are
8c60: 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a   moved to the.**
8c70: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
8c80: 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70   and all free sp
8c90: 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64  ace is collected
8ca0: 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67   into one.** big
8cb0: 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63   FreeBlk that oc
8cc0: 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20  curs in between 
8cd0: 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 63  the header and c
8ce0: 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61  ell.** pointer a
8cf0: 72 72 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c  rray and the cel
8d00: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a  l content area..
8d10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
8d20: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d  fragmentPage(Mem
8d30: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
8d40: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
8d50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
8d60: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
8d70: 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
8d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
8d90: 64 72 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20  dress of a i-th 
8da0: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64  cell */.  int hd
8db0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
8dc0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
8dd0: 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  o the page heade
8de0: 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b  r */.  int size;
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e00: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
8e10: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ell */.  int usa
8e20: 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  bleSize;        
8e30: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8e40: 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e   usable bytes on
8e50: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74   a page */.  int
8e60: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
8e70: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
8e80: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  t to the cell po
8e90: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
8ea0: 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20   int cbrk;      
8eb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
8ec0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
8ed0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
8ee0: 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
8ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8f00: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
8f10: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
8f20: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
8f30: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
8f40: 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a   The page data *
8f50: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
8f60: 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f  r *temp;       /
8f70: 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20  * Temp area for 
8f80: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
8f90: 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
8fa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
8fb0: 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
8fc0: 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20  cell index */.  
8fd0: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
8fe0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
8ff0: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
9000: 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73   index */...  as
9010: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
9020: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
9030: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
9040: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9050: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
9060: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
9070: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20  ->usableSize <= 
9080: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
9090: 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIZE );.  assert
90a0: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
90b0: 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
90c0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
90d0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
90e0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65  ->mutex) );.  te
90f0: 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  mp = sqlite3Page
9100: 72 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65  rTempSpace(pPage
9110: 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
9120: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
9130: 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70  aData;.  hdr = p
9140: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
9150: 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  .  cellOffset = 
9160: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
9170: 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  t;.  nCell = pPa
9180: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73  ge->nCell;.  ass
9190: 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32  ert( nCell==get2
91a0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
91b0: 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69  ]) );.  usableSi
91c0: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ze = pPage->pBt-
91d0: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63  >usableSize;.  c
91e0: 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26  brk = get2byte(&
91f0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
9200: 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 63 62 72  memcpy(&temp[cbr
9210: 6b 5d 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c  k], &data[cbrk],
9220: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 63 62   usableSize - cb
9230: 72 6b 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73  rk);.  cbrk = us
9240: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c  ableSize;.  iCel
9250: 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66  lFirst = cellOff
9260: 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20  set + 2*nCell;. 
9270: 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61   iCellLast = usa
9280: 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66  bleSize - 4;.  f
9290: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
92a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
92b0: 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65  Addr;     /* The
92c0: 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74   i-th cell point
92d0: 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20  er */.    pAddr 
92e0: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
92f0: 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70  et + i*2];.    p
9300: 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64  c = get2byte(pAd
9310: 64 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  dr);.    testcas
9320: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73  e( pc==iCellFirs
9330: 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
9340: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
9350: 20 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64   );.#if !defined
9360: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f  (SQLITE_ENABLE_O
9370: 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45  VERSIZE_CELL_CHE
9380: 43 4b 29 0a 20 20 20 20 2f 2a 20 54 68 65 73 65  CK).    /* These
9390: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65   conditions have
93a0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65   already been ve
93b0: 72 69 66 69 65 64 20 69 6e 20 62 74 72 65 65 49  rified in btreeI
93c0: 6e 69 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a  nitPage().    **
93d0: 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   if SQLITE_ENABL
93e0: 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f  E_OVERSIZE_CELL_
93f0: 43 48 45 43 4b 20 69 73 20 64 65 66 69 6e 65 64  CHECK is defined
9400: 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
9410: 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c   pc<iCellFirst |
9420: 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  | pc>iCellLast )
9430: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
9440: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
9450: 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  PT;.    }.#endif
9460: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3e  .    assert( pc>
9470: 3d 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70  =iCellFirst && p
9480: 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c<=iCellLast );.
9490: 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53      size = cellS
94a0: 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 74  izePtr(pPage, &t
94b0: 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62  emp[pc]);.    cb
94c0: 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 23 69 66 20  rk -= size;.#if 
94d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
94e0: 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43  NABLE_OVERSIZE_C
94f0: 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 69  ELL_CHECK).    i
9500: 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72  f( cbrk<iCellFir
9510: 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  st ){.      retu
9520: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
9530: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65  T_BKPT;.    }.#e
9540: 6c 73 65 0a 20 20 20 20 69 66 28 20 63 62 72 6b  lse.    if( cbrk
9550: 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
9560: 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a  c+size>usableSiz
9570: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
9580: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
9590: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e  _BKPT;.    }.#en
95a0: 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
95b0: 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c  cbrk+size<=usabl
95c0: 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69  eSize && cbrk>=i
95d0: 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20  CellFirst );.   
95e0: 20 74 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b   testcase( cbrk+
95f0: 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65  size==usableSize
9600: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
9610: 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c  ( pc+size==usabl
9620: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 6d 65 6d  eSize );.    mem
9630: 63 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c  cpy(&data[cbrk],
9640: 20 26 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65   &temp[pc], size
9650: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
9660: 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20  pAddr, cbrk);.  
9670: 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b  }.  assert( cbrk
9680: 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  >=iCellFirst );.
9690: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
96a0: 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a  [hdr+5], cbrk);.
96b0: 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20    data[hdr+1] = 
96c0: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d  0;.  data[hdr+2]
96d0: 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72   = 0;.  data[hdr
96e0: 2b 37 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65  +7] = 0;.  memse
96f0: 74 28 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72  t(&data[iCellFir
9700: 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65  st], 0, cbrk-iCe
9710: 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65  llFirst);.  asse
9720: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
9730: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
9740: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
9750: 20 69 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46   if( cbrk-iCellF
9760: 69 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72  irst!=pPage->nFr
9770: 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ee ){.    return
9780: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
9790: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
97a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
97b0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
97c0: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73  nByte bytes of s
97d0: 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  pace from within
97e0: 20 74 68 65 20 42 2d 54 72 65 65 20 70 61 67 65   the B-Tree page
97f0: 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
9800: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
9810: 2e 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49  . Write into *pI
9820: 64 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  dx the index int
9830: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  o pPage->aData[]
9840: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74  .** of the first
9850: 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74   byte of allocat
9860: 65 64 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e  ed space. Return
9870: 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f   either SQLITE_O
9880: 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  K or.** an error
9890: 20 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53   code (usually S
98a0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a  QLITE_CORRUPT)..
98b0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
98c0: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
98d0: 20 74 68 65 72 65 20 69 73 20 73 75 66 66 69 63   there is suffic
98e0: 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61  ient space to ma
98f0: 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61  ke the.** alloca
9900: 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  tion.  This rout
9910: 69 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74  ine might need t
9920: 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20  o defragment in 
9930: 6f 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a  order to bring.*
9940: 2a 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20  * all the space 
9950: 74 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65  together, howeve
9960: 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  r.  This routine
9970: 20 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e   will avoid usin
9980: 67 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74  g.** the first t
9990: 77 6f 20 62 79 74 65 73 20 70 61 73 74 20 74 68  wo bytes past th
99a0: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
99b0: 72 65 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d  rea since presum
99c0: 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c  ably this.** all
99d0: 6f 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  ocation is being
99e0: 20 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74   made in order t
99f0: 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63  o insert a new c
9a00: 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a  ell, so we will.
9a10: 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e  ** also end up n
9a20: 65 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c  eeding a new cel
9a30: 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  l pointer..*/.st
9a40: 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
9a50: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
9a60: 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65  pPage, int nByte
9a70: 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20  , int *pIdx){.  
9a80: 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
9a90: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
9aa0: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
9ab0: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64  che of pPage->hd
9ac0: 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20  rOffset */.  u8 
9ad0: 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70  * const data = p
9ae0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20  Page->aData;    
9af0: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
9b00: 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61   of pPage->aData
9b10: 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
9b40: 72 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c  rst byte of cell
9b50: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
9b60: 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20  .  int gap;     
9b70: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
9b80: 20 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e 20   of gap between 
9b90: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e  cell pointers an
9ba0: 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a  d cell content *
9bb0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
9bc0: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72      /* Integer r
9bd0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
9be0: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
9bf0: 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f  /* Usable size o
9c00: 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
9c10: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9c20: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
9c30: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
9c40: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
9c50: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
9c60: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
9c70: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
9c80: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
9c90: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
9ca0: 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d  >=0 );  /* Minim
9cb0: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
9cc0: 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  4 */.  assert( p
9cd0: 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79  Page->nFree>=nBy
9ce0: 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
9cf0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
9d00: 3d 3d 30 20 29 3b 0a 20 20 75 73 61 62 6c 65 53  ==0 );.  usableS
9d10: 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ize = pPage->pBt
9d20: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
9d30: 61 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20  assert( nByte < 
9d40: 75 73 61 62 6c 65 53 69 7a 65 2d 38 20 29 3b 0a  usableSize-8 );.
9d50: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9d60: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20  ->cellOffset == 
9d70: 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61  hdr + 12 - 4*pPa
9d80: 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61  ge->leaf );.  ga
9d90: 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  p = pPage->cellO
9da0: 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
9db0: 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74  >nCell;.  assert
9dc0: 28 20 67 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a  ( gap<=65536 );.
9dd0: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
9de0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
9df0: 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29 7b    if( gap>top ){
9e00: 0a 20 20 20 20 69 66 28 20 74 6f 70 3d 3d 30 20  .    if( top==0 
9e10: 29 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 36  ){.      top = 6
9e20: 35 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  5536;.    }else{
9e30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
9e40: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
9e50: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  T;.    }.  }..  
9e60: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 65  /* If there is e
9e70: 6e 6f 75 67 68 20 73 70 61 63 65 20 62 65 74 77  nough space betw
9e80: 65 65 6e 20 67 61 70 20 61 6e 64 20 74 6f 70 20  een gap and top 
9e90: 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65 6c  for one more cel
9ea0: 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61  l pointer.  ** a
9eb0: 72 72 61 79 20 65 6e 74 72 79 20 6f 66 66 73 65  rray entry offse
9ec0: 74 2c 20 61 6e 64 20 69 66 20 74 68 65 20 66 72  t, and if the fr
9ed0: 65 65 6c 69 73 74 20 69 73 20 6e 6f 74 20 65 6d  eelist is not em
9ee0: 70 74 79 2c 20 74 68 65 6e 20 73 65 61 72 63 68  pty, then search
9ef0: 20 74 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c 69   the.  ** freeli
9f00: 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  st looking for a
9f10: 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65   free slot big e
9f20: 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79  nough to satisfy
9f30: 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 20 20   the request..  
9f40: 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  */.  testcase( g
9f50: 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+2==top );.  t
9f60: 65 73 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d  estcase( gap+1==
9f70: 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73  top );.  testcas
9f80: 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20  e( gap==top );. 
9f90: 20 69 66 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20   if( gap+2<=top 
9fa0: 26 26 20 28 64 61 74 61 5b 68 64 72 2b 31 5d 20  && (data[hdr+1] 
9fb0: 7c 7c 20 64 61 74 61 5b 68 64 72 2b 32 5d 29 20  || data[hdr+2]) 
9fc0: 29 7b 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 61  ){.    int pc, a
9fd0: 64 64 72 3b 0a 20 20 20 20 66 6f 72 28 61 64 64  ddr;.    for(add
9fe0: 72 3d 68 64 72 2b 31 3b 20 28 70 63 20 3d 20 67  r=hdr+1; (pc = g
9ff0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
a000: 64 72 5d 29 29 3e 30 3b 20 61 64 64 72 3d 70 63  dr]))>0; addr=pc
a010: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a  ){.      int siz
a020: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
a030: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65   Size of the fre
a040: 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20  e slot */.      
a050: 69 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a  if( pc>usableSiz
a060: 65 2d 34 20 7c 7c 20 70 63 3c 61 64 64 72 2b 34  e-4 || pc<addr+4
a070: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
a080: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
a090: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
a0a0: 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74        size = get
a0b0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
a0c0: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69  ]);.      if( si
a0d0: 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20  ze>=nByte ){.   
a0e0: 20 20 20 20 20 69 6e 74 20 78 20 3d 20 73 69 7a       int x = siz
a0f0: 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  e - nByte;.     
a100: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
a110: 34 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  4 );.        tes
a120: 74 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20  tcase( x==3 );. 
a130: 20 20 20 20 20 20 20 69 66 28 20 78 3c 34 20 29         if( x<4 )
a140: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
a150: 64 61 74 61 5b 68 64 72 2b 37 5d 3e 3d 36 30 20  data[hdr+7]>=60 
a160: 29 20 67 6f 74 6f 20 64 65 66 72 61 67 6d 65 6e  ) goto defragmen
a170: 74 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  t_page;.        
a180: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
a190: 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72  slot from the fr
a1a0: 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20  ee-list. Update 
a1b0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
a1c0: 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d          ** fragm
a1d0: 65 6e 74 65 64 20 62 79 74 65 73 20 77 69 74 68  ented bytes with
a1e0: 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a  in the page. */.
a1f0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
a200: 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64  (&data[addr], &d
a210: 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20  ata[pc], 2);.   
a220: 20 20 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b         data[hdr+
a230: 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20 20 20  7] += (u8)x;.   
a240: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
a250: 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65 53  ize+pc > usableS
a260: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
a270: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
a280: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
a290: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a2a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f        /* The slo
a2b0: 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65  t remains on the
a2c0: 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75   free-list. Redu
a2d0: 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61  ce its size to a
a2e0: 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20  ccount.         
a2f0: 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74   ** for the port
a300: 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20  ion used by the 
a310: 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  new allocation. 
a320: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  */.          put
a330: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
a340: 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d  ], x);.        }
a350: 0a 20 20 20 20 20 20 20 20 2a 70 49 64 78 20 3d  .        *pIdx =
a360: 20 70 63 20 2b 20 78 3b 0a 20 20 20 20 20 20 20   pc + x;.       
a370: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a380: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
a390: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72  .  }..  /* The r
a3a0: 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74  equest could not
a3b0: 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75 73   be fulfilled us
a3c0: 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20 73  ing a freelist s
a3d0: 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a  lot.  Check.  **
a3e0: 20 74 6f 20 73 65 65 20 69 66 20 64 65 66 72 61   to see if defra
a3f0: 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65  gmentation is ne
a400: 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
a410: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b  testcase( gap+2+
a420: 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20  nByte==top );.  
a430: 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e  if( gap+2+nByte>
a440: 74 6f 70 20 29 7b 0a 64 65 66 72 61 67 6d 65 6e  top ){.defragmen
a450: 74 5f 70 61 67 65 3a 0a 20 20 20 20 74 65 73 74  t_page:.    test
a460: 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65  case( pPage->nCe
a470: 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  ll==0 );.    rc 
a480: 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  = defragmentPage
a490: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  (pPage);.    if(
a4a0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
a4b0: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
a4c0: 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61  yteNotZero(&data
a4d0: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73  [hdr+5]);.    as
a4e0: 73 65 72 74 28 20 67 61 70 2b 6e 42 79 74 65 3c  sert( gap+nByte<
a4f0: 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20  =top );.  }...  
a500: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
a510: 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20  ry from the gap 
a520: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63  in between the c
a530: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
a540: 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63  y.  ** and the c
a550: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
a560: 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e 69 74  .  The btreeInit
a570: 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20  Page() call has 
a580: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c  already.  ** val
a590: 69 64 61 74 65 64 20 74 68 65 20 66 72 65 65 6c  idated the freel
a5a0: 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74  ist.  Given that
a5b0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73   the freelist is
a5c0: 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20   valid, there.  
a5d0: 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61  ** is no way tha
a5e0: 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  t the allocation
a5f0: 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20   can extend off 
a600: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
a610: 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73  age..  ** The as
a620: 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72  sert() below ver
a630: 69 66 69 65 73 20 74 68 65 20 70 72 65 76 69 6f  ifies the previo
a640: 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a  us sentence..  *
a650: 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65  /.  top -= nByte
a660: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
a670: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
a680: 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e  .  assert( top+n
a690: 42 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61  Byte <= (int)pPa
a6a0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
a6b0: 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d  ize );.  *pIdx =
a6c0: 20 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53   top;.  return S
a6d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
a6e0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74  ** Return a sect
a6f0: 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65  ion of the pPage
a700: 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66  ->aData to the f
a710: 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20  reelist..** The 
a720: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
a730: 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b  e new free block
a740: 20 69 73 20 70 50 61 67 65 2d 3e 61 44 61 74 61   is pPage->aData
a750: 5b 69 53 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20  [iStart].** and 
a760: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
a770: 62 6c 6f 63 6b 20 69 73 20 69 53 69 7a 65 20 62  block is iSize b
a780: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61  ytes..**.** Adja
a790: 63 65 6e 74 20 66 72 65 65 62 6c 6f 63 6b 73 20  cent freeblocks 
a7a0: 61 72 65 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a  are coalesced..*
a7b0: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 65  *.** Note that e
a7c0: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66  ven though the f
a7d0: 72 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61  reeblock list wa
a7e0: 73 20 63 68 65 63 6b 65 64 20 62 79 20 62 74 72  s checked by btr
a7f0: 65 65 49 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a  eeInitPage(),.**
a800: 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 77 69   that routine wi
a810: 6c 6c 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76  ll not detect ov
a820: 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20 63 65  erlap between ce
a830: 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  lls or freeblock
a840: 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20  s.  Nor.** does 
a850: 69 74 20 64 65 74 65 63 74 20 63 65 6c 6c 73 20  it detect cells 
a860: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68  or freeblocks th
a870: 61 74 20 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f  at encrouch into
a880: 20 74 68 65 20 72 65 73 65 72 76 65 64 20 62 79   the reserved by
a890: 74 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  tes.** at the en
a8a0: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20  d of the page.  
a8b0: 53 6f 20 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c  So do additional
a8c0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 63 68 65 63   corruption chec
a8d0: 6b 73 20 69 6e 73 69 64 65 20 74 68 69 73 0a 2a  ks inside this.*
a8e0: 2a 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 72 65  * routine and re
a8f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
a900: 55 50 54 20 69 66 20 61 6e 79 20 70 72 6f 62 6c  UPT if any probl
a910: 65 6d 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a  ems are found..*
a920: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  /.static int fre
a930: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
a940: 70 50 61 67 65 2c 20 75 31 36 20 69 53 74 61 72  pPage, u16 iStar
a950: 74 2c 20 75 31 36 20 69 53 69 7a 65 29 7b 0a 20  t, u16 iSize){. 
a960: 20 75 31 36 20 69 50 74 72 3b 20 20 20 20 20 20   u16 iPtr;      
a970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a980: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
a990: 73 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 20  s of pointer to 
a9a0: 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a  next freeblock *
a9b0: 2f 0a 20 20 75 31 36 20 69 46 72 65 65 42 6c 6b  /.  u16 iFreeBlk
a9c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a9d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
a9e0: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
a9f0: 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20   freeblock */.  
aa00: 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  u8 hdr;         
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa20: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 68 65        /* Page he
aa30: 61 64 65 72 20 73 69 7a 65 2e 20 20 30 20 6f 72  ader size.  0 or
aa40: 20 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e 46 72   100 */.  u8 nFr
aa50: 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ag = 0;         
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa70: 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20 69 6e 20  /* Reduction in 
aa80: 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f  fragmentation */
aa90: 0a 20 20 75 31 36 20 69 4f 72 69 67 53 69 7a 65  .  u16 iOrigSize
aaa0: 20 3d 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20   = iSize;       
aab0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
aac0: 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 69 53  inal value of iS
aad0: 69 7a 65 20 2a 2f 0a 20 20 75 33 32 20 69 4c 61  ize */.  u32 iLa
aae0: 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  st = pPage->pBt-
aaf0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 3b 20 2f  >usableSize-4; /
ab00: 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62  * Largest possib
ab10: 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  le freeblock off
ab20: 73 65 74 20 2a 2f 0a 20 20 75 33 32 20 69 45 6e  set */.  u32 iEn
ab30: 64 20 3d 20 69 53 74 61 72 74 20 2b 20 69 53 69  d = iStart + iSi
ab40: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
ab50: 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
ab60: 74 20 74 68 65 20 69 53 74 61 72 74 20 62 75 66  t the iStart buf
ab70: 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  fer */.  unsigne
ab80: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
ab90: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 2f  Page->aData;   /
aba0: 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a  * Page content *
abb0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
abc0: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
abd0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
abe0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
abf0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
ac00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
ac10: 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f  art>=pPage->hdrO
ac20: 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63  ffset+6+pPage->c
ac30: 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a 20  hildPtrSize );. 
ac40: 20 61 73 73 65 72 74 28 20 69 45 6e 64 20 3c 3d   assert( iEnd <=
ac50: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
ac60: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  bleSize );.  ass
ac70: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
ac80: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
ac90: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
aca0: 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d 34  assert( iSize>=4
acb0: 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d   );   /* Minimum
acc0: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
acd0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  */.  assert( iSt
ace0: 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 0a 20  art<=iLast );.. 
acf0: 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65   /* Overwrite de
ad00: 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f  leted informatio
ad10: 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65  n with zeros whe
ad20: 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c  n the secure_del
ad30: 65 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20  ete.  ** option 
ad40: 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  is enabled */.  
ad50: 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
ad60: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
ad70: 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
ad80: 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61      memset(&data
ad90: 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 69 53 69  [iStart], 0, iSi
ada0: 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ze);.  }..  /* T
adb0: 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62  he list of freeb
adc0: 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e  locks must be in
add0: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
ade0: 2e 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a  .  Find the .  *
adf0: 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69  * spot on the li
ae00: 73 74 20 77 68 65 72 65 20 69 53 74 61 72 74 20  st where iStart 
ae10: 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74  should be insert
ae20: 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d  ed..  */.  hdr =
ae30: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
ae40: 74 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20  t;.  iPtr = hdr 
ae50: 2b 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b  + 1;.  if( data[
ae60: 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61  iPtr+1]==0 && da
ae70: 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20  ta[iPtr]==0 ){. 
ae80: 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b     iFreeBlk = 0;
ae90: 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f    /* Shortcut fo
aea0: 72 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20  r the case when 
aeb0: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
aec0: 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65  empty */.  }else
aed0: 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69 46  {.    while( (iF
aee0: 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74  reeBlk = get2byt
aef0: 65 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3e  e(&data[iPtr]))>
af00: 30 20 26 26 20 69 46 72 65 65 42 6c 6b 3c 69 53  0 && iFreeBlk<iS
af10: 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 66  tart ){.      if
af20: 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72 2b  ( iFreeBlk<iPtr+
af30: 34 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  4 ) return SQLIT
af40: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
af50: 20 20 20 20 20 20 69 50 74 72 20 3d 20 69 46 72        iPtr = iFr
af60: 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  eeBlk;.    }.   
af70: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e 69 4c   if( iFreeBlk>iL
af80: 61 73 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ast ) return SQL
af90: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
afa0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 46  ;.    assert( iF
afb0: 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69  reeBlk>iPtr || i
afc0: 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20  FreeBlk==0 );.  
afd0: 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20  .    /* At this 
afe0: 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20  point:.    **   
aff0: 20 69 46 72 65 65 42 6c 6b 3a 20 20 20 46 69 72   iFreeBlk:   Fir
b000: 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 61 66 74  st freeblock aft
b010: 65 72 20 69 53 74 61 72 74 2c 20 6f 72 20 7a 65  er iStart, or ze
b020: 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a  ro if none.    *
b030: 2a 20 20 20 20 69 50 74 72 3a 20 20 20 20 20 20  *    iPtr:      
b040: 20 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   The address of 
b050: 61 20 70 6f 69 6e 74 65 72 20 69 46 72 65 65 42  a pointer iFreeB
b060: 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  lk.    **.    **
b070: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
b080: 20 69 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64   iFreeBlk should
b090: 20 62 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e   be coalesced on
b0a0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53  to the end of iS
b0b0: 74 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tart..    */.   
b0c0: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26   if( iFreeBlk &&
b0d0: 20 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c   iEnd+3>=iFreeBl
b0e0: 6b 20 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67  k ){.      nFrag
b0f0: 20 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45   = iFreeBlk - iE
b100: 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45  nd;.      if( iE
b110: 6e 64 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65  nd>iFreeBlk ) re
b120: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b130: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
b140: 69 45 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b 20  iEnd = iFreeBlk 
b150: 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  + get2byte(&data
b160: 5b 69 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20  [iFreeBlk+2]);. 
b170: 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e       iSize = iEn
b180: 64 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 20 20  d - iStart;.    
b190: 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74    iFreeBlk = get
b1a0: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
b1b0: 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  eBlk]);.    }.  
b1c0: 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 74 72 20  .    /* If iPtr 
b1d0: 69 73 20 61 6e 6f 74 68 65 72 20 66 72 65 65 62  is another freeb
b1e0: 6c 6f 63 6b 20 28 74 68 61 74 20 69 73 2c 20 69  lock (that is, i
b1f0: 66 20 69 50 74 72 20 69 73 20 6e 6f 74 20 74 68  f iPtr is not th
b200: 65 20 66 72 65 65 6c 69 73 74 20 70 6f 69 6e 74  e freelist point
b210: 65 72 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  er.    ** in the
b220: 20 70 61 67 65 20 68 65 61 64 65 72 29 20 74 68   page header) th
b230: 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  en check to see 
b240: 69 66 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64  if iStart should
b250: 20 62 65 20 63 6f 61 6c 65 73 63 65 64 20 0a 20   be coalesced . 
b260: 20 20 20 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 65     ** onto the e
b270: 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20 20 20 20  nd of iPtr..    
b280: 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 3e  */.    if( iPtr>
b290: 68 64 72 2b 31 20 29 7b 0a 20 20 20 20 20 20 69  hdr+1 ){.      i
b2a0: 6e 74 20 69 50 74 72 45 6e 64 20 3d 20 69 50 74  nt iPtrEnd = iPt
b2b0: 72 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61  r + get2byte(&da
b2c0: 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20  ta[iPtr+2]);.   
b2d0: 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 2b 33     if( iPtrEnd+3
b2e0: 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20  >=iStart ){.    
b2f0: 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 3e      if( iPtrEnd>
b300: 69 53 74 61 72 74 20 29 20 72 65 74 75 72 6e 20  iStart ) return 
b310: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
b320: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 6e 46 72  KPT;.        nFr
b330: 61 67 20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69  ag += iStart - i
b340: 50 74 72 45 6e 64 3b 0a 20 20 20 20 20 20 20 20  PtrEnd;.        
b350: 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69  iSize = iEnd - i
b360: 50 74 72 3b 0a 20 20 20 20 20 20 20 20 69 53 74  Ptr;.        iSt
b370: 61 72 74 20 3d 20 69 50 74 72 3b 0a 20 20 20 20  art = iPtr;.    
b380: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
b390: 28 20 6e 46 72 61 67 3e 64 61 74 61 5b 68 64 72  ( nFrag>data[hdr
b3a0: 2b 37 5d 20 29 20 72 65 74 75 72 6e 20 53 51 4c  +7] ) return SQL
b3b0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b3c0: 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37  ;.    data[hdr+7
b3d0: 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d 0a  ] -= nFrag;.  }.
b3e0: 20 20 69 66 28 20 69 53 74 61 72 74 3d 3d 67 65    if( iStart==ge
b3f0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
b400: 2b 35 5d 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  +5]) ){.    /* T
b410: 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b  he new freeblock
b420: 20 69 73 20 61 74 20 74 68 65 20 62 65 67 69 6e   is at the begin
b430: 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 65 6c 6c  ning of the cell
b440: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20   content area,. 
b450: 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78     ** so just ex
b460: 74 65 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f  tend the cell co
b470: 6e 74 65 6e 74 20 61 72 65 61 20 72 61 74 68 65  ntent area rathe
b480: 72 20 74 68 61 6e 20 63 72 65 61 74 65 20 61 6e  r than create an
b490: 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 66 72 65  other.    ** fre
b4a0: 65 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20  elist entry */. 
b4b0: 20 20 20 69 66 28 20 69 50 74 72 21 3d 68 64 72     if( iPtr!=hdr
b4c0: 2b 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  +1 ) return SQLI
b4d0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
b4e0: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
b4f0: 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65  ata[hdr+1], iFre
b500: 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62  eBlk);.    put2b
b510: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
b520: 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65  , iEnd);.  }else
b530: 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20  {.    /* Insert 
b540: 74 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63  the new freebloc
b550: 6b 20 69 6e 74 6f 20 74 68 65 20 66 72 65 65 6c  k into the freel
b560: 69 73 74 20 2a 2f 0a 20 20 20 20 70 75 74 32 62  ist */.    put2b
b570: 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 2c  yte(&data[iPtr],
b580: 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 70 75   iStart);.    pu
b590: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74  t2byte(&data[iSt
b5a0: 61 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b  art], iFreeBlk);
b5b0: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
b5c0: 61 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69  ata[iStart+2], i
b5d0: 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61  Size);.  }.  pPa
b5e0: 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72  ge->nFree += iOr
b5f0: 69 67 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e  igSize;.  return
b600: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
b610: 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20  *.** Decode the 
b620: 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20  flags byte (the 
b630: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
b640: 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20  e header) for a 
b650: 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  page.** and init
b660: 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66  ialize fields of
b670: 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72   the MemPage str
b680: 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67  ucture according
b690: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74  ly..**.** Only t
b6a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
b6b0: 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75  binations are su
b6c0: 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69  pported.  Anythi
b6d0: 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ng different.** 
b6e0: 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72  indicates a corr
b6f0: 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
b700: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  es:.**.**       
b710: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a    PTF_ZERODATA.*
b720: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
b730: 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41  RODATA | PTF_LEA
b740: 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  F.**         PTF
b750: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
b760: 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20  INTKEY.**       
b770: 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c    PTF_LEAFDATA |
b780: 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54   PTF_INTKEY | PT
b790: 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63  F_LEAF.*/.static
b7a0: 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73   int decodeFlags
b7b0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
b7c0: 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a   int flagByte){.
b7d0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
b7e0: 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f       /* A copy o
b7f0: 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a  f pPage->pBt */.
b800: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b810: 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50  ->hdrOffset==(pP
b820: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
b830: 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73  00 : 0) );.  ass
b840: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
b850: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
b860: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
b870: 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75  pPage->leaf = (u
b880: 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b  8)(flagByte>>3);
b890: 20 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45    assert( PTF_LE
b8a0: 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20  AF == 1<<3 );.  
b8b0: 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46  flagByte &= ~PTF
b8c0: 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e  _LEAF;.  pPage->
b8d0: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34  childPtrSize = 4
b8e0: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a  -4*pPage->leaf;.
b8f0: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
b900: 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79  Bt;.  if( flagBy
b910: 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54  te==(PTF_LEAFDAT
b920: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20  A | PTF_INTKEY) 
b930: 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  ){.    pPage->in
b940: 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50  tKey = 1;.    pP
b950: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 70  age->hasData = p
b960: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20  Page->leaf;.    
b970: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
b980: 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a  = pBt->maxLeaf;.
b990: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
b9a0: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65  cal = pBt->minLe
b9b0: 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  af;.  }else if( 
b9c0: 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45  flagByte==PTF_ZE
b9d0: 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50  RODATA ){.    pP
b9e0: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b  age->intKey = 0;
b9f0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44  .    pPage->hasD
ba00: 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ata = 0;.    pPa
ba10: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
ba20: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  Bt->maxLocal;.  
ba30: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
ba40: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  l = pBt->minLoca
ba50: 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  l;.  }else{.    
ba60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
ba70: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
ba80: 20 20 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74    pPage->max1byt
ba90: 65 50 61 79 6c 6f 61 64 20 3d 20 70 42 74 2d 3e  ePayload = pBt->
baa0: 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 3b  max1bytePayload;
bab0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
bac0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
bad0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78  itialize the aux
bae0: 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69  iliary informati
baf0: 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c  on for a disk bl
bb00: 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ock..**.** Retur
bb10: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
bb20: 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73  uccess.  If we s
bb30: 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ee that the page
bb40: 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e   does.** not con
bb50: 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  tain a well-form
bb60: 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ed database page
bb70: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a  , then return .*
bb80: 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  * SQLITE_CORRUPT
bb90: 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72  .  Note that a r
bba0: 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f  eturn of SQLITE_
bbb0: 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67  OK does not.** g
bbc0: 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68  uarantee that th
bbd0: 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66  e page is well-f
bbe0: 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20  ormed.  It only 
bbf0: 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65  shows that.** we
bc00: 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63   failed to detec
bc10: 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e  t any corruption
bc20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bc30: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65  btreeInitPage(Me
bc40: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a  mPage *pPage){..
bc50: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
bc60: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
bc70: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
bc80: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
bc90: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
bca0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
bcb0: 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  gno==sqlite3Page
bcc0: 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
bcd0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
bce0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d   assert( pPage =
bcf0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
bd00: 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
bd10: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
bd20: 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
bd30: 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   == sqlite3Pager
bd40: 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
bd50: 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69 66  DbPage) );..  if
bd60: 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  ( !pPage->isInit
bd70: 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b 20   ){.    u16 pc; 
bd80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
bd90: 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62  dress of a freeb
bda0: 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67  lock within pPag
bdb0: 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20  e->aData[] */.  
bdc0: 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20    u8 hdr;       
bdd0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
bde0: 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70  o beginning of p
bdf0: 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
be00: 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
be10: 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f       /* Equal to
be20: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f   pPage->aData */
be30: 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
be40: 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  Bt;        /* Th
be50: 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72  e main btree str
be60: 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 6e  ucture */.    in
be70: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
be80: 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73   /* Amount of us
be90: 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61  able space on ea
bea0: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75  ch page */.    u
beb0: 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  16 cellOffset;  
bec0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d    /* Offset from
bed0: 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20 74   start of page t
bee0: 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69  o first cell poi
bef0: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  nter */.    int 
bf00: 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f  nFree;         /
bf10: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73  * Number of unus
bf20: 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20  ed bytes on the 
bf30: 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  page */.    int 
bf40: 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f  top;           /
bf50: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
bf60: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
bf70: 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74   area */.    int
bf80: 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20   iCellFirst;    
bf90: 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62  /* First allowab
bfa0: 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62  le cell or freeb
bfb0: 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20  lock offset */. 
bfc0: 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74     int iCellLast
bfd0: 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f  ;     /* Last po
bfe0: 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66  ssible cell or f
bff0: 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20  reeblock offset 
c000: 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70 50  */..    pBt = pP
c010: 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68  age->pBt;..    h
c020: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
c030: 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61 20  ffset;.    data 
c040: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
c050: 20 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c      if( decodeFl
c060: 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b  ags(pPage, data[
c070: 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53  hdr]) ) return S
c080: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c090: 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  PT;.    assert( 
c0a0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35  pBt->pageSize>=5
c0b0: 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53  12 && pBt->pageS
c0c0: 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  ize<=65536 );.  
c0d0: 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67    pPage->maskPag
c0e0: 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70  e = (u16)(pBt->p
c0f0: 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20  ageSize - 1);.  
c100: 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
c110: 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62  ow = 0;.    usab
c120: 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  leSize = pBt->us
c130: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50  ableSize;.    pP
c140: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
c150: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68  = cellOffset = h
c160: 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67  dr + 12 - 4*pPag
c170: 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50 61  e->leaf;.    pPa
c180: 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26  ge->aDataEnd = &
c190: 64 61 74 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d  data[usableSize]
c1a0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 43 65  ;.    pPage->aCe
c1b0: 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 63 65  llIdx = &data[ce
c1c0: 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 74  llOffset];.    t
c1d0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74  op = get2byteNot
c1e0: 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35  Zero(&data[hdr+5
c1f0: 5d 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  ]);.    pPage->n
c200: 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28  Cell = get2byte(
c210: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20  &data[hdr+3]);. 
c220: 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43     if( pPage->nC
c230: 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ell>MX_CELL(pBt)
c240: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20   ){.      /* To 
c250: 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  many cells for a
c260: 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54   single page.  T
c270: 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
c280: 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 20  corrupt */.     
c290: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
c2a0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
c2b0: 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
c2c0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d   pPage->nCell==M
c2d0: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a 0a  X_CELL(pBt) );..
c2e0: 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d      /* A malform
c2f0: 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ed database page
c300: 20 6d 69 67 68 74 20 63 61 75 73 65 20 75 73 20   might cause us 
c310: 74 6f 20 72 65 61 64 20 70 61 73 74 20 74 68 65  to read past the
c320: 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70   end.    ** of p
c330: 61 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67  age when parsing
c340: 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a   a cell.  .    *
c350: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c  *.    ** The fol
c360: 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20  lowing block of 
c370: 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72 6c  code checks earl
c380: 79 20 74 6f 20 73 65 65 20 69 66 20 61 20 63 65  y to see if a ce
c390: 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 20 20 2a  ll extends.    *
c3a0: 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  * past the end o
c3b0: 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  f a page boundar
c3c0: 79 20 61 6e 64 20 63 61 75 73 65 73 20 53 51 4c  y and causes SQL
c3d0: 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20 62  ITE_CORRUPT to b
c3e0: 65 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  e .    ** return
c3f0: 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20  ed if it does.. 
c400: 20 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46     */.    iCellF
c410: 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  irst = cellOffse
c420: 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
c430: 6c 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73  ll;.    iCellLas
c440: 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d  t = usableSize -
c450: 20 34 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28   4;.#if defined(
c460: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56  SQLITE_ENABLE_OV
c470: 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43  ERSIZE_CELL_CHEC
c480: 4b 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 69  K).    {.      i
c490: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
c4a0: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74   /* Index into t
c4b0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
c4c0: 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20 69  array */.      i
c4d0: 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20  nt sz;          
c4e0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65   /* Size of a ce
c4f0: 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28  ll */..      if(
c500: 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20   !pPage->leaf ) 
c510: 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20  iCellLast--;.   
c520: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
c530: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29  age->nCell; i++)
c540: 7b 0a 20 20 20 20 20 20 20 20 70 63 20 3d 20 67  {.        pc = g
c550: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 63 65  et2byte(&data[ce
c560: 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a  llOffset+i*2]);.
c570: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
c580: 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74  ( pc==iCellFirst
c590: 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
c5a0: 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c  case( pc==iCellL
c5b0: 61 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ast );.        i
c5c0: 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74  f( pc<iCellFirst
c5d0: 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74   || pc>iCellLast
c5e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
c5f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
c600: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
c610: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 7a 20 3d    }.        sz =
c620: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
c630: 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a  ge, &data[pc]);.
c640: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
c650: 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53  ( pc+sz==usableS
c660: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ize );.        i
c670: 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53  f( pc+sz>usableS
c680: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
c690: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
c6a0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
c6b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
c6c0: 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d       if( !pPage-
c6d0: 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73  >leaf ) iCellLas
c6e0: 74 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a 23 65 6e  t++;.    }  .#en
c6f0: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  dif..    /* Comp
c700: 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72  ute the total fr
c710: 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20  ee space on the 
c720: 70 61 67 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d  page */.    pc =
c730: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c740: 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72  hdr+1]);.    nFr
c750: 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d  ee = data[hdr+7]
c760: 20 2b 20 74 6f 70 3b 0a 20 20 20 20 77 68 69 6c   + top;.    whil
c770: 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20  e( pc>0 ){.     
c780: 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b   u16 next, size;
c790: 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43  .      if( pc<iC
c7a0: 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69  ellFirst || pc>i
c7b0: 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20  CellLast ){.    
c7c0: 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
c7d0: 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66  free block is of
c7e0: 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
c7f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
c800: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
c810: 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ; .      }.     
c820: 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65   next = get2byte
c830: 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20  (&data[pc]);.   
c840: 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79     size = get2by
c850: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b  te(&data[pc+2]);
c860: 0a 20 20 20 20 20 20 69 66 28 20 28 6e 65 78 74  .      if( (next
c870: 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73  >0 && next<=pc+s
c880: 69 7a 65 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a  ize+3) || pc+siz
c890: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
c8a0: 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20          /* Free 
c8b0: 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69  blocks must be i
c8c0: 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
c8d0: 72 2e 20 41 6e 64 20 74 68 65 20 6c 61 73 74 20  r. And the last 
c8e0: 62 79 74 65 20 6f 66 0a 20 20 20 20 20 20 20 20  byte of.        
c8f0: 2a 2a 20 74 68 65 20 66 72 65 65 2d 62 6c 6f 63  ** the free-bloc
c900: 6b 20 6d 75 73 74 20 6c 69 65 20 6f 6e 20 74 68  k must lie on th
c910: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e  e database page.
c920: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74    */.        ret
c930: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c940: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20  PT_BKPT; .      
c950: 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20  }.      nFree = 
c960: 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20  nFree + size;.  
c970: 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20      pc = next;. 
c980: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
c990: 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65  this point, nFre
c9a0: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  e contains the s
c9b0: 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74  um of the offset
c9c0: 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20   to the start.  
c9d0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c    ** of the cell
c9e0: 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c  -content area pl
c9f0: 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  us the number of
ca00: 20 66 72 65 65 20 62 79 74 65 73 20 77 69 74 68   free bytes with
ca10: 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 65  in.    ** the ce
ca20: 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll-content area.
ca30: 20 49 66 20 74 68 69 73 20 69 73 20 67 72 65 61   If this is grea
ca40: 74 65 72 20 74 68 61 6e 20 74 68 65 20 75 73 61  ter than the usa
ca50: 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20  ble-size.    ** 
ca60: 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  of the page, the
ca70: 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73 74 20  n the page must 
ca80: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  be corrupted. Th
ca90: 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20  is check also.  
caa0: 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76    ** serves to v
cab0: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6f  erify that the o
cac0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
cad0: 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63  rt of the cell-c
cae0: 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72  ontent.    ** ar
caf0: 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ea, according to
cb00: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
cb10: 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68  , lies within th
cb20: 65 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  e page..    */. 
cb30: 20 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61     if( nFree>usa
cb40: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
cb50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
cb60: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
cb70: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e    }.    pPage->n
cb80: 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e 46 72  Free = (u16)(nFr
cb90: 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 29  ee - iCellFirst)
cba0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ;.    pPage->isI
cbb0: 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  nit = 1;.  }.  r
cbc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
cbd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70  .}../*.** Set up
cbe0: 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74   a raw page so t
cbf0: 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b  hat it looks lik
cc00: 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  e a database pag
cc10: 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20  e holding.** no 
cc20: 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  entries..*/.stat
cc30: 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65  ic void zeroPage
cc40: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
cc50: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75   int flags){.  u
cc60: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
cc70: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
cc80: 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  a;.  BtShared *p
cc90: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
cca0: 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50 61 67  .  u8 hdr = pPag
ccb0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
ccc0: 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73  u16 first;..  as
ccd0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
cce0: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
ccf0: 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50  ge->pDbPage)==pP
cd00: 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61  age->pgno );.  a
cd10: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
cd20: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
cd30: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
cd40: 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
cd50: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
cd60: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
cd70: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
cd80: 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  data );.  assert
cd90: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
cda0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
cdb0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
cdc0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
cdd0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
cde0: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
cdf0: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
ce00: 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
ce10: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   ){.    memset(&
ce20: 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42  data[hdr], 0, pB
ce30: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
ce40: 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61  hdr);.  }.  data
ce50: 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c  [hdr] = (char)fl
ce60: 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68  ags;.  first = h
ce70: 64 72 20 2b 20 28 28 66 6c 61 67 73 26 50 54 46  dr + ((flags&PTF
ce80: 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a  _LEAF)==0 ? 12 :
ce90: 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64   8);.  memset(&d
cea0: 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34  ata[hdr+1], 0, 4
ceb0: 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  );.  data[hdr+7]
cec0: 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65   = 0;.  put2byte
ced0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  (&data[hdr+5], p
cee0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
cef0: 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
cf00: 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61  = (u16)(pBt->usa
cf10: 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 29  bleSize - first)
cf20: 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28  ;.  decodeFlags(
cf30: 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20  pPage, flags);. 
cf40: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
cf50: 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50  et = first;.  pP
cf60: 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20  age->aDataEnd = 
cf70: 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c  &data[pBt->usabl
cf80: 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  eSize];.  pPage-
cf90: 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74  >aCellIdx = &dat
cfa0: 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67  a[first];.  pPag
cfb0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
cfc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
cfd0: 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
cfe0: 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
cff0: 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67  =65536 );.  pPag
d000: 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75  e->maskPage = (u
d010: 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  16)(pBt->pageSiz
d020: 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d  e - 1);.  pPage-
d030: 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50  >nCell = 0;.  pP
d040: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
d050: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .}.../*.** Conve
d060: 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74 61  rt a DbPage obta
d070: 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61  ined from the pa
d080: 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61  ger into a MemPa
d090: 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68  ge used by.** th
d0a0: 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a  e btree layer..*
d0b0: 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65  /.static MemPage
d0c0: 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44   *btreePageFromD
d0d0: 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 44  bPage(DbPage *pD
d0e0: 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f  bPage, Pgno pgno
d0f0: 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  , BtShared *pBt)
d100: 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
d110: 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73  ge = (MemPage*)s
d120: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
d130: 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  tra(pDbPage);.  
d140: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73  pPage->aData = s
d150: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
d160: 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70  ta(pDbPage);.  p
d170: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20  Page->pDbPage = 
d180: 70 44 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65  pDbPage;.  pPage
d190: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70  ->pBt = pBt;.  p
d1a0: 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e  Page->pgno = pgn
d1b0: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  o;.  pPage->hdrO
d1c0: 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70  ffset = pPage->p
d1d0: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
d1e0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
d1f0: 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  ; .}../*.** Get 
d200: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
d210: 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69  pager.  Initiali
d220: 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ze the MemPage.p
d230: 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67  Bt and.** MemPag
d240: 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73  e.aData elements
d250: 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a   if needed..**.*
d260: 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65  * If the noConte
d270: 6e 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  nt flag is set, 
d280: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
d290: 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
d2a0: 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  ut.** the conten
d2b0: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74  t of the page at
d2c0: 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20   this time.  So 
d2d0: 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65  do not go to the
d2e0: 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63   disk.** to fetc
d2f0: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20  h the content.  
d300: 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65  Just fill in the
d310: 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65   content with ze
d320: 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20  ros for now..** 
d330: 49 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  If in the future
d340: 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   we call sqlite3
d350: 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
d360: 74 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a  this page, that.
d370: 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65  ** means we have
d380: 20 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63   started to be c
d390: 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63  oncerned about c
d3a0: 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64  ontent and the d
d3b0: 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75  isk.** read shou
d3c0: 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74  ld occur at that
d3d0: 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69   point..*/.stati
d3e0: 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 50 61  c int btreeGetPa
d3f0: 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
d400: 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pBt,       /* Th
d410: 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e  e btree */.  Pgn
d420: 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
d430: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
d440: 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68  he page to fetch
d450: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
d460: 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65  ppPage,    /* Re
d470: 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e  turn the page in
d480: 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20   this parameter 
d490: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
d4a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
d4b0: 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
d4c0: 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45   or PAGER_GET_RE
d4d0: 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69  ADONLY */.){.  i
d4e0: 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20  nt rc;.  DbPage 
d4f0: 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73  *pDbPage;..  ass
d500: 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c  ert( flags==0 ||
d510: 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45   flags==PAGER_GE
d520: 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66  T_NOCONTENT || f
d530: 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f  lags==PAGER_GET_
d540: 52 45 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73  READONLY );.  as
d550: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
d560: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
d570: 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  tex) );.  rc = s
d580: 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
d590: 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  re(pBt->pPager, 
d5a0: 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29  pgno, (DbPage**)
d5b0: 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67 73 29  &pDbPage, flags)
d5c0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
d5d0: 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67  urn rc;.  *ppPag
d5e0: 65 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f  e = btreePageFro
d5f0: 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c  mDbPage(pDbPage,
d600: 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72   pgno, pBt);.  r
d610: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d620: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65  .}../*.** Retrie
d630: 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  ve a page from t
d640: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
d650: 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
d660: 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   page is not.** 
d670: 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70  already in the p
d680: 61 67 65 72 20 63 61 63 68 65 20 72 65 74 75 72  ager cache retur
d690: 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69  n NULL. Initiali
d6a0: 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ze the MemPage.p
d6b0: 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67  Bt and.** MemPag
d6c0: 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73  e.aData elements
d6d0: 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73   if needed..*/.s
d6e0: 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62  tatic MemPage *b
d6f0: 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42  treePageLookup(B
d700: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
d710: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61  no pgno){.  DbPa
d720: 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61  ge *pDbPage;.  a
d730: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
d740: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
d750: 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61  utex) );.  pDbPa
d760: 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ge = sqlite3Page
d770: 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61  rLookup(pBt->pPa
d780: 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
d790: 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20  ( pDbPage ){.   
d7a0: 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67   return btreePag
d7b0: 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
d7c0: 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
d7d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
d7e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
d7f0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
d800: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
d810: 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68 65 72  n pages. If ther
d820: 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66  e is any kind of
d830: 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72  .** error, retur
d840: 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  n ((unsigned int
d850: 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  )-1)..*/.static 
d860: 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f  Pgno btreePageco
d870: 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  unt(BtShared *pB
d880: 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74  t){.  return pBt
d890: 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73  ->nPage;.}.u32 s
d8a0: 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 50  qlite3BtreeLastP
d8b0: 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  age(Btree *p){. 
d8c0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d8d0: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
d8e0: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
d8f0: 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29  ((p->pBt->nPage)
d900: 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30 20 29  &0x8000000)==0 )
d910: 3b 0a 20 20 72 65 74 75 72 6e 20 62 74 72 65 65  ;.  return btree
d920: 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74  Pagecount(p->pBt
d930: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  );.}../*.** Get 
d940: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
d950: 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61  pager and initia
d960: 6c 69 7a 65 20 69 74 2e 20 20 54 68 69 73 20 72  lize it.  This r
d970: 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61  outine is just a
d980: 0a 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20  .** convenience 
d990: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73  wrapper around s
d9a0: 65 70 61 72 61 74 65 20 63 61 6c 6c 73 20 74 6f  eparate calls to
d9b0: 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20   btreeGetPage() 
d9c0: 61 6e 64 20 0a 2a 2a 20 62 74 72 65 65 49 6e 69  and .** btreeIni
d9d0: 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  tPage()..**.** I
d9e0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
d9f0: 73 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  s, then the valu
da00: 65 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  e *ppPage is set
da10: 20 74 6f 20 69 73 20 75 6e 64 65 66 69 6e 65 64   to is undefined
da20: 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61  . It.** may rema
da30: 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72  in unchanged, or
da40: 20 69 74 20 6d 61 79 20 62 65 20 73 65 74 20 74   it may be set t
da50: 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c  o an invalid val
da60: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
da70: 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  t getAndInitPage
da80: 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
da90: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
daa0: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
dab0: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
dac0: 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
dad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dae0: 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
daf0: 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20  age to get */.  
db00: 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
db10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
db20: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67  /* Write the pag
db30: 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a  e pointer here *
db40: 2f 0a 20 20 69 6e 74 20 62 52 65 61 64 6f 6e 6c  /.  int bReadonl
db50: 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
db60: 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54      /* PAGER_GET
db70: 5f 52 45 41 44 4f 4e 4c 59 20 6f 72 20 30 20 2a  _READONLY or 0 *
db80: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
db90: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
dba0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
dbb0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
dbc0: 65 72 74 28 20 62 52 65 61 64 6f 6e 6c 79 3d 3d  ert( bReadonly==
dbd0: 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
dbe0: 4c 59 20 7c 7c 20 62 52 65 61 64 6f 6e 6c 79 3d  LY || bReadonly=
dbf0: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e  =0 );..  if( pgn
dc00: 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
dc10: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20  (pBt) ){.    rc 
dc20: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
dc30: 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BKPT;.  }else{.
dc40: 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
dc50: 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c  tPage(pBt, pgno,
dc60: 20 70 70 50 61 67 65 2c 20 62 52 65 61 64 6f 6e   ppPage, bReadon
dc70: 6c 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ly);.    if( rc=
dc80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 2a  =SQLITE_OK && (*
dc90: 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d  ppPage)->isInit=
dca0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
dcb0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a   btreeInitPage(*
dcc0: 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  ppPage);.      i
dcd0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
dce0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
dcf0: 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
dd00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dd10: 20 20 7d 0a 0a 20 20 74 65 73 74 63 61 73 65 28    }..  testcase(
dd20: 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73   pgno==0 );.  as
dd30: 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c  sert( pgno!=0 ||
dd40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52   rc==SQLITE_CORR
dd50: 55 50 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  UPT );.  return 
dd60: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  rc;.}../*.** Rel
dd70: 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20  ease a MemPage. 
dd80: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
dd90: 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20  called once for 
dda0: 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61  each prior.** ca
ddb0: 6c 6c 20 74 6f 20 62 74 72 65 65 47 65 74 50 61  ll to btreeGetPa
ddc0: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
ddd0: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d  id releasePage(M
dde0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
ddf0: 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
de00: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
de10: 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61  ->aData );.    a
de20: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
de30: 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t );.    assert(
de40: 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 21   pPage->pDbPage!
de50: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
de60: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
de70: 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
de80: 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a  bPage) == (void*
de90: 29 70 50 61 67 65 20 29 3b 0a 20 20 20 20 61 73  )pPage );.    as
dea0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
deb0: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
dec0: 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65  >pDbPage)==pPage
ded0: 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61  ->aData );.    a
dee0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
def0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
df00: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
df10: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
df20: 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61  UnrefNotNull(pPa
df30: 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
df40: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e  }.}../*.** Durin
df50: 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68  g a rollback, wh
df60: 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65 6c  en the pager rel
df70: 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  oads information
df80: 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a   into the cache.
df90: 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  ** so that the c
dfa0: 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64  ache is restored
dfb0: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
dfc0: 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73 74   state at the st
dfd0: 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72  art of.** the tr
dfe0: 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65  ansaction, for e
dff0: 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72 65  ach page restore
e000: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  d this routine i
e010: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
e020: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65  This routine nee
e030: 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  ds to reset the 
e040: 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74 69  extra data secti
e050: 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  on at the end of
e060: 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
e070: 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
e080: 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f  estored data..*/
e090: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
e0a0: 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a  eReinit(DbPage *
e0b0: 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67  pData){.  MemPag
e0c0: 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67  e *pPage;.  pPag
e0d0: 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73  e = (MemPage *)s
e0e0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
e0f0: 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73  tra(pData);.  as
e100: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
e110: 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
e120: 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28  Data)>0 );.  if(
e130: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
e140: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
e150: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
e160: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
e170: 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ex) );.    pPage
e180: 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
e190: 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
e1a0: 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
e1b0: 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20  Data)>1 ){.     
e1c0: 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20   /* pPage might 
e1d0: 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65 20 70  not be a btree p
e1e0: 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62  age;  it might b
e1f0: 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
e200: 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70  ge.      ** or p
e210: 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20  trmap page or a 
e220: 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74  free page.  In t
e230: 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65 20  hose cases, the 
e240: 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20  following.      
e250: 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
e260: 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20  InitPage() will 
e270: 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51  likely return SQ
e280: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20  LITE_CORRUPT..  
e290: 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61      ** But no ha
e2a0: 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68  rm is done by th
e2b0: 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76  is.  And it is v
e2c0: 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ery important th
e2d0: 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65  at.      ** btre
e2e0: 65 49 6e 69 74 50 61 67 65 28 29 20 62 65 20 63  eInitPage() be c
e2f0: 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62  alled on every b
e300: 74 72 65 65 20 70 61 67 65 20 73 6f 20 77 65 20  tree page so we 
e310: 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  make.      ** th
e320: 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79  e call for every
e330: 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73   page that comes
e340: 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69   in for re-initi
e350: 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72  ng. */.      btr
e360: 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
e370: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
e380: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
e390: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f   busy handler fo
e3a0: 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74  r a btree..*/.st
e3b0: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e  atic int btreeIn
e3c0: 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
e3d0: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42  void *pArg){.  B
e3e0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28  tShared *pBt = (
e3f0: 42 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a  BtShared*)pArg;.
e400: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64    assert( pBt->d
e410: 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  b );.  assert( s
e420: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
e430: 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78  d(pBt->db->mutex
e440: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  ) );.  return sq
e450: 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
e460: 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d  andler(&pBt->db-
e470: 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d  >busyHandler);.}
e480: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64  ../*.** Open a d
e490: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
e4a0: 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69   .** zFilename i
e4b0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
e4c0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
e4d0: 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69    If zFilename i
e4e0: 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61  s NULL.** then a
e4f0: 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  n ephemeral data
e500: 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64 2e  base is created.
e510: 20 20 54 68 65 20 65 70 68 65 6d 65 72 61 6c 20    The ephemeral 
e520: 64 61 74 61 62 61 73 65 20 6d 69 67 68 74 0a 2a  database might.*
e530: 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65 6c 79  * be exclusively
e540: 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69   in memory, or i
e550: 74 20 6d 69 67 68 74 20 75 73 65 20 61 20 64 69  t might use a di
e560: 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79 20  sk-based memory 
e570: 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72  cache..** Either
e580: 20 77 61 79 2c 20 74 68 65 20 65 70 68 65 6d 65   way, the epheme
e590: 72 61 6c 20 64 61 74 61 62 61 73 65 20 77 69 6c  ral database wil
e5a0: 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  l be automatical
e5b0: 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77  ly deleted .** w
e5c0: 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65  hen sqlite3Btree
e5d0: 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65  Close() is calle
e5e0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c  d..**.** If zFil
e5f0: 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72  ename is ":memor
e600: 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d  y:" then an in-m
e610: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 69  emory database i
e620: 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61  s created.** tha
e630: 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  t is automatical
e640: 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77 68 65  ly destroyed whe
e650: 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
e660: 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67 73  **.** The "flags
e670: 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  " parameter is a
e680: 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20 6d 69   bitmask that mi
e690: 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69 74 73  ght contain bits
e6a0: 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f   like.** BTREE_O
e6b0: 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f  MIT_JOURNAL and/
e6c0: 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e  or BTREE_MEMORY.
e6d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
e6e0: 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
e6f0: 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68 65 20  y opened in the 
e700: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f  same database co
e710: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  nnection.** and 
e720: 77 65 20 61 72 65 20 69 6e 20 73 68 61 72 65 64  we are in shared
e730: 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65   cache mode, the
e740: 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20  n the open will 
e750: 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20  fail with an.** 
e760: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
e770: 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63 61 6e  T error.  We can
e780: 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72  not allow two or
e790: 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64 0a 2a   more BtShared.*
e7a0: 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65  * objects in the
e7b0: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63   same database c
e7c0: 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20  onnection since 
e7d0: 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65  doing so will le
e7e0: 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d  ad.** to problem
e7f0: 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a  s with locking..
e800: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
e810: 72 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  reeOpen(.  sqlit
e820: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
e830: 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65     /* VFS to use
e840: 20 66 6f 72 20 74 68 69 73 20 62 2d 74 72 65 65   for this b-tree
e850: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
e860: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a   *zFilename,  /*
e870: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
e880: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
e890: 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20   BTree database 
e8a0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
e8b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
e8c0: 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  Associated datab
e8d0: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
e8e0: 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c  Btree **ppBtree,
e8f0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
e900: 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20  er to new Btree 
e910: 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68  object written h
e920: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
e930: 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
e940: 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20   /* Options */. 
e950: 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20   int vfsFlags   
e960: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
e970: 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
e980: 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   to sqlite3_vfs.
e990: 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20  xOpen() */.){.  
e9a0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
e9b0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
e9c0: 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66  * Shared part of
e9d0: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
e9e0: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20   */.  Btree *p; 
e9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea00: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74       /* Handle t
ea10: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71  o return */.  sq
ea20: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
ea30: 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20  exOpen = 0;  /* 
ea40: 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65 20  Prevents a race 
ea50: 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65  condition. Ticke
ea60: 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74  t #3537 */.  int
ea70: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
ea80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
ea90: 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
eaa0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
eab0: 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20  .  u8 nReserve; 
eac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ead0: 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75    /* Byte of unu
eae0: 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63  sed space on eac
eaf0: 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  h page */.  unsi
eb00: 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61  gned char zDbHea
eb10: 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61  der[100];  /* Da
eb20: 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63 6f  tabase header co
eb30: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54  ntent */..  /* T
eb40: 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 61  rue if opening a
eb50: 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d  n ephemeral, tem
eb60: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
eb70: 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  */.  const int i
eb80: 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e  sTempDb = zFilen
eb90: 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e  ame==0 || zFilen
eba0: 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a  ame[0]==0;..  /*
ebb0: 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62 6c   Set the variabl
ebc0: 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75  e isMemdb to tru
ebd0: 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  e for an in-memo
ebe0: 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20  ry database, or 
ebf0: 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20  .  ** false for 
ec00: 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74  a file-based dat
ec10: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64  abase..  */.#ifd
ec20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
ec30: 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74 20  EMORYDB.  const 
ec40: 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b  int isMemdb = 0;
ec50: 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69  .#else.  const i
ec60: 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46  nt isMemdb = (zF
ec70: 69 6c 65 6e 61 6d 65 20 26 26 20 73 74 72 63 6d  ilename && strcm
ec80: 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d  p(zFilename, ":m
ec90: 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20  emory:")==0).   
eca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecb0: 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70 44 62      || (isTempDb
ecc0: 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d 70 49   && sqlite3TempI
ecd0: 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a 20 20 20  nMemory(db)).   
ece0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecf0: 20 20 20 20 7c 7c 20 28 76 66 73 46 6c 61 67 73      || (vfsFlags
ed00: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
ed10: 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69  EMORY)!=0;.#endi
ed20: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  f..  assert( db!
ed30: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
ed40: 70 56 66 73 21 3d 30 20 29 3b 0a 20 20 61 73 73  pVfs!=0 );.  ass
ed50: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
ed60: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
ed70: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
ed80: 28 66 6c 61 67 73 26 30 78 66 66 29 3d 3d 66 6c  (flags&0xff)==fl
ed90: 61 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67  ags );   /* flag
eda0: 73 20 66 69 74 20 69 6e 20 38 20 62 69 74 73 20  s fit in 8 bits 
edb0: 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20  */..  /* Only a 
edc0: 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74  BTREE_SINGLE dat
edd0: 61 62 61 73 65 20 63 61 6e 20 62 65 20 42 54 52  abase can be BTR
ede0: 45 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a  EE_UNORDERED */.
edf0: 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
ee00: 20 26 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52   & BTREE_UNORDER
ee10: 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73  ED)==0 || (flags
ee20: 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29   & BTREE_SINGLE)
ee30: 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42  !=0 );..  /* A B
ee40: 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61  TREE_SINGLE data
ee50: 62 61 73 65 20 69 73 20 61 6c 77 61 79 73 20 61  base is always a
ee60: 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f   temporary and/o
ee70: 72 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20  r ephemeral */. 
ee80: 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20   assert( (flags 
ee90: 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d  & BTREE_SINGLE)=
eea0: 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44 62 20 29  =0 || isTempDb )
eeb0: 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62  ;..  if( isMemdb
eec0: 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d   ){.    flags |=
eed0: 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20   BTREE_MEMORY;. 
eee0: 20 7d 0a 20 20 69 66 28 20 28 76 66 73 46 6c 61   }.  if( (vfsFla
eef0: 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
ef00: 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26 20  _MAIN_DB)!=0 && 
ef10: 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65  (isMemdb || isTe
ef20: 6d 70 44 62 29 20 29 7b 0a 20 20 20 20 76 66 73  mpDb) ){.    vfs
ef30: 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c 61 67  Flags = (vfsFlag
ef40: 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e  s & ~SQLITE_OPEN
ef50: 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49  _MAIN_DB) | SQLI
ef60: 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b  TE_OPEN_TEMP_DB;
ef70: 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74  .  }.  p = sqlit
ef80: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
ef90: 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69  eof(Btree));.  i
efa0: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74  f( !p ){.    ret
efb0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
efc0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61  ;.  }.  p->inTra
efd0: 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
efe0: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23  .  p->db = db;.#
eff0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f000: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
f010: 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65    p->lock.pBtree
f020: 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e   = p;.  p->lock.
f030: 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64  iTable = 1;.#end
f040: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
f050: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
f060: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
f070: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
f080: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a  IT_DISKIO).  /*.
f090: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72    ** If this Btr
f0a0: 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  ee is a candidat
f0b0: 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61 63  e for shared cac
f0c0: 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20  he, try to find 
f0d0: 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67  an.  ** existing
f0e0: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
f0f0: 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68 61   that we can sha
f100: 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69  re with.  */.  i
f110: 66 28 20 69 73 54 65 6d 70 44 62 3d 3d 30 20 26  f( isTempDb==0 &
f120: 26 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c  & (isMemdb==0 ||
f130: 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54   (vfsFlags&SQLIT
f140: 45 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29 20  E_OPEN_URI)!=0) 
f150: 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c  ){.    if( vfsFl
f160: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
f170: 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 29 7b  N_SHAREDCACHE ){
f180: 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c  .      int nFull
f190: 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d  Pathname = pVfs-
f1a0: 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20  >mxPathname+1;. 
f1b0: 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c       char *zFull
f1c0: 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
f1d0: 65 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61  e3Malloc(nFullPa
f1e0: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 4d  thname);.      M
f1f0: 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
f200: 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
f210: 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20  Shared; ).      
f220: 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
f230: 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c  .      if( !zFul
f240: 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  lPathname ){.   
f250: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
f260: 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  e(p);.        re
f270: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
f280: 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
f290: 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a   if( isMemdb ){.
f2a0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a          memcpy(z
f2b0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46  FullPathname, zF
f2c0: 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  ilename, sqlite3
f2d0: 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
f2e0: 6d 65 29 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65  me)+1);.      }e
f2f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
f300: 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
f310: 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
f320: 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
f330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f340: 20 20 20 20 20 20 20 20 20 20 20 20 6e 46 75 6c              nFul
f350: 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c  lPathname, zFull
f360: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
f370: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
f380: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
f390: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
f3a0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
f3b0: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
f3c0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
f3d0: 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
f3e0: 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45      }.#if SQLITE
f3f0: 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 20 20  _THREADSAFE.    
f400: 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71    mutexOpen = sq
f410: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
f420: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
f430: 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20  TIC_OPEN);.     
f440: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
f450: 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b  nter(mutexOpen);
f460: 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72  .      mutexShar
f470: 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ed = sqlite3Mute
f480: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
f490: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
f4a0: 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  R);.      sqlite
f4b0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
f4c0: 74 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e 64  texShared);.#end
f4d0: 69 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74  if.      for(pBt
f4e0: 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64  =GLOBAL(BtShared
f4f0: 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
f500: 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20  acheList); pBt; 
f510: 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b  pBt=pBt->pNext){
f520: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
f530: 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pBt->nRef>0 );.
f540: 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73          if( 0==s
f550: 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e  trcmp(zFullPathn
f560: 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65  ame, sqlite3Page
f570: 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70  rFilename(pBt->p
f580: 50 61 67 65 72 2c 20 30 29 29 0a 20 20 20 20 20  Pager, 0)).     
f590: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
f5a0: 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70  qlite3PagerVfs(p
f5b0: 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66  Bt->pPager)==pVf
f5c0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  s ){.          i
f5d0: 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20  nt iDb;.        
f5e0: 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44    for(iDb=db->nD
f5f0: 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62  b-1; iDb>=0; iDb
f600: 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  --){.           
f610: 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e   Btree *pExistin
f620: 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  g = db->aDb[iDb]
f630: 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20  .pBt;.          
f640: 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67 20    if( pExisting 
f650: 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42  && pExisting->pB
f660: 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t==pBt ){.      
f670: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
f680: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
f690: 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
f6a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
f6b0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
f6c0: 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  xOpen);.        
f6d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
f6e0: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
f6f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
f700: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
f710: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
f720: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f730: 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20  NSTRAINT;.      
f740: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f750: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
f760: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
f770: 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b        pBt->nRef+
f780: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  +;.          bre
f790: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
f7a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
f7b0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
f7c0: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
f7d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
f7e0: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
f7f0: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
f800: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65  LITE_DEBUG.    e
f810: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  lse{.      /* In
f820: 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20   debug mode, we 
f830: 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74  mark all persist
f840: 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73  ent databases as
f850: 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20   sharable.      
f860: 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65  ** even when the
f870: 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73  y are not.  This
f880: 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c   exercises the l
f890: 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a  ocking code and.
f8a0: 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d        ** gives m
f8b0: 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20  ore opportunity 
f8c0: 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69  for asserts(sqli
f8d0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29  te3_mutex_held()
f8e0: 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ).      ** state
f8f0: 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f  ments to find lo
f900: 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a  cking problems..
f910: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
f920: 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
f930: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
f940: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42  .#endif.  if( pB
f950: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  t==0 ){.    /*. 
f960: 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
f970: 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65  ing asserts make
f980: 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63   sure that struc
f990: 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68  tures used by th
f9a0: 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20  e btree are.    
f9b0: 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a  ** the right siz
f9c0: 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67  e.  This is to g
f9d0: 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a  uard against siz
f9e0: 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72  e changes that r
f9f0: 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65  esult.    ** whe
fa00: 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61  n compiling on a
fa10: 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69   different archi
fa20: 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  tecture..    */.
fa30: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
fa40: 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69  of(i64)==8 || si
fa50: 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a  zeof(i64)==4 );.
fa60: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
fa70: 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69  of(u64)==8 || si
fa80: 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a  zeof(u64)==4 );.
fa90: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
faa0: 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20  of(u32)==4 );.  
fab0: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
fac0: 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20  (u16)==2 );.    
fad0: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50  assert( sizeof(P
fae0: 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20  gno)==4 );.  .  
faf0: 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d    pBt = sqlite3M
fb00: 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
fb10: 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69  f(*pBt) );.    i
fb20: 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
fb30: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
fb40: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
fb50: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
fb60: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
fb70: 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
fb80: 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61  (pVfs, &pBt->pPa
fb90: 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a  ger, zFilename,.
fba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbb0: 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41 5f            EXTRA_
fbc0: 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 73  SIZE, flags, vfs
fbd0: 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69 6e 69  Flags, pageReini
fbe0: 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
fbf0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
fc00: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
fc10: 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d  etMmapLimit(pBt-
fc20: 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e 73 7a 4d  >pPager, db->szM
fc30: 6d 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  map);.      rc =
fc40: 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61   sqlite3PagerRea
fc50: 64 46 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d  dFileheader(pBt-
fc60: 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a  >pPager,sizeof(z
fc70: 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61  DbHeader),zDbHea
fc80: 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  der);.    }.    
fc90: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
fca0: 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
fcb0: 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
fcc0: 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f      }.    pBt->o
fcd0: 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38 29 66  penFlags = (u8)f
fce0: 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64  lags;.    pBt->d
fcf0: 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c 69  b = db;.    sqli
fd00: 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
fd10: 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67  andler(pBt->pPag
fd20: 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  er, btreeInvokeB
fd30: 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42 74 29  usyHandler, pBt)
fd40: 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70  ;.    p->pBt = p
fd50: 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e  Bt;.  .    pBt->
fd60: 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20  pCursor = 0;.   
fd70: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
fd80: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
fd90: 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79  3PagerIsreadonly
fda0: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 20  (pBt->pPager) ) 
fdb0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
fdc0: 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a   BTS_READ_ONLY;.
fdd0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
fde0: 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20  CURE_DELETE.    
fdf0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
fe00: 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
fe10: 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70  TE;.#endif.    p
fe20: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
fe30: 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38  zDbHeader[16]<<8
fe40: 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31  ) | (zDbHeader[1
fe50: 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28  7]<<16);.    if(
fe60: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35   pBt->pageSize<5
fe70: 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53  12 || pBt->pageS
fe80: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
fe90: 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20  AGE_SIZE.       
fea0: 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65    || ((pBt->page
feb0: 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67  Size-1)&pBt->pag
fec0: 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20  eSize)!=0 ){.   
fed0: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
fee0: 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
fef0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
ff00: 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
ff10: 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20   the magic name 
ff20: 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20  ":memory:" will 
ff30: 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d  create an in-mem
ff40: 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  ory database, th
ff50: 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76  en.      ** leav
ff60: 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d  e the autoVacuum
ff70: 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e   mode at 0 (do n
ff80: 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c  ot auto-vacuum),
ff90: 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a   even if.      *
ffa0: 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  * SQLITE_DEFAULT
ffb0: 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74  _AUTOVACUUM is t
ffc0: 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  rue. On the othe
ffd0: 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20  r hand, if.     
ffe0: 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   ** SQLITE_OMIT_
fff0: 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65  MEMORYDB has bee
10000 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  n defined, then 
10010 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75  ":memory:" is ju
10020 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65  st a.      ** re
10030 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e  gular file-name.
10040 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
10050 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70  e auto-vacuum ap
10060 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72  plies as per nor
10070 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mal..      */.  
10080 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
10090 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b  e && !isMemdb ){
100a0 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75  .        pBt->au
100b0 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  toVacuum = (SQLI
100c0 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
100d0 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a  ACUUM ? 1 : 0);.
100e0 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63          pBt->inc
100f0 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  rVacuum = (SQLIT
10100 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
10110 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29  CUUM==2 ? 1 : 0)
10120 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
10130 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
10140 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
10150 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
10160 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a   zDbHeader[20];.
10170 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
10180 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53  ags |= BTS_PAGES
10190 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64  IZE_FIXED;.#ifnd
101a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
101b0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
101c0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
101d0 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62  = (get4byte(&zDb
101e0 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d  Header[36 + 4*4]
101f0 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42  )?1:0);.      pB
10200 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
10210 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
10220 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  ader[36 + 7*4])?
10230 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  1:0);.#endif.   
10240 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
10250 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
10260 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
10270 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
10280 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20   nReserve);.    
10290 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74  if( rc ) goto bt
102a0 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
102b0 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
102c0 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
102d0 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20  e - nReserve;.  
102e0 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
102f0 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
10300 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61   );  /* 8-byte a
10310 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65  lignment of page
10320 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20  Size */.   .#if 
10330 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
10340 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
10350 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
10360 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
10370 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  O).    /* Add th
10380 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f  e new BtShared o
10390 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e  bject to the lin
103a0 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c  ked list sharabl
103b0 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20  e BtShareds..   
103c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73   */.    if( p->s
103d0 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
103e0 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
103f0 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
10400 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20  exShared; ).    
10410 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b    pBt->nRef = 1;
10420 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
10430 49 43 28 20 6d 75 74 65 78 53 68 61 72 65 64 20  IC( mutexShared 
10440 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
10450 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
10460 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
10470 29 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ).      if( SQLI
10480 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
10490 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
104a0 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
104b0 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
104c0 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
104d0 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
104e0 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
104f0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d        if( pBt->m
10500 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
10510 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
10520 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
10530 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
10540 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ed = 0;.        
10550 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
10560 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  n_out;.        }
10570 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
10580 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
10590 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
105a0 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78  .      pBt->pNex
105b0 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  t = GLOBAL(BtSha
105c0 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
105d0 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20  edCacheList);.  
105e0 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61      GLOBAL(BtSha
105f0 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
10600 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70  edCacheList) = p
10610 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  Bt;.      sqlite
10620 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
10630 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
10640 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69  }.#endif.  }..#i
10650 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
10660 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
10670 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
10680 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
10690 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65  KIO).  /* If the
106a0 20 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20   new Btree uses 
106b0 61 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68  a sharable pBtSh
106c0 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20  ared, then link 
106d0 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72  the new.  ** Btr
106e0 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  ee into the list
106f0 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65   of all sharable
10700 20 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20   Btrees for the 
10710 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  same connection.
10720 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69  .  ** The list i
10730 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64  s kept in ascend
10740 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74  ing order by pBt
10750 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20   address..  */. 
10760 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
10770 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
10780 20 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a     Btree *pSib;.
10790 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
107a0 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
107b0 20 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20      if( (pSib = 
107c0 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21  db->aDb[i].pBt)!
107d0 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72  =0 && pSib->shar
107e0 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
107f0 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72  while( pSib->pPr
10800 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69  ev ){ pSib = pSi
10810 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20  b->pPrev; }.    
10820 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70      if( p->pBt<p
10830 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  Sib->pBt ){.    
10840 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
10850 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
10860 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20   p->pPrev = 0;. 
10870 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
10880 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
10890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
108a0 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e     while( pSib->
108b0 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70  pNext && pSib->p
108c0 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74  Next->pBt<p->pBt
108d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
108e0 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65  pSib = pSib->pNe
108f0 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  xt;.          }.
10900 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
10910 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  xt = pSib->pNext
10920 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
10930 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20  Prev = pSib;.   
10940 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e         if( p->pN
10950 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ext ){.         
10960 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
10970 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  ev = p;.        
10980 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53    }.          pS
10990 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  ib->pNext = p;. 
109a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
109b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
109c0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
109d0 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b  .  *ppBtree = p;
109e0 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  ..btree_open_out
109f0 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
10a00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
10a10 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61   pBt && pBt->pPa
10a20 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ger ){.      sql
10a30 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70  ite3PagerClose(p
10a40 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
10a50 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
10a60 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71  ree(pBt);.    sq
10a70 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
10a80 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b     *ppBtree = 0;
10a90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
10aa0 20 49 66 20 74 68 65 20 42 2d 54 72 65 65 20 77   If the B-Tree w
10ab0 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
10ac0 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20  opened, set the 
10ad0 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65  pager-cache size
10ae0 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   to the.    ** d
10af0 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78  efault value. Ex
10b00 63 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69  cept, when openi
10b10 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e  ng on an existin
10b20 67 20 73 68 61 72 65 64 20 70 61 67 65 72 2d 63  g shared pager-c
10b30 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20  ache,.    ** do 
10b40 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 70  not change the p
10b50 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e  ager-cache size.
10b60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
10b70 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
10b80 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29  ma(p, 0, 0)==0 )
10b90 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
10ba0 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
10bb0 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
10bc0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
10bd0 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20  CACHE_SIZE);.   
10be0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74   }.  }.  if( mut
10bf0 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73  exOpen ){.    as
10c00 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10c10 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70  tex_held(mutexOp
10c20 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  en) );.    sqlit
10c30 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
10c40 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20  utexOpen);.  }. 
10c50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10c60 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74  *.** Decrement t
10c70 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
10c80 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20   counter.  When 
10c90 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  it reaches zero,
10ca0 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42  .** remove the B
10cb0 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
10cc0 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69  e from the shari
10cd0 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  ng list.  Return
10ce0 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20  .** true if the 
10cf0 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
10d00 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65  unter reaches ze
10d10 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ro and return.**
10d20 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20   false if it is 
10d30 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a  still positive..
10d40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
10d50 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
10d60 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ist(BtShared *pB
10d70 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t){.#ifndef SQLI
10d80 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
10d90 41 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  ACHE.  MUTEX_LOG
10da0 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
10db0 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20 20  x *pMaster; ).  
10dc0 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b  BtShared *pList;
10dd0 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d  .  int removed =
10de0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   0;..  assert( s
10df0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74  qlite3_mutex_not
10e00 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
10e10 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49   );.  MUTEX_LOGI
10e20 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c  C( pMaster = sql
10e30 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
10e40 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
10e50 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20  IC_MASTER); ).  
10e60 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
10e70 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ter(pMaster);.  
10e80 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pBt->nRef--;.  i
10e90 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20  f( pBt->nRef<=0 
10ea0 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41  ){.    if( GLOBA
10eb0 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
10ec0 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
10ed0 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20  st)==pBt ){.    
10ee0 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65    GLOBAL(BtShare
10ef0 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
10f00 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74  CacheList) = pBt
10f10 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
10f20 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20  se{.      pList 
10f30 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  = GLOBAL(BtShare
10f40 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
10f50 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20  CacheList);.    
10f60 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
10f70 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d  pList) && pList-
10f80 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20  >pNext!=pBt ){. 
10f90 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69         pList=pLi
10fa0 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  st->pNext;.     
10fb0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57   }.      if( ALW
10fc0 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20  AYS(pList) ){.  
10fd0 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65        pList->pNe
10fe0 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  xt = pBt->pNext;
10ff0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11000 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
11010 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20  READSAFE ){.    
11020 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
11030 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29  free(pBt->mutex)
11040 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f  ;.    }.    remo
11050 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73  ved = 1;.  }.  s
11060 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
11070 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ve(pMaster);.  r
11080 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23  eturn removed;.#
11090 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b  else.  return 1;
110a0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
110b0 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e   Make sure pBt->
110c0 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73  pTmpSpace points
110d0 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f   to an allocatio
110e0 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c  n of .** MX_CELL
110f0 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73  _SIZE(pBt) bytes
11100 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11110 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61   allocateTempSpa
11120 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
11130 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  ){.  if( !pBt->p
11140 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  TmpSpace ){.    
11150 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
11160 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c   sqlite3PageMall
11170 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  oc( pBt->pageSiz
11180 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65  e );..    /* One
11190 20 6f 66 20 74 68 65 20 75 73 65 73 20 6f 66 20   of the uses of 
111a0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 69  pBt->pTmpSpace i
111b0 73 20 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c  s to format cell
111c0 73 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20  s before.    ** 
111d0 69 6e 73 65 72 74 69 6e 67 20 74 68 65 6d 20 69  inserting them i
111e0 6e 74 6f 20 61 20 6c 65 61 66 20 70 61 67 65 20  nto a leaf page 
111f0 28 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e  (function fillIn
11200 43 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20 20  Cell()). If.    
11210 2a 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c 65 73  ** a cell is les
11220 73 20 74 68 61 6e 20 34 20 62 79 74 65 73 20 69  s than 4 bytes i
11230 6e 20 73 69 7a 65 2c 20 69 74 20 69 73 20 72 6f  n size, it is ro
11240 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 62 79  unded up to 4 by
11250 74 65 73 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  tes.    ** by th
11260 65 20 76 61 72 69 6f 75 73 20 72 6f 75 74 69 6e  e various routin
11270 65 73 20 74 68 61 74 20 6d 61 6e 69 70 75 6c 61  es that manipula
11280 74 65 20 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e  te binary cells.
11290 20 57 68 69 63 68 0a 20 20 20 20 2a 2a 20 63 61   Which.    ** ca
112a0 6e 20 6d 65 61 6e 20 74 68 61 74 20 66 69 6c 6c  n mean that fill
112b0 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e  InCell() only in
112c0 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 66 69  itializes the fi
112d0 72 73 74 20 32 20 6f 72 20 33 0a 20 20 20 20 2a  rst 2 or 3.    *
112e0 2a 20 62 79 74 65 73 20 6f 66 20 70 54 6d 70 53  * bytes of pTmpS
112f0 70 61 63 65 2c 20 62 75 74 20 74 68 61 74 20 74  pace, but that t
11300 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
11310 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
11320 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20  .    ** it into 
11330 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e  a database page.
11340 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74   This is not act
11350 75 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c  ually a problem,
11360 20 62 75 74 20 69 74 0a 20 20 20 20 2a 2a 20 64   but it.    ** d
11370 6f 65 73 20 63 61 75 73 65 20 61 20 76 61 6c 67  oes cause a valg
11380 72 69 6e 64 20 65 72 72 6f 72 20 77 68 65 6e 20  rind error when 
11390 74 68 65 20 31 20 6f 72 20 32 20 62 79 74 65 73  the 1 or 2 bytes
113a0 20 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65 64 20   of unitialized 
113b0 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20  .    ** data is 
113c0 70 61 73 73 65 64 20 74 6f 20 73 79 73 74 65 6d  passed to system
113d0 20 63 61 6c 6c 20 77 72 69 74 65 28 29 2e 20 53   call write(). S
113e0 6f 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20  o to avoid this 
113f0 65 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65  error,.    ** ze
11400 72 6f 20 74 68 65 20 66 69 72 73 74 20 34 20 62  ro the first 4 b
11410 79 74 65 73 20 6f 66 20 74 65 6d 70 20 73 70 61  ytes of temp spa
11420 63 65 20 68 65 72 65 2e 20 20 2a 2f 0a 20 20 20  ce here.  */.   
11430 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70   if( pBt->pTmpSp
11440 61 63 65 20 29 20 6d 65 6d 73 65 74 28 70 42 74  ace ) memset(pBt
11450 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20  ->pTmpSpace, 0, 
11460 34 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  4);.  }.}../*.**
11470 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70   Free the pBt->p
11480 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  TmpSpace allocat
11490 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ion.*/.static vo
114a0 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63 65  id freeTempSpace
114b0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
114c0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72  .  sqlite3PageFr
114d0 65 65 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  ee( pBt->pTmpSpa
114e0 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70 54 6d 70  ce);.  pBt->pTmp
114f0 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  Space = 0;.}../*
11500 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65  .** Close an ope
11510 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69  n database and i
11520 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75  nvalidate all cu
11530 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rsors..*/.int sq
11540 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
11550 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
11560 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
11570 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20  pBt;.  BtCursor 
11580 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f  *pCur;..  /* Clo
11590 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f  se all cursors o
115a0 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20 68  pened via this h
115b0 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73  andle.  */.  ass
115c0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
115d0 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
115e0 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
115f0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
11600 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70  .  pCur = pBt->p
11610 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28  Cursor;.  while(
11620 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43   pCur ){.    BtC
11630 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43  ursor *pTmp = pC
11640 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70  ur;.    pCur = p
11650 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
11660 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65  if( pTmp->pBtree
11670 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==p ){.      sql
11680 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
11690 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20  rsor(pTmp);.    
116a0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c  }.  }..  /* Roll
116b0 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20  back any active 
116c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
116d0 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20  free the handle 
116e0 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20  structure..  ** 
116f0 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  The call to sqli
11700 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
11710 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62  () drops any tab
11720 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  le-locks held by
11730 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c  .  ** this handl
11740 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
11750 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
11760 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20  , SQLITE_OK);.  
11770 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11780 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  e(p);..  /* If t
11790 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f  here are still o
117a0 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67  ther outstanding
117b0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
117c0 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a  he shared-btree.
117d0 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20    ** structure, 
117e0 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20  return now. The 
117f0 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69  remainder of thi
11800 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61  s procedure clea
11810 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20  ns .  ** up the 
11820 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20  shared-btree..  
11830 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
11840 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26  wantToLock==0 &&
11850 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
11860 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
11870 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f  ble || removeFro
11880 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74  mSharingList(pBt
11890 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
118a0 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  pBt is no longer
118b0 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20   on the sharing 
118c0 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20  list, so we can 
118d0 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74  access.    ** it
118e0 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
118f0 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65  to hold the mute
11900 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
11910 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64   Clean out and d
11920 65 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72  elete the BtShar
11930 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a  ed object..    *
11940 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
11950 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
11960 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
11970 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
11980 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
11990 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70  xFreeSchema && p
119a0 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  Bt->pSchema ){. 
119b0 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53       pBt->xFreeS
119c0 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65  chema(pBt->pSche
119d0 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ma);.    }.    s
119e0 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
119f0 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
11a00 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65     freeTempSpace
11a10 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
11a20 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
11a30 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
11a40 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
11a50 43 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d  CHE.  assert( p-
11a60 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29  >wantToLock==0 )
11a70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c  ;.  assert( p->l
11a80 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66  ocked==0 );.  if
11a90 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e  ( p->pPrev ) p->
11aa0 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
11ab0 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70  ->pNext;.  if( p
11ac0 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65  ->pNext ) p->pNe
11ad0 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70  xt->pPrev = p->p
11ae0 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Prev;.#endif..  
11af0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
11b00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11b10 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
11b20 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f  ange the limit o
11b30 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
11b40 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e  pages allowed in
11b50 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a   the cache..**.*
11b60 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  * The maximum nu
11b70 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61  mber of cache pa
11b80 67 65 73 20 69 73 20 73 65 74 20 74 6f 20 74 68  ges is set to th
11b90 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61  e absolute.** va
11ba0 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20  lue of mxPage.  
11bb0 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67  If mxPage is neg
11bc0 61 74 69 76 65 2c 20 74 68 65 20 70 61 67 65 72  ative, the pager
11bd0 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65   will.** operate
11be0 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20   asynchronously 
11bf0 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74  - it will not st
11c00 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29  op to do fsync()
11c10 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64  s.** to insure d
11c20 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
11c30 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61  o the disk surfa
11c40 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e  ce before.** con
11c50 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61  tinuing.  Transa
11c60 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72  ctions still wor
11c70 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73  k if synchronous
11c80 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20   is off,.** and 
11c90 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
11ca0 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
11cb0 20 69 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d   if this program
11cc0 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75  .** crashes.  Bu
11cd0 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69  t if the operati
11ce0 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65  ng system crashe
11cf0 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a  s or there is.**
11d00 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72   an abrupt power
11d10 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79   failure when sy
11d20 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66  nchronous is off
11d30 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  , the database.*
11d40 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20  * could be left 
11d50 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  in an inconsiste
11d60 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72  nt and unrecover
11d70 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53  able state..** S
11d80 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e  ynchronous is on
11d90 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64   by default so d
11da0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
11db0 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72  on is not.** nor
11dc0 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a  mally a worry..*
11dd0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
11de0 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42  eeSetCacheSize(B
11df0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
11e00 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  age){.  BtShared
11e10 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
11e20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11e30 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
11e40 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
11e50 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
11e60 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
11e70 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
11e80 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  (pBt->pPager, mx
11e90 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
11ea0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11eb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11ec0 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
11ed0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
11ee0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
11ef0 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61  e limit on the a
11f00 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74  mount of the dat
11f10 61 62 61 73 65 20 66 69 6c 65 20 74 68 61 74 20  abase file that 
11f20 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79  may be.** memory
11f30 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20   mapped..*/.int 
11f40 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d  sqlite3BtreeSetM
11f50 6d 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a  mapLimit(Btree *
11f60 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  p, sqlite3_int64
11f70 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68   szMmap){.  BtSh
11f80 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
11f90 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
11fa0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
11fb0 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
11fc0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
11fd0 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
11fe0 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c  te3PagerSetMmapL
11ff0 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72  imit(pBt->pPager
12000 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c  , szMmap);.  sql
12010 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
12020 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
12030 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
12040 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  /* SQLITE_MAX_MM
12050 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a  AP_SIZE>0 */../*
12060 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77  .** Change the w
12070 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  ay data is synce
12080 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64  d to disk in ord
12090 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f  er to increase o
120a0 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f  r decrease.** ho
120b0 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62  w well the datab
120c0 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61  ase resists dama
120d0 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
120e0 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a  shes and power.*
120f0 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76  * failures.  Lev
12100 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65  el 1 is the same
12110 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73   as asynchronous
12120 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63   (no syncs() occ
12130 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20  ur and.** there 
12140 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62  is a high probab
12150 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29  ility of damage)
12160 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65    Level 2 is the
12170 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65   default.  There
12180 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f  .** is a very lo
12190 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70  w but non-zero p
121a0 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
121b0 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72  mage.  Level 3 r
121c0 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72  educes the.** pr
121d0 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
121e0 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f  age to near zero
121f0 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74   but with a writ
12200 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65  e performance re
12210 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  duction..*/.#ifn
12220 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12230 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e  PAGER_PRAGMAS.in
12240 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
12250 74 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42  tPagerFlags(.  B
12260 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
12270 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
12280 65 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61  ee to set the sa
12290 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f  fety level on */
122a0 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c  .  unsigned pgFl
122b0 61 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72  ags       /* Var
122c0 69 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61  ious PAGER_* fla
122d0 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  gs */.){.  BtSha
122e0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
122f0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
12300 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
12310 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
12320 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
12330 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
12340 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28  e3PagerSetFlags(
12350 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46  pBt->pPager, pgF
12360 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  lags);.  sqlite3
12370 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
12380 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12390 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
123a0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
123b0 66 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65  f the given btre
123c0 65 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65  e is set to safe
123d0 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20  ty level 1.  In 
123e0 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20  other.** words, 
123f0 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e  return TRUE if n
12400 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20  o sync() occurs 
12410 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
12420 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
12430 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c  3BtreeSyncDisabl
12440 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
12450 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
12460 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
12470 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
12480 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
12490 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20  ->db->mutex) ); 
124a0 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65   .  sqlite3Btree
124b0 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
124c0 72 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  rt( pBt && pBt->
124d0 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d  pPager );.  rc =
124e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73   sqlite3PagerNos
124f0 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ync(pBt->pPager)
12500 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
12510 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
12520 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12530 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75  Change the defau
12540 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e  lt pages size an
12550 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
12560 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70  reserved bytes p
12570 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20  er page..** Or, 
12580 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  if the page size
12590 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
125a0 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20  n fixed, return 
125b0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
125c0 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e  .** without chan
125d0 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a  ging anything..*
125e0 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69  *.** The page si
125f0 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77  ze must be a pow
12600 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20  er of 2 between 
12610 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20  512 and 65536.  
12620 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73  If the page.** s
12630 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65  ize supplied doe
12640 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20  s not meet this 
12650 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20  constraint then 
12660 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
12670 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e   not.** changed.
12680 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65  .**.** Page size
12690 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65  s are constraine
126a0 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20  d to be a power 
126b0 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74  of two so that t
126c0 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20  he region.** of 
126d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
126e0 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  e used for locki
126f0 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74  ng (beginning at
12700 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a   PENDING_BYTE,.*
12710 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  * the first byte
12720 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f   past the 1GB bo
12730 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30  undary, 0x400000
12740 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63  00) needs to occ
12750 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67  ur.** at the beg
12760 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65  inning of a page
12770 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
12780 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73  eter nReserve is
12790 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
127a0 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
127b0 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20   of reserved.** 
127c0 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69  bytes per page i
127d0 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
127e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
127f0 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20  Fix!=0 then the 
12800 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
12810 45 44 20 66 6c 61 67 20 69 73 20 73 65 74 20 73  ED flag is set s
12820 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  o that the page 
12830 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f  size.** and auto
12840 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20  vacuum mode can 
12850 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61  no longer be cha
12860 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
12870 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
12880 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
12890 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74  nt pageSize, int
128a0 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69   nReserve, int i
128b0 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Fix){.  int rc =
128c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
128d0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
128e0 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
128f0 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20  nReserve>=-1 && 
12900 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
12910 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
12920 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70  nter(p);.  if( p
12930 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
12940 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
12950 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  D ){.    sqlite3
12960 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
12970 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12980 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
12990 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20   if( nReserve<0 
129a0 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20  ){.    nReserve 
129b0 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
129c0 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
129d0 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
129e0 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20   nReserve>=0 && 
129f0 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
12a00 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e  .  if( pageSize>
12a10 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
12a20 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
12a30 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20  E_SIZE &&.      
12a40 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26    ((pageSize-1)&
12a50 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a  pageSize)==0 ){.
12a60 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
12a70 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
12a80 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
12a90 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70 42  t->pPage1 && !pB
12aa0 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
12ab0 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
12ac0 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b  = (u32)pageSize;
12ad0 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
12ae0 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72  ce(pBt);.  }.  r
12af0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
12b00 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
12b10 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
12b20 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
12b30 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c  e);.  pBt->usabl
12b40 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
12b50 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65  eSize - (u16)nRe
12b60 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69  serve;.  if( iFi
12b70 78 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  x ) pBt->btsFlag
12b80 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
12b90 45 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74  E_FIXED;.  sqlit
12ba0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
12bb0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12bc0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
12bd0 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69  e currently defi
12be0 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f  ned page size.*/
12bf0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
12c00 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72  eGetPageSize(Btr
12c10 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ee *p){.  return
12c20 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
12c30 65 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  e;.}..#if define
12c40 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  d(SQLITE_HAS_COD
12c50 45 43 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  EC) || defined(S
12c60 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
12c70 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
12c80 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73   is similar to s
12c90 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
12ca0 73 65 72 76 65 28 29 2c 20 65 78 63 65 70 74 20  serve(), except 
12cb0 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f  that it.** may o
12cc0 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66  nly be called if
12cd0 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
12ce0 64 20 74 68 61 74 20 74 68 65 20 62 2d 74 72 65  d that the b-tre
12cf0 65 20 6d 75 74 65 78 20 69 73 20 61 6c 72 65 61  e mutex is alrea
12d00 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a  dy.** held..**.*
12d10 2a 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c  * This is useful
12d20 20 69 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c 20   in one special 
12d30 63 61 73 65 20 69 6e 20 74 68 65 20 62 61 63 6b  case in the back
12d40 75 70 20 41 50 49 20 63 6f 64 65 20 77 68 65 72  up API code wher
12d50 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e  e it is.** known
12d60 20 74 68 61 74 20 74 68 65 20 73 68 61 72 65 64   that the shared
12d70 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73   b-tree mutex is
12d80 20 68 65 6c 64 2c 20 62 75 74 20 74 68 65 20 6d   held, but the m
12d90 75 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20  utex on the .** 
12da0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
12db0 74 68 61 74 20 6f 77 6e 73 20 2a 70 20 69 73 20  that owns *p is 
12dc0 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  not. In this cas
12dd0 65 20 69 66 20 73 71 6c 69 74 65 33 42 74 72 65  e if sqlite3Btre
12de0 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72 65  eEnter().** were
12df0 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20 69   to be called, i
12e00 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65 20  t might collide 
12e10 77 69 74 68 20 73 6f 6d 65 20 6f 74 68 65 72 20  with some other 
12e20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65  operation on the
12e30 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
12e40 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70  dle that owns *p
12e50 2c 20 63 61 75 73 69 6e 67 20 75 6e 64 65 66 69  , causing undefi
12e60 6e 65 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f  ned behavior..*/
12e70 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
12e80 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74  eGetReserveNoMut
12e90 65 78 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ex(Btree *p){.  
12ea0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
12eb0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42  mutex_held(p->pB
12ec0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
12ed0 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
12ee0 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d  geSize - p->pBt-
12ef0 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 7d 0a 23  >usableSize;.}.#
12f00 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
12f10 48 41 53 5f 43 4f 44 45 43 20 7c 7c 20 53 51 4c  HAS_CODEC || SQL
12f20 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69  ITE_DEBUG */..#i
12f30 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
12f40 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
12f50 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65  GMAS) || !define
12f60 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  d(SQLITE_OMIT_VA
12f70 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  CUUM)./*.** Retu
12f80 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
12f90 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
12fa0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
12fb0 65 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a  ery page that.**
12fc0 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79   are intentually
12fd0 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54   left unused.  T
12fe0 68 69 73 20 69 73 20 74 68 65 20 22 72 65 73 65  his is the "rese
12ff0 72 76 65 64 22 20 73 70 61 63 65 20 74 68 61 74  rved" space that
13000 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73   is.** sometimes
13010 20 75 73 65 64 20 62 79 20 65 78 74 65 6e 73 69   used by extensi
13020 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ons..*/.int sqli
13030 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
13040 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ve(Btree *p){.  
13050 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
13060 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
13070 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67   n = p->pBt->pag
13080 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e  eSize - p->pBt->
13090 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71  usableSize;.  sq
130a0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
130b0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  p);.  return n;.
130c0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
130d0 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
130e0 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61  unt for a databa
130f0 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  se if mxPage is 
13100 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20  positive..** No 
13110 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
13120 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20   if mxPage is 0 
13130 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20  or negative..** 
13140 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
13150 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67  e value of mxPag
13160 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61  e, return the ma
13170 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
13180 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13190 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e  BtreeMaxPageCoun
131a0 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
131b0 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e  mxPage){.  int n
131c0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
131d0 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
131e0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
131f0 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d  ageCount(p->pBt-
13200 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29  >pPager, mxPage)
13210 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
13220 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
13230 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn n;.}../*.** S
13240 65 74 20 74 68 65 20 42 54 53 5f 53 45 43 55 52  et the BTS_SECUR
13250 45 5f 44 45 4c 45 54 45 20 66 6c 61 67 20 69 66  E_DELETE flag if
13260 20 6e 65 77 46 6c 61 67 20 69 73 20 30 20 6f 72   newFlag is 0 or
13270 20 31 2e 20 20 49 66 20 6e 65 77 46 6c 61 67 20   1.  If newFlag 
13280 69 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d  is -1,.** then m
13290 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20  ake no changes. 
132a0 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74   Always return t
132b0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
132c0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
132d0 45 0a 2a 2a 20 73 65 74 74 69 6e 67 20 61 66 74  E.** setting aft
132e0 65 72 20 74 68 65 20 63 68 61 6e 67 65 2e 0a 2a  er the change..*
132f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
13300 65 65 53 65 63 75 72 65 44 65 6c 65 74 65 28 42  eeSecureDelete(B
13310 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77  tree *p, int new
13320 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a  Flag){.  int b;.
13330 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
13340 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  urn 0;.  sqlite3
13350 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
13360 20 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20   if( newFlag>=0 
13370 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62  ){.    p->pBt->b
13380 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
13390 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20  SECURE_DELETE;. 
133a0 20 20 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29     if( newFlag )
133b0 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67   p->pBt->btsFlag
133c0 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f  s |= BTS_SECURE_
133d0 44 45 4c 45 54 45 3b 0a 20 20 7d 20 0a 20 20 62  DELETE;.  } .  b
133e0 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46   = (p->pBt->btsF
133f0 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
13400 45 5f 44 45 4c 45 54 45 29 21 3d 30 3b 0a 20 20  E_DELETE)!=0;.  
13410 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
13420 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  e(p);.  return b
13430 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
13440 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
13450 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
13460 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
13470 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
13480 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  ) */../*.** Chan
13490 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  ge the 'auto-vac
134a0 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66  uum' property of
134b0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
134c0 66 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75  f the 'autoVacuu
134d0 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  m'.** parameter 
134e0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
134f0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
13500 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49  de is enabled. I
13510 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73  f zero, it.** is
13520 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64   disabled. The d
13530 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
13540 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
13550 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a   property is .**
13560 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
13570 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  he SQLITE_DEFAUL
13580 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63  T_AUTOVACUUM mac
13590 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ro..*/.int sqlit
135a0 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61  e3BtreeSetAutoVa
135b0 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69  cuum(Btree *p, i
135c0 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a  nt autoVacuum){.
135d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
135e0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
135f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
13600 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20  ADONLY;.#else.  
13610 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
13620 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
13630 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
13640 75 38 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f  u8 av = (u8)auto
13650 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74  Vacuum;..  sqlit
13660 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
13670 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73  .  if( (pBt->bts
13680 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47 45  Flags & BTS_PAGE
13690 53 49 5a 45 5f 46 49 58 45 44 29 21 3d 30 20 26  SIZE_FIXED)!=0 &
136a0 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74  & (av ?1:0)!=pBt
136b0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
136c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
136d0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73  READONLY;.  }els
136e0 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  e{.    pBt->auto
136f0 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30  Vacuum = av ?1:0
13700 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
13710 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31  acuum = av==2 ?1
13720 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  :0;.  }.  sqlite
13730 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
13740 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
13750 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
13760 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
13770 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75   the 'auto-vacuu
13780 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20  m' property. If 
13790 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a  auto-vacuum is .
137a0 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20  ** enabled 1 is 
137b0 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
137c0 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ise 0..*/.int sq
137d0 6c 69 74 65 33 42 74 72 65 65 47 65 74 41 75 74  lite3BtreeGetAut
137e0 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  oVacuum(Btree *p
137f0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
13800 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
13810 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f  .  return BTREE_
13820 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b  AUTOVACUUM_NONE;
13830 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b  .#else.  int rc;
13840 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
13850 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
13860 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e  (.    (!p->pBt->
13870 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45  autoVacuum)?BTRE
13880 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e  E_AUTOVACUUM_NON
13890 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d  E:.    (!p->pBt-
138a0 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52  >incrVacuum)?BTR
138b0 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55  EE_AUTOVACUUM_FU
138c0 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55  LL:.    BTREE_AU
138d0 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20  TOVACUUM_INCR.  
138e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
138f0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
13900 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
13910 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72  .../*.** Get a r
13920 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67  eference to pPag
13930 65 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  e1 of the databa
13940 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77  se file.  This w
13950 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75  ill.** also acqu
13960 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f  ire a readlock o
13970 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a  n that file..**.
13980 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
13990 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
139a0 65 73 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c  ess.  If the fil
139b0 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65  e is not a.** we
139c0 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61  ll-formed databa
139d0 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51  se file, then SQ
139e0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20  LITE_CORRUPT is 
139f0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c  returned..** SQL
13a00 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
13a10 72 6e 65 64 20 69 66 20 74 68 65 20 64 61 74 61  rned if the data
13a20 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20  base is locked. 
13a30 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
13a40 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
13a50 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65  we run out of me
13a60 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  mory. .*/.static
13a70 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42   int lockBtree(B
13a80 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
13a90 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
13aa0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
13ab0 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e  code from subfun
13ac0 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50  ctions */.  MemP
13ad0 61 67 65 20 2a 70 50 61 67 65 31 3b 20 20 20 20  age *pPage1;    
13ae0 20 2f 2a 20 50 61 67 65 20 31 20 6f 66 20 74 68   /* Page 1 of th
13af0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
13b00 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  */.  int nPage; 
13b10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
13b20 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
13b30 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
13b40 20 20 69 6e 74 20 6e 50 61 67 65 46 69 6c 65 20    int nPageFile 
13b50 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72  = 0;   /* Number
13b60 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
13b70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
13b80 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 48 65 61  /.  int nPageHea
13b90 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  der;     /* Numb
13ba0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
13bb0 68 65 20 64 61 74 61 62 61 73 65 20 61 63 63 6f  he database acco
13bc0 72 64 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a  rding to hdr */.
13bd0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
13be0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
13bf0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
13c00 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
13c10 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  e1==0 );.  rc = 
13c20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72  sqlite3PagerShar
13c30 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67  edLock(pBt->pPag
13c40 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
13c50 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
13c60 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72  n rc;.  rc = btr
13c70 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
13c80 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20  , &pPage1, 0);. 
13c90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13ca0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
13cb0 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68  .  /* Do some ch
13cc0 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69  ecking to help i
13cd0 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77  nsure the file w
13ce0 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20  e opened really 
13cf0 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20  is.  ** a valid 
13d00 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a  database file. .
13d10 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e    */.  nPage = n
13d20 50 61 67 65 48 65 61 64 65 72 20 3d 20 67 65 74  PageHeader = get
13d30 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50  4byte(28+(u8*)pP
13d40 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20  age1->aData);.  
13d50 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
13d60 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
13d70 72 2c 20 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a  r, &nPageFile);.
13d80 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c    if( nPage==0 |
13d90 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a  | memcmp(24+(u8*
13da0 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20  )pPage1->aData, 
13db0 39 32 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  92+(u8*)pPage1->
13dc0 61 44 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20  aData,4)!=0 ){. 
13dd0 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
13de0 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  File;.  }.  if( 
13df0 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75  nPage>0 ){.    u
13e00 33 32 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  32 pageSize;.   
13e10 20 75 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b   u32 usableSize;
13e20 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d  .    u8 *page1 =
13e30 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a   pPage1->aData;.
13e40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13e50 4e 4f 54 41 44 42 3b 0a 20 20 20 20 69 66 28 20  NOTADB;.    if( 
13e60 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d  memcmp(page1, zM
13e70 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21  agicHeader, 16)!
13e80 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
13e90 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
13ea0 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  ed;.    }..#ifde
13eb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
13ec0 4c 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  L.    if( page1[
13ed0 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70  18]>1 ){.      p
13ee0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
13ef0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20  BTS_READ_ONLY;. 
13f00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
13f10 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[19]>1 ){.    
13f20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
13f30 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
13f40 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61  #else.    if( pa
13f50 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20  ge1[18]>2 ){.   
13f60 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
13f70 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c   |= BTS_READ_ONL
13f80 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  Y;.    }.    if(
13f90 20 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a   page1[19]>2 ){.
13fa0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
13fb0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
13fc0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
13fd0 68 65 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e  he write version
13fe0 20 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68   is set to 2, th
13ff0 69 73 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  is database shou
14000 6c 64 20 62 65 20 61 63 63 65 73 73 65 64 0a 20  ld be accessed. 
14010 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64     ** in WAL mod
14020 65 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73  e. If the log is
14030 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
14040 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20  n, open it now. 
14050 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74  Then .    ** ret
14060 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  urn SQLITE_OK an
14070 64 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  d return without
14080 20 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68   populating BtSh
14090 61 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20  ared.pPage1..   
140a0 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64   ** The caller d
140b0 65 74 65 63 74 73 20 74 68 69 73 20 61 6e 64 20  etects this and 
140c0 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74  calls this funct
140d0 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20  ion again. This 
140e0 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  is.    ** requir
140f0 65 64 20 61 73 20 74 68 65 20 76 65 72 73 69 6f  ed as the versio
14100 6e 20 6f 66 20 70 61 67 65 20 31 20 63 75 72 72  n of page 1 curr
14110 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67  ently in the pag
14120 65 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a  e1 buffer.    **
14130 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20   may not be the 
14140 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d  latest version -
14150 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20   there may be a 
14160 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65  newer one in the
14170 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65   log.    ** file
14180 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
14190 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26   page1[19]==2 &&
141a0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
141b0 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30  & BTS_NO_WAL)==0
141c0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73   ){.      int is
141d0 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Open = 0;.      
141e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
141f0 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50  rOpenWal(pBt->pP
14200 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a  ager, &isOpen);.
14210 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
14220 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14230 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
14240 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  it_failed;.     
14250 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65   }else if( isOpe
14260 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
14270 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
14280 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  e1);.        ret
14290 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
142a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
142b0 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b  = SQLITE_NOTADB;
142c0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
142d0 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
142e0 6d 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74  m embedded fract
142f0 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 78 61 63  ion must be exac
14300 74 6c 79 20 32 35 25 2e 20 20 41 6e 64 20 74 68  tly 25%.  And th
14310 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a  e minimum.    **
14320 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69   embedded fracti
14330 6f 6e 20 6d 75 73 74 20 62 65 20 31 32 2e 35 25  on must be 12.5%
14340 20 66 6f 72 20 62 6f 74 68 20 6c 65 61 66 2d 64   for both leaf-d
14350 61 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66  ata and non-leaf
14360 2d 64 61 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68  -data..    ** Th
14370 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67  e original desig
14380 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20  n allowed these 
14390 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c  amounts to vary,
143a0 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a   but as of.    *
143b0 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c  * version 3.6.0,
143c0 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d   we require them
143d0 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20   to be fixed..  
143e0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d    */.    if( mem
143f0 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20  cmp(&page1[21], 
14400 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33  "\100\040\040",3
14410 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
14420 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
14430 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
14440 70 61 67 65 53 69 7a 65 20 3d 20 28 70 61 67 65  pageSize = (page
14450 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67  1[16]<<8) | (pag
14460 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20  e1[17]<<16);.   
14470 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d   if( ((pageSize-
14480 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0a  1)&pageSize)!=0.
14490 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65       || pageSize
144a0 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
144b0 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70  _SIZE .     || p
144c0 61 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20  ageSize<=256 .  
144d0 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20    ){.      goto 
144e0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
144f0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  d;.    }.    ass
14500 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26  ert( (pageSize &
14510 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73   7)==0 );.    us
14520 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53  ableSize = pageS
14530 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b  ize - page1[20];
14540 0a 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61  .    if( (u32)pa
14550 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67  geSize!=pBt->pag
14560 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  eSize ){.      /
14570 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20  * After reading 
14580 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
14590 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
145a0 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73  ssuming a page s
145b0 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ize.      ** of 
145c0 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a  BtShared.pageSiz
145d0 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f  e, we have disco
145e0 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70  vered that the p
145f0 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20  age-size is.    
14600 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61    ** actually pa
14610 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74  geSize. Unlock t
14620 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61  he database, lea
14630 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61  ve pBt->pPage1 a
14640 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20  t.      ** zero 
14650 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
14660 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72  E_OK. The caller
14670 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20   will call this 
14680 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
14690 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65  * again with the
146a0 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69   correct page-si
146b0 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ze..      */.   
146c0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
146d0 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42  Page1);.      pB
146e0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
146f0 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
14700 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
14710 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
14720 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
14730 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  pBt);.      rc =
14740 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
14750 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
14760 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
14770 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
14780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14790 20 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a           pageSiz
147a0 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  e-usableSize);. 
147b0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
147c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
147d0 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  Bt->db->flags & 
147e0 53 51 4c 49 54 45 5f 52 65 63 6f 76 65 72 79 4d  SQLITE_RecoveryM
147f0 6f 64 65 29 3d 3d 30 20 26 26 20 6e 50 61 67 65  ode)==0 && nPage
14800 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20  >nPageFile ){.  
14810 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14820 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
14830 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
14840 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
14850 7d 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c 65  }.    if( usable
14860 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20  Size<480 ){.    
14870 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
14880 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
14890 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
148a0 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
148b0 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
148c0 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  e = usableSize;.
148d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
148e0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
148f0 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
14900 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
14910 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29  page1[36 + 4*4])
14920 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ?1:0);.    pBt->
14930 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65  incrVacuum = (ge
14940 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
14950 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 7*4])?1:0);.#
14960 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
14970 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20  maxLocal is the 
14980 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  maximum amount o
14990 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f  f payload to sto
149a0 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20  re locally for. 
149b0 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b   ** a cell.  Mak
149c0 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61  e sure it is sma
149d0 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61  ll enough so tha
149e0 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61  t at least minFa
149f0 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20  nout.  ** cells 
14a00 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  can will fit on 
14a10 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73  one page.  We as
14a20 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70  sume a 10-byte p
14a30 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a  age header..  **
14a40 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79   Besides the pay
14a50 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d  load, the cell m
14a60 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20  ust store:.  ** 
14a70 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74      2-byte point
14a80 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20  er to the cell. 
14a90 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63   **     4-byte c
14aa0 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a  hild pointer.  *
14ab0 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65  *     9-byte nKe
14ac0 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20  y value.  **    
14ad0 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61   4-byte nData va
14ae0 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  lue.  **     4-b
14af0 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  yte overflow pag
14b00 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53  e pointer.  ** S
14b10 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74  o a cell consist
14b20 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f  s of a 2-byte po
14b30 69 6e 74 65 72 2c 20 61 20 68 65 61 64 65 72 20  inter, a header 
14b40 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68  which is as much
14b50 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65   as.  ** 17 byte
14b60 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62  s long, 0 to N b
14b70 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c  ytes of payload,
14b80 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c   and an optional
14b90 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4 byte overflow
14ba0 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74  .  ** page point
14bb0 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e  er..  */.  pBt->
14bc0 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  maxLocal = (u16)
14bd0 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ((pBt->usableSiz
14be0 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32  e-12)*64/255 - 2
14bf0 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f  3);.  pBt->minLo
14c00 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74  cal = (u16)((pBt
14c10 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
14c20 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *32/255 - 23);. 
14c30 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20   pBt->maxLeaf = 
14c40 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u16)(pBt->usabl
14c50 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70  eSize - 35);.  p
14c60 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75  Bt->minLeaf = (u
14c70 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
14c80 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
14c90 2d 20 32 33 29 3b 0a 20 20 69 66 28 20 70 42 74  - 23);.  if( pBt
14ca0 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29  ->maxLocal>127 )
14cb0 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62  {.    pBt->max1b
14cc0 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 31 32 37  ytePayload = 127
14cd0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
14ce0 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  Bt->max1bytePayl
14cf0 6f 61 64 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d  oad = (u8)pBt->m
14d00 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61  axLocal;.  }.  a
14d10 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c  ssert( pBt->maxL
14d20 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43  eaf + 23 <= MX_C
14d30 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
14d40 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d  .  pBt->pPage1 =
14d50 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e   pPage1;.  pBt->
14d60 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
14d70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14d80 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66  K;..page1_init_f
14d90 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65  ailed:.  release
14da0 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
14db0 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
14dc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14dd0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
14de0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
14df0 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   number of curso
14e00 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20  rs open on pBt. 
14e10 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a  This is for use.
14e20 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65  ** in assert() e
14e30 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69  xpressions, so i
14e40 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c  t is only compil
14e50 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  ed if NDEBUG is 
14e60 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a  not.** defined..
14e70 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65  **.** Only write
14e80 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75   cursors are cou
14e90 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c 79 20 69  nted if wrOnly i
14ea0 73 20 74 72 75 65 2e 20 20 49 66 20 77 72 4f 6e  s true.  If wrOn
14eb0 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74  ly is.** false t
14ec0 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  hen all cursors 
14ed0 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a  are counted..**.
14ee0 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
14ef0 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ses of this rout
14f00 69 6e 65 2c 20 61 20 63 75 72 73 6f 72 20 69 73  ine, a cursor is
14f10 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74   any cursor that
14f20 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f  .** is capable o
14f30 66 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  f reading or wri
14f40 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
14f50 62 73 65 2e 20 20 43 75 72 73 6f 72 73 20 74 68  bse.  Cursors th
14f60 61 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  at.** have been 
14f70 74 72 69 70 70 65 64 20 69 6e 74 6f 20 74 68 65  tripped into the
14f80 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 73 74   CURSOR_FAULT st
14f90 61 74 65 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e  ate are not coun
14fa0 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
14fb0 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  nt countValidCur
14fc0 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70  sors(BtShared *p
14fd0 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29 7b  Bt, int wrOnly){
14fe0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
14ff0 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a  r;.  int r = 0;.
15000 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e    for(pCur=pBt->
15010 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70  pCursor; pCur; p
15020 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29  Cur=pCur->pNext)
15030 7b 0a 20 20 20 20 69 66 28 20 28 77 72 4f 6e 6c  {.    if( (wrOnl
15040 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 63  y==0 || (pCur->c
15050 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57  urFlags & BTCF_W
15060 72 69 74 65 46 6c 61 67 29 21 3d 30 29 0a 20 20  riteFlag)!=0).  
15070 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61     && pCur->eSta
15080 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te!=CURSOR_FAULT
15090 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72   ) r++; .  }.  r
150a0 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69  eturn r;.}.#endi
150b0 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72  f../*.** If ther
150c0 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
150d0 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64  ding cursors and
150e0 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74   we are not in t
150f0 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20  he middle.** of 
15100 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75  a transaction bu
15110 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61  t there is a rea
15120 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
15130 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20  tabase, then.** 
15140 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72  this routine unr
15150 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61  efs the first pa
15160 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
15170 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a  se file which .*
15180 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74  * has the effect
15190 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68   of releasing th
151a0 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a  e read lock..**.
151b0 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  ** If there is a
151c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
151d0 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72  progress, this r
151e0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
151f0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
15200 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  d unlockBtreeIfU
15210 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a  nused(BtShared *
15220 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pBt){.  assert( 
15230 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
15240 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
15250 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e  ;.  assert( coun
15260 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42  tValidCursors(pB
15270 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  t,0)==0 || pBt->
15280 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52  inTransaction>TR
15290 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66  ANS_NONE );.  if
152a0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
152b0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
152c0 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21   && pBt->pPage1!
152d0 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
152e0 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  ( pBt->pPage1->a
152f0 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
15300 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
15310 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  Refcount(pBt->pP
15320 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20  ager)==1 );.    
15330 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
15340 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  ge1->aData );.  
15350 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 42    releasePage(pB
15360 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20  t->pPage1);.    
15370 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
15380 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
15390 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61   pBt points to a
153a0 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65  n empty file the
153b0 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65  n convert that e
153c0 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74  mpty file.** int
153d0 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61  o a new empty da
153e0 74 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61  tabase by initia
153f0 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74  lizing the first
15400 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
15410 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
15420 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62  tic int newDatab
15430 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ase(BtShared *pB
15440 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  t){.  MemPage *p
15450 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  P1;.  unsigned c
15460 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74  har *data;.  int
15470 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
15480 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
15490 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
154a0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61  ;.  if( pBt->nPa
154b0 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  ge>0 ){.    retu
154c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
154d0 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70  }.  pP1 = pBt->p
154e0 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28  Page1;.  assert(
154f0 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74   pP1!=0 );.  dat
15500 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a  a = pP1->aData;.
15510 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
15520 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44  gerWrite(pP1->pD
15530 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
15540 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
15550 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61  memcpy(data, zMa
15560 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  gicHeader, sizeo
15570 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29  f(zMagicHeader))
15580 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
15590 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
155a0 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b 31  ==16 );.  data[1
155b0 36 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e  6] = (u8)((pBt->
155c0 70 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78 66  pageSize>>8)&0xf
155d0 66 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d  f);.  data[17] =
155e0 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65   (u8)((pBt->page
155f0 53 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29 3b  Size>>16)&0xff);
15600 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b  .  data[18] = 1;
15610 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b  .  data[19] = 1;
15620 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
15630 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d  usableSize<=pBt-
15640 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74  >pageSize && pBt
15650 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35  ->usableSize+255
15660 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  >=pBt->pageSize)
15670 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28  ;.  data[20] = (
15680 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  u8)(pBt->pageSiz
15690 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
156a0 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d  ize);.  data[21]
156b0 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32   = 64;.  data[22
156c0 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32  ] = 32;.  data[2
156d0 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65  3] = 32;.  memse
156e0 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20  t(&data[24], 0, 
156f0 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50  100-24);.  zeroP
15700 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54  age(pP1, PTF_INT
15710 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46  KEY|PTF_LEAF|PTF
15720 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70  _LEAFDATA );.  p
15730 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
15740 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
15750 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ED;.#ifndef SQLI
15760 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
15770 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  UM.  assert( pBt
15780 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20  ->autoVacuum==1 
15790 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  || pBt->autoVacu
157a0 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  um==0 );.  asser
157b0 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  t( pBt->incrVacu
157c0 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e  um==1 || pBt->in
157d0 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  crVacuum==0 );. 
157e0 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
157f0 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e  36 + 4*4], pBt->
15800 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70  autoVacuum);.  p
15810 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36  ut4byte(&data[36
15820 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e   + 7*4], pBt->in
15830 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69  crVacuum);.#endi
15840 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d  f.  pBt->nPage =
15850 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d   1;.  data[31] =
15860 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
15870 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
15880 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
15890 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
158a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
158b0 28 63 72 65 61 74 69 6e 67 20 61 20 64 61 74 61  (creating a data
158c0 62 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69  base.** consisti
158d0 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70  ng of a single p
158e0 61 67 65 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d  age and no schem
158f0 61 20 6f 62 6a 65 63 74 73 29 2e 20 52 65 74 75  a objects). Retu
15900 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
15910 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
15920 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
15930 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  r code otherwise
15940 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15950 42 74 72 65 65 4e 65 77 44 62 28 42 74 72 65 65  BtreeNewDb(Btree
15960 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
15970 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
15980 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74  ter(p);.  p->pBt
15990 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 72  ->nPage = 0;.  r
159a0 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
159b0 70 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69 74  p->pBt);.  sqlit
159c0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
159d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
159e0 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
159f0 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72  o start a new tr
15a00 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69  ansaction. A wri
15a10 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  te-transaction.*
15a20 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20  * is started if 
15a30 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
15a40 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20  ent is nonzero, 
15a50 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64  otherwise a read
15a60 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  -.** transaction
15a70 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
15a80 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f   argument is 2 o
15a90 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75  r more and exclu
15aa0 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  sive.** transact
15ab0 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20  ion is started, 
15ac0 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20  meaning that no 
15ad0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
15ae0 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61   allowed.** to a
15af0 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
15b00 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69  se.  A preexisti
15b10 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ng transaction m
15b20 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67  ay not be.** upg
15b30 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69  raded to exclusi
15b40 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ve by calling th
15b50 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63  is routine a sec
15b60 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a  ond time - the.*
15b70 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c  * exclusivity fl
15b80 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f  ag only works fo
15b90 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  r a new transact
15ba0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69  ion..**.** A wri
15bb0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
15bc0 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62  ust be started b
15bd0 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
15be0 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73   any .** changes
15bf0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
15c00 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66  .  None of the f
15c10 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
15c20 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20  s .** will work 
15c30 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63  unless a transac
15c40 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20  tion is started 
15c50 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  first:.**.**    
15c60 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
15c70 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20  eateTable().**  
15c80 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
15c90 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a  CreateIndex().**
15ca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
15cb0 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a  eeClearTable().*
15cc0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
15cd0 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a  reeDropTable().*
15ce0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
15cf0 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20  reeInsert().**  
15d00 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
15d10 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20  Delete().**     
15d20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
15d30 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20  ateMeta().**.** 
15d40 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74  If an initial at
15d50 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65  tempt to acquire
15d60 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20   the lock fails 
15d70 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20  because of lock 
15d80 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e  contention.** an
15d90 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  d the database w
15da0 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e  as previously un
15db0 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76  locked, then inv
15dc0 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
15dd0 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65  dler.** if there
15de0 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66   is one.  But if
15df0 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69   there was previ
15e00 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63  ously a read-loc
15e10 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76  k, do not.** inv
15e20 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
15e30 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  dler - just retu
15e40 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
15e50 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
15e60 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65  .** returned whe
15e70 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  n there is alrea
15e80 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  dy a read-lock i
15e90 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
15ea0 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a   a deadlock..**.
15eb0 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65  ** Suppose there
15ec0 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73   are two process
15ed0 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68  es A and B.  A h
15ee0 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61  as a read lock a
15ef0 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65  nd B has.** a re
15f00 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20  served lock.  B 
15f10 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65  tries to promote
15f20 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75   to exclusive bu
15f30 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63  t is blocked bec
15f40 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72  ause.** of A's r
15f50 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69  ead lock.  A tri
15f60 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
15f70 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73   reserved but is
15f80 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a   blocked by B..*
15f90 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68  * One or the oth
15fa0 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72  er of the two pr
15fb0 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76  ocesses must giv
15fc0 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63  e way or there c
15fd0 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67  an be.** no prog
15fe0 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e  ress.  By return
15ff0 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ing SQLITE_BUSY 
16000 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67  and not invoking
16010 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
16020 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72  ck.** when A alr
16030 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20  eady has a read 
16040 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61  lock, we encoura
16050 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20  ge A to give up 
16060 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f  and let B.** pro
16070 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ceed..*/.int sql
16080 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
16090 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ans(Btree *p, in
160a0 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c  t wrflag){.  sql
160b0 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30  ite3 *pBlock = 0
160c0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
160d0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
160e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
160f0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
16100 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72  eEnter(p);.  btr
16110 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
16120 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72  .  /* If the btr
16130 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ee is already in
16140 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
16150 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a  tion, or it.  **
16160 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
16170 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
16180 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61  n and a read-tra
16190 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  nsaction.  ** is
161a0 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73   requested, this
161b0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
161c0 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
161d0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
161e0 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  || (p->inTrans==
161f0 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77  TRANS_READ && !w
16200 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f  rflag) ){.    go
16210 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
16220 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
16230 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
16240 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c  ==TRANS_WRITE ||
16250 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74   IfNotOmitAV(pBt
16260 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d  ->bDoTruncate)==
16270 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65  0 );..  /* Write
16280 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72   transactions ar
16290 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f  e not possible o
162a0 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  n a read-only da
162b0 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20  tabase */.  if( 
162c0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
162d0 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21   BTS_READ_ONLY)!
162e0 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  =0 && wrflag ){.
162f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
16300 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f  READONLY;.    go
16310 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
16320 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
16330 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
16340 43 41 43 48 45 0a 20 20 2f 2a 20 49 66 20 61 6e  CACHE.  /* If an
16350 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68  other database h
16360 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64  andle has alread
16370 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65  y opened a write
16380 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
16390 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65  ** on this share
163a0 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d-btree structur
163b0 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77  e and a second w
163c0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
163d0 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74   is.  ** request
163e0 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ed, return SQLIT
163f0 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20  E_LOCKED..  */. 
16400 20 69 66 28 20 28 77 72 66 6c 61 67 20 26 26 20   if( (wrflag && 
16410 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
16420 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  on==TRANS_WRITE)
16430 0a 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73  .   || (pBt->bts
16440 46 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44  Flags & BTS_PEND
16450 49 4e 47 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  ING)!=0.  ){.   
16460 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70   pBlock = pBt->p
16470 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65  Writer->db;.  }e
16480 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31  lse if( wrflag>1
16490 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
164a0 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70  pIter;.    for(p
164b0 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
164c0 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
164d0 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
164e0 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42     if( pIter->pB
164f0 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20  tree!=p ){.     
16500 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65     pBlock = pIte
16510 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20  r->pBtree->db;. 
16520 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
16530 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
16540 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a    if( pBlock ){.
16550 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65      sqlite3Conne
16560 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e  ctionBlocked(p->
16570 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20  db, pBlock);.   
16580 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43   rc = SQLITE_LOC
16590 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
165a0 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
165b0 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  begun;.  }.#endi
165c0 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64  f..  /* Any read
165d0 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72  -only or read-wr
165e0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
165f0 69 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c  implies a read-l
16600 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67  ock on .  ** pag
16610 65 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20  e 1. So if some 
16620 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63  other shared-cac
16630 68 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64  he client alread
16640 79 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f  y has a write-lo
16650 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65  ck .  ** on page
16660 20 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74   1, the transact
16670 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  ion cannot be op
16680 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ened. */.  rc = 
16690 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
166a0 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53  TableLock(p, MAS
166b0 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c  TER_ROOT, READ_L
166c0 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  OCK);.  if( SQLI
166d0 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f  TE_OK!=rc ) goto
166e0 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20   trans_begun;.. 
166f0 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
16700 3d 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59  = ~BTS_INITIALLY
16710 5f 45 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42  _EMPTY;.  if( pB
16720 74 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42  t->nPage==0 ) pB
16730 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
16740 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
16750 54 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f  TY;.  do {.    /
16760 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65  * Call lockBtree
16770 28 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20  () until either 
16780 70 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70  pBt->pPage1 is p
16790 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20  opulated or.    
167a0 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72  ** lockBtree() r
167b0 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67  eturns something
167c0 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
167d0 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65  TE_OK. lockBtree
167e0 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65  ().    ** may re
167f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62  turn SQLITE_OK b
16800 75 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50  ut leave pBt->pP
16810 61 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66  age1 set to 0 if
16820 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65   after.    ** re
16830 61 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20  ading page 1 it 
16840 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74  discovers that t
16850 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20  he page-size of 
16860 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
16870 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74    ** file is not
16880 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20   pBt->pageSize. 
16890 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63  In this case loc
168a0 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70  kBtree() will up
168b0 64 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d  date.    ** pBt-
168c0 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65  >pageSize to the
168d0 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
168e0 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a  e file on disk..
168f0 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65      */.    while
16900 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30  ( pBt->pPage1==0
16910 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28   && SQLITE_OK==(
16920 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70  rc = lockBtree(p
16930 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  Bt)) );..    if(
16940 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
16950 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
16960 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46    if( (pBt->btsF
16970 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f  lags & BTS_READ_
16980 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  ONLY)!=0 ){.    
16990 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
169a0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
169b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
169c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
169d0 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65  Begin(pBt->pPage
169e0 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74  r,wrflag>1,sqlit
169f0 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70  e3TempInMemory(p
16a00 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20  ->db));.        
16a10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16a20 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
16a30 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
16a40 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pBt);.        }.
16a50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16a60 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
16a70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16a80 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
16a90 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a  sed(pBt);.    }.
16aa0 20 20 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78    }while( (rc&0x
16ab0 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  FF)==SQLITE_BUSY
16ac0 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
16ad0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
16ae0 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  NE &&.          
16af0 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
16b00 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a  andler(pBt) );..
16b10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16b20 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
16b30 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
16b40 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70  _NONE ){.      p
16b50 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
16b60 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ++;.#ifndef SQLI
16b70 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
16b80 41 43 48 45 0a 20 20 20 20 20 20 69 66 28 20 70  ACHE.      if( p
16b90 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
16ba0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
16bb0 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20  >lock.pBtree==p 
16bc0 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c  && p->lock.iTabl
16bd0 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  e==1 );.        
16be0 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20  p->lock.eLock = 
16bf0 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  READ_LOCK;.     
16c00 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74     p->lock.pNext
16c10 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20   = pBt->pLock;. 
16c20 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63         pBt->pLoc
16c30 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20  k = &p->lock;.  
16c40 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
16c50 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e   }.    p->inTran
16c60 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e  s = (wrflag?TRAN
16c70 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45  S_WRITE:TRANS_RE
16c80 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  AD);.    if( p->
16c90 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54  inTrans>pBt->inT
16ca0 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
16cb0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
16cc0 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72  action = p->inTr
16cd0 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ans;.    }.    i
16ce0 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  f( wrflag ){.   
16cf0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
16d00 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
16d10 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
16d20 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
16d30 48 45 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  HE.      assert(
16d40 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29   !pBt->pWriter )
16d50 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72  ;.      pBt->pWr
16d60 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20  iter = p;.      
16d70 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
16d80 20 7e 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b   ~BTS_EXCLUSIVE;
16d90 0a 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61  .      if( wrfla
16da0 67 3e 31 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  g>1 ) pBt->btsFl
16db0 61 67 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55  ags |= BTS_EXCLU
16dc0 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  SIVE;.#endif..  
16dd0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62      /* If the db
16de0 2d 73 69 7a 65 20 68 65 61 64 65 72 20 66 69 65  -size header fie
16df0 6c 64 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20  ld is incorrect 
16e00 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 66  (as it may be if
16e10 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a   an old.      **
16e20 20 63 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e   client has been
16e30 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
16e40 61 62 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64  abase file), upd
16e50 61 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e  ate it now. Doin
16e60 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20  g.      ** this 
16e70 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68  sooner rather th
16e80 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74  an later means t
16e90 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
16ea0 20 63 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20   can safely .   
16eb0 20 20 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68     ** re-read th
16ec0 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
16ed0 66 72 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61  from page 1 if a
16ee0 20 73 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72   savepoint or tr
16ef0 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20  ansaction.      
16f00 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75  ** rollback occu
16f10 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 72  rs within the tr
16f20 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
16f30 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
16f40 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79  t->nPage!=get4by
16f50 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
16f60 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20  a[28]) ){.      
16f70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
16f80 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
16f90 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
16fa0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
16fb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16fc0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
16fd0 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70  e1->aData[28], p
16fe0 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
16ff0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
17000 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f    }.  }...trans_
17010 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d  begun:.  if( rc=
17020 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
17030 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54  flag ){.    /* T
17040 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73  his call makes s
17050 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ure that the pag
17060 65 72 20 68 61 73 20 74 68 65 20 63 6f 72 72 65  er has the corre
17070 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  ct number of.   
17080 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69   ** open savepoi
17090 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f  nts. If the seco
170a0 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
170b0 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 61  greater than 0 a
170c0 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75  nd.    ** the su
170d0 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  b-journal is not
170e0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74   already open, t
170f0 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f  hen it will be o
17100 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20  pened here..    
17110 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
17120 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
17130 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
17140 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  r, p->db->nSavep
17150 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  oint);.  }..  bt
17160 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
17170 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
17180 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
17190 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
171a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
171b0 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53  OVACUUM../*.** S
171c0 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  et the pointer-m
171d0 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
171e0 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
171f0 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c  age pPage. Also,
17200 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e   if.** pPage con
17210 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74  tains cells that
17220 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
17230 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68  ow pages, set th
17240 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70  e pointer.** map
17250 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
17260 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
17270 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  as well..*/.stat
17280 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50  ic int setChildP
17290 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a  trmaps(MemPage *
172a0 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
172b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
172d0 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65  Counter variable
172e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
172f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17300 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
17310 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70  er of cells in p
17320 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69  age pPage */.  i
17330 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
17340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17350 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
17360 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
17370 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
17380 3b 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69  ;.  u8 isInitOri
17390 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  g = pPage->isIni
173a0 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  t;.  Pgno pgno =
173b0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20   pPage->pgno;.. 
173c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
173d0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
173e0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
173f0 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e  ;.  rc = btreeIn
17400 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
17410 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17420 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  OK ){.    goto s
17430 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
17440 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c  _out;.  }.  nCel
17450 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
17460 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
17470 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
17480 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
17490 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
174a0 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f  ..    ptrmapPutO
174b0 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
174c0 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20  ell, &rc);..    
174d0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
174e0 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63   ){.      Pgno c
174f0 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
17500 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20  yte(pCell);.    
17510 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
17520 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
17530 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20  AP_BTREE, pgno, 
17540 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
17550 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
17560 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  eaf ){.    Pgno 
17570 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
17580 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
17590 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
175a0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72  set+8]);.    ptr
175b0 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
175c0 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
175d0 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b  REE, pgno, &rc);
175e0 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f  .  }..set_child_
175f0 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70  ptrmaps_out:.  p
17600 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
17610 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74  sInitOrig;.  ret
17620 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17630 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50   Somewhere on pP
17640 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  age is a pointer
17650 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20   to page iFrom. 
17660 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69   Modify this poi
17670 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20  nter so.** that 
17680 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f  it points to iTo
17690 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70  . Parameter eTyp
176a0 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
176b0 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20  type of pointer 
176c0 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65  to.** be modifie
176d0 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a  d, as  follows:.
176e0 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52  **.** PTRMAP_BTR
176f0 45 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73  EE:     pPage is
17700 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
17710 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
17720 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a  s at a child .**
17730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17740 20 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65     page of pPage
17750 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
17760 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20  VERFLOW1: pPage 
17770 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
17780 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
17790 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c  nts at an overfl
177a0 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
177b0 20 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69          page poi
177c0 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f  nted to by one o
177d0 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70  f the cells on p
177e0 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
177f0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50  AP_OVERFLOW2: pP
17800 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
17810 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ow-page. The poi
17820 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74  nter points at t
17830 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20  he next.**      
17840 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65               ove
17850 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
17860 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
17870 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65  c int modifyPage
17880 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20  Pointer(MemPage 
17890 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72  *pPage, Pgno iFr
178a0 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38  om, Pgno iTo, u8
178b0 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72   eType){.  asser
178c0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
178d0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
178e0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
178f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
17900 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
17910 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
17920 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
17930 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29  RMAP_OVERFLOW2 )
17940 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  {.    /* The poi
17950 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74  nter is always t
17960 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
17970 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20   of the page in 
17980 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20  this case.  */. 
17990 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
179a0 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69  pPage->aData)!=i
179b0 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  From ){.      re
179c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
179d0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
179e0 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61      put4byte(pPa
179f0 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b  ge->aData, iTo);
17a00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38  .  }else{.    u8
17a10 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50   isInitOrig = pP
17a20 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20  age->isInit;.   
17a30 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
17a40 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 62 74 72 65  nCell;..    btre
17a50 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
17a60 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50  ;.    nCell = pP
17a70 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20  age->nCell;..   
17a80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
17a90 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75  l; i++){.      u
17aa0 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
17ab0 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  ell(pPage, i);. 
17ac0 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
17ad0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
17ae0 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   ){.        Cell
17af0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
17b00 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
17b10 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
17b20 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  l, &info);.     
17b30 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65     if( info.iOve
17b40 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 20 26  rflow.         &
17b50 26 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76  & pCell+info.iOv
17b60 65 72 66 6c 6f 77 2b 33 3c 3d 70 50 61 67 65 2d  erflow+3<=pPage-
17b70 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61  >aData+pPage->ma
17b80 73 6b 50 61 67 65 0a 20 20 20 20 20 20 20 20 20  skPage.         
17b90 26 26 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79  && iFrom==get4by
17ba0 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
17bb0 4f 76 65 72 66 6c 6f 77 5d 29 0a 20 20 20 20 20  Overflow]).     
17bc0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
17bd0 70 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  put4byte(&pCell[
17be0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c  info.iOverflow],
17bf0 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   iTo);.         
17c00 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
17c10 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
17c20 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62         if( get4b
17c30 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f  yte(pCell)==iFro
17c40 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  m ){.          p
17c50 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69  ut4byte(pCell, i
17c60 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  To);.          b
17c70 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
17c80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17c90 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c  .    if( i==nCel
17ca0 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  l ){.      if( e
17cb0 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52  Type!=PTRMAP_BTR
17cc0 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  EE || .         
17cd0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
17ce0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
17cf0 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46  drOffset+8])!=iF
17d00 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  rom ){.        r
17d10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
17d20 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
17d30 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74   }.      put4byt
17d40 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
17d50 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
17d60 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d  +8], iTo);.    }
17d70 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ..    pPage->isI
17d80 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
17d90 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
17da0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
17db0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65  .** Move the ope
17dc0 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
17dd0 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74  pDbPage to locat
17de0 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e  ion iFreePage in
17df0 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
17e00 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72  e. The pDbPage r
17e10 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73  eference remains
17e20 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   valid..**.** Th
17e30 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20  e isCommit flag 
17e40 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
17e50 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
17e60 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74  to remember that
17e70 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
17e80 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
17e90 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61  ()ed before data
17ea0 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
17eb0 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20  e->pgno .** can 
17ec0 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54  be written to. T
17ed0 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
17ee0 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e  ready promised n
17ef0 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ot to write to t
17f00 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a  hat.** page..*/.
17f10 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63  static int reloc
17f20 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  atePage(.  BtSha
17f30 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
17f40 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a      /* Btree */.
17f50 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61    MemPage *pDbPa
17f60 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  ge,        /* Op
17f70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  en page to move 
17f80 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20  */.  u8 eType,  
17f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17fa0 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79   Pointer map 'ty
17fb0 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  pe' entry for pD
17fc0 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
17fd0 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20  iPtrPage,       
17fe0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
17ff0 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74  ap 'page-no' ent
18000 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
18010 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61  /.  Pgno iFreePa
18020 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge,          /* 
18030 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  The location to 
18040 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20  move pDbPage to 
18050 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69  */.  int isCommi
18060 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t             /*
18070 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70   isCommit flag p
18080 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
18090 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f  PagerMovepage */
180a0 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
180b0 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68  PtrPage;   /* Th
180c0 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
180d0 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
180e0 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  o pDbPage */.  P
180f0 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44  gno iDbPage = pD
18100 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50  bPage->pgno;.  P
18110 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
18120 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Bt->pPager;.  in
18130 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
18140 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
18150 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70  VERFLOW2 || eTyp
18160 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
18170 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54  OW1 || .      eT
18180 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
18190 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
181a0 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20  AP_ROOTPAGE );. 
181b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
181c0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
181d0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
181e0 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42  ert( pDbPage->pB
181f0 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20  t==pBt );..  /* 
18200 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67  Move page iDbPag
18210 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65  e from its curre
18220 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70  nt location to p
18230 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65  age number iFree
18240 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28  Page */.  TRACE(
18250 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f  ("AUTOVACUUM: Mo
18260 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20  ving %d to free 
18270 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67  page %d (ptr pag
18280 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22  e %d type %d)\n"
18290 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65  , .      iDbPage
182a0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74  , iFreePage, iPt
182b0 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a  rPage, eType));.
182c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
182d0 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67  gerMovepage(pPag
182e0 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62  er, pDbPage->pDb
182f0 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
18300 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66   isCommit);.  if
18310 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18320 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
18330 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d  ;.  }.  pDbPage-
18340 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67  >pgno = iFreePag
18350 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50  e;..  /* If pDbP
18360 61 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d  age was a btree-
18370 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61  page, then it ma
18380 79 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67  y have child pag
18390 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a  es and/or cells.
183a0 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20    ** that point 
183b0 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
183c0 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  s. The pointer m
183d0 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
183e0 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61  ll these.  ** pa
183f0 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63  ges need to be c
18400 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  hanged..  **.  *
18410 2a 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20  * If pDbPage is 
18420 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
18430 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
18440 20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f   4 bytes may sto
18450 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65  re a.  ** pointe
18460 72 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e  r to a subsequen
18470 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
18480 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
18490 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  case, then.  ** 
184a0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
184b0 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61  needs to be upda
184c0 74 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73  ted for the subs
184d0 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
184e0 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
184f0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
18500 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
18510 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
18520 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68  {.    rc = setCh
18530 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61  ildPtrmaps(pDbPa
18540 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
18550 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18560 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
18570 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
18580 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20    Pgno nextOvfl 
18590 3d 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61  = get4byte(pDbPa
185a0 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
185b0 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20  if( nextOvfl!=0 
185c0 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
185d0 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c  ut(pBt, nextOvfl
185e0 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
185f0 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26  W2, iFreePage, &
18600 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rc);.      if( r
18610 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18620 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
18630 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
18640 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74  .  }..  /* Fix t
18650 68 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e  he database poin
18660 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72  ter on page iPtr
18670 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65  Page that pointe
18680 64 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a  d at iDbPage so.
18690 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69    ** that it poi
186a0 6e 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65  nts at iFreePage
186b0 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70  . Also fix the p
186c0 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
186d0 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61   for.  ** iPtrPa
186e0 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
186f0 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type!=PTRMAP_ROO
18700 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
18710 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
18720 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70  Bt, iPtrPage, &p
18730 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  PtrPage, 0);.   
18740 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18750 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
18760 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
18770 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
18780 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65  erWrite(pPtrPage
18790 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
187a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
187b0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
187c0 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
187d0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
187e0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
187f0 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  = modifyPagePoin
18800 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44  ter(pPtrPage, iD
18810 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
18820 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65  , eType);.    re
18830 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
18840 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
18850 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18860 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
18870 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  t, iFreePage, eT
18880 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26  ype, iPtrPage, &
18890 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rc);.    }.  }. 
188a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
188b0 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
188c0 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62  ation required b
188d0 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  y incrVacuumStep
188e0 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  (). */.static in
188f0 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  t allocateBtreeP
18900 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20  age(BtShared *, 
18910 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f  MemPage **, Pgno
18920 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a   *, Pgno, u8);..
18930 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20  /*.** Perform a 
18940 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61  single step of a
18950 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61  n incremental-va
18960 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73  cuum. If success
18970 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53  ful, return.** S
18980 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65  QLITE_OK. If the
18990 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f  re is no work to
189a0 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f   do (and therefo
189b0 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a  re no point in .
189c0 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  ** calling this 
189d0 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c  function again),
189e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
189f0 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65  ONE. Or, if an e
18a00 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c  rror .** occurs,
18a10 20 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68   return some oth
18a20 65 72 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  er error code..*
18a30 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66  *.** More specif
18a40 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  icly, this funct
18a50 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
18a60 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20  re-organize the 
18a70 64 61 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20  database so .** 
18a80 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61  that the last pa
18a90 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  ge of the file c
18aa0 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20  urrently in use 
18ab0 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20  is no longer in 
18ac0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  use..**.** Param
18ad0 65 74 65 72 20 6e 46 69 6e 20 69 73 20 74 68 65  eter nFin is the
18ae0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
18af0 20 74 68 61 74 20 74 68 69 73 20 64 61 74 61 62   that this datab
18b00 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69  ase would contai
18b10 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69 73 20 66  n.** were this f
18b20 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75  unction called u
18b30 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20  ntil it returns 
18b40 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a  SQLITE_DONE..**.
18b50 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d 69  ** If the bCommi
18b60 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  t parameter is n
18b70 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75  on-zero, this fu
18b80 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
18b90 68 61 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c  hat the .** call
18ba0 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c  er will keep cal
18bb0 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53  ling incrVacuumS
18bc0 74 65 70 28 29 20 75 6e 74 69 6c 20 69 74 20 72  tep() until it r
18bd0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
18be0 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72  NE .** or an err
18bf0 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20 70  or. bCommit is p
18c00 61 73 73 65 64 20 74 72 75 65 20 66 6f 72 20 61  assed true for a
18c10 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e  n auto-vacuum-on
18c20 2d 63 6f 6d 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65  -commmit .** ope
18c30 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65  ration, or false
18c40 20 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e   for an incremen
18c50 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73  tal vacuum..*/.s
18c60 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61  tatic int incrVa
18c70 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65  cuumStep(BtShare
18c80 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69  d *pBt, Pgno nFi
18c90 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c  n, Pgno iLastPg,
18ca0 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20   int bCommit){. 
18cb0 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b   Pgno nFreeList;
18cc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
18cd0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74  mber of pages st
18ce0 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ill on the free-
18cf0 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  list */.  int rc
18d00 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
18d10 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
18d20 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
18d30 20 61 73 73 65 72 74 28 20 69 4c 61 73 74 50 67   assert( iLastPg
18d40 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20  >nFin );..  if( 
18d50 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  !PTRMAP_ISPAGE(p
18d60 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20  Bt, iLastPg) && 
18d70 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47  iLastPg!=PENDING
18d80 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
18d90 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b  ){.    u8 eType;
18da0 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61  .    Pgno iPtrPa
18db0 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69  ge;..    nFreeLi
18dc0 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  st = get4byte(&p
18dd0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
18de0 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20  a[36]);.    if( 
18df0 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a  nFreeList==0 ){.
18e00 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
18e10 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
18e20 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
18e30 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67  Get(pBt, iLastPg
18e40 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50  , &eType, &iPtrP
18e50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
18e60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18e70 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
18e80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54      }.    if( eT
18e90 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
18ea0 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65  PAGE ){.      re
18eb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
18ec0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
18ed0 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
18ee0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
18ef0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f  ){.      if( bCo
18f00 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  mmit==0 ){.     
18f10 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
18f20 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
18f30 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20  iles free-list. 
18f40 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  This is not requ
18f50 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ired.        ** 
18f60 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f  if bCommit is no
18f70 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20  n-zero. In that 
18f80 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c  case, the free-l
18f90 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ist will be.    
18fa0 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64      ** truncated
18fb0 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74   to zero after t
18fc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
18fd0 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73  urns, so it does
18fe0 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  n't .        ** 
18ff0 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69  matter if it sti
19000 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  ll contains some
19010 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73   garbage entries
19020 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
19030 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
19040 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61  g;.        MemPa
19050 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
19060 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
19070 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
19080 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
19090 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 42 54  ePg, iLastPg, BT
190a0 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20  ALLOC_EXACT);.  
190b0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
190c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
190d0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
190e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
190f0 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
19100 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  g==iLastPg );.  
19110 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
19120 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
19130 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b    }.    } else {
19140 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65  .      Pgno iFre
19150 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  ePg;            
19160 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65   /* Index of fre
19170 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70  e page to move p
19180 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20  LastPg to */.   
19190 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73     MemPage *pLas
191a0 74 50 67 3b 0a 20 20 20 20 20 20 75 38 20 65 4d  tPg;.      u8 eM
191b0 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e  ode = BTALLOC_AN
191c0 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72  Y;   /* Mode par
191d0 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63  ameter for alloc
191e0 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a  ateBtreePage() *
191f0 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65  /.      Pgno iNe
19200 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ar = 0;         
19210 20 20 2f 2a 20 6e 65 61 72 62 79 20 70 61 72 61    /* nearby para
19220 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61  meter for alloca
19230 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f  teBtreePage() */
19240 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  ..      rc = btr
19250 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
19260 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67  LastPg, &pLastPg
19270 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
19280 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19290 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
192a0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
192b0 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74     /* If bCommit
192c0 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c   is zero, this l
192d0 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79  oop runs exactly
192e0 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70   once and page p
192f0 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20  LastPg.      ** 
19300 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20  is swapped with 
19310 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70  the first free p
19320 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74  age pulled off t
19330 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20  he free list..  
19340 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
19350 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
19360 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73  d, if bCommit is
19370 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
19380 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20  ro, then keep.  
19390 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75      ** looping u
193a0 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65  ntil a free-page
193b0 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20   located within 
193c0 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70  the first nFin p
193d0 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ages.      ** of
193e0 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75   the file is fou
193f0 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nd..      */.   
19400 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d     if( bCommit==
19410 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f  0 ){.        eMo
19420 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b  de = BTALLOC_LE;
19430 0a 20 20 20 20 20 20 20 20 69 4e 65 61 72 20 3d  .        iNear =
19440 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20   nFin;.      }. 
19450 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20       do {.      
19460 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
19470 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Pg;.        rc =
19480 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
19490 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67  ge(pBt, &pFreePg
194a0 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4e 65 61  , &iFreePg, iNea
194b0 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20  r, eMode);.     
194c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
194d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
194e0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
194f0 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20  astPg);.        
19500 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
19510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
19520 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
19530 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  Pg);.      }whil
19540 65 28 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 46  e( bCommit && iF
19550 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20  reePg>nFin );.  
19560 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
19570 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20  ePg<iLastPg );. 
19580 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d       .      rc =
19590 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42   relocatePage(pB
195a0 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70  t, pLastPg, eTyp
195b0 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72  e, iPtrPage, iFr
195c0 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a  eePg, bCommit);.
195d0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
195e0 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
195f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19600 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
19610 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
19620 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
19630 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  f( bCommit==0 ){
19640 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
19650 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d  iLastPg--;.    }
19660 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d  while( iLastPg==
19670 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
19680 45 28 70 42 74 29 20 7c 7c 20 50 54 52 4d 41 50  E(pBt) || PTRMAP
19690 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
196a0 73 74 50 67 29 20 29 3b 0a 20 20 20 20 70 42 74  stPg) );.    pBt
196b0 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20  ->bDoTruncate = 
196c0 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  1;.    pBt->nPag
196d0 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d  e = iLastPg;.  }
196e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
196f0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
19700 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  e database opene
19710 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20 61  d by the first a
19720 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 75  rgument is an au
19730 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
19740 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65  se.** nOrig page
19750 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69  s in size contai
19760 6e 69 6e 67 20 6e 46 72 65 65 20 66 72 65 65 20  ning nFree free 
19770 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 74 68  pages. Return th
19780 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 73  e expected .** s
19790 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
197a0 61 73 65 20 69 6e 20 70 61 67 65 73 20 66 6f 6c  ase in pages fol
197b0 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76  lowing an auto-v
197c0 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e  acuum operation.
197d0 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
197e0 66 69 6e 61 6c 44 62 53 69 7a 65 28 42 74 53 68  finalDbSize(BtSh
197f0 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
19800 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65  nOrig, Pgno nFre
19810 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79  e){.  int nEntry
19820 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19830 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
19840 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e  of entries on on
19850 65 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f  e ptrmap page */
19860 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b  .  Pgno nPtrmap;
19870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19880 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
19890 50 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20  PtrMap pages to 
198a0 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 50 67  be freed */.  Pg
198b0 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20  no nFin;        
198c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
198d0 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
198e0 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74  ..  nEntry = pBt
198f0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a  ->usableSize/5;.
19900 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72    nPtrmap = (nFr
19910 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f  ee-nOrig+PTRMAP_
19920 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69  PAGENO(pBt, nOri
19930 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72  g)+nEntry)/nEntr
19940 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69  y;.  nFin = nOri
19950 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72  g - nFree - nPtr
19960 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67  map;.  if( nOrig
19970 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  >PENDING_BYTE_PA
19980 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c  GE(pBt) && nFin<
19990 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
199a0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46  E(pBt) ){.    nF
199b0 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  in--;.  }.  whil
199c0 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
199d0 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e  (pBt, nFin) || n
199e0 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  Fin==PENDING_BYT
199f0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
19a00 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a     nFin--;.  }..
19a10 20 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d    return nFin;.}
19a20 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ../*.** A write-
19a30 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
19a40 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72   be opened befor
19a50 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  e calling this f
19a60 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70  unction..** It p
19a70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65  erforms a single
19a80 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f   unit of work to
19a90 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65  wards an increme
19aa0 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a  ntal vacuum..**.
19ab0 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d  ** If the increm
19ac0 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20  ental vacuum is 
19ad0 66 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74  finished after t
19ae0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  his function has
19af0 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f   run,.** SQLITE_
19b00 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
19b10 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66  . If it is not f
19b20 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20  inished, but no 
19b30 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a  error occurred,.
19b40 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
19b50 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
19b60 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72  ise an SQLite er
19b70 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e  ror code. .*/.in
19b80 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  t sqlite3BtreeIn
19b90 63 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  crVacuum(Btree *
19ba0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
19bb0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
19bc0 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74  p->pBt;..  sqlit
19bd0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
19be0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
19bf0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
19c00 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d  RANS_WRITE && p-
19c10 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
19c20 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21  WRITE );.  if( !
19c30 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
19c40 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
19c50 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  TE_DONE;.  }else
19c60 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67  {.    Pgno nOrig
19c70 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
19c80 74 28 70 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f  t(pBt);.    Pgno
19c90 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
19ca0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
19cb0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
19cc0 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61  Pgno nFin = fina
19cd0 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72  lDbSize(pBt, nOr
19ce0 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20  ig, nFree);..   
19cf0 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20   if( nOrig<nFin 
19d00 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
19d10 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
19d20 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
19d30 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20   nFree>0 ){.    
19d40 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75    rc = saveAllCu
19d50 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29  rsors(pBt, 0, 0)
19d60 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
19d70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19d80 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41       invalidateA
19d90 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
19da0 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63  pBt);.        rc
19db0 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
19dc0 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72  p(pBt, nFin, nOr
19dd0 69 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ig, 0);.      }.
19de0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
19df0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19e00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
19e10 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
19e20 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
19e30 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
19e40 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
19e50 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e  aData[28], pBt->
19e60 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  nPage);.      }.
19e70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19e80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
19e90 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  E;.    }.  }.  s
19ea0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
19eb0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
19ec0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
19ed0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
19ee0 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74  d prior to sqlit
19ef0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68  e3PagerCommit wh
19f00 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
19f10 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  .** is committed
19f20 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63   for an auto-vac
19f30 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  uum database..**
19f40 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b  .** If SQLITE_OK
19f50 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
19f60 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73  en *pnTrunc is s
19f70 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
19f80 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65   of pages.** the
19f90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
19fa0 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74  hould be truncat
19fb0 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65  ed to during the
19fc0 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
19fd0 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61   .** i.e. the da
19fe0 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
19ff0 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74  reorganized so t
1a000 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72  hat only the fir
1a010 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70  st *pnTrunc.** p
1a020 61 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e  ages are in use.
1a030 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1a040 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
1a050 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
1a060 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1a070 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
1a080 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
1a090 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ger;.  VVA_ONLY(
1a0a0 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69   int nRef = sqli
1a0b0 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
1a0c0 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 61  (pPager) );..  a
1a0d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1a0e0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1a0f0 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c  utex) );.  inval
1a100 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
1a110 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73  Cache(pBt);.  as
1a120 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61  sert(pBt->autoVa
1a130 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42  cuum);.  if( !pB
1a140 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b  t->incrVacuum ){
1a150 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20  .    Pgno nFin; 
1a160 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1a170 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
1a180 74 61 62 61 73 65 20 61 66 74 65 72 20 61 75 74  tabase after aut
1a190 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20  ovacuuming */.  
1a1a0 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20    Pgno nFree;   
1a1b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1a1c0 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
1a1d0 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c  reelist initiall
1a1e0 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46  y */.    Pgno iF
1a1f0 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ree;        /* T
1a200 68 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20  he next page to 
1a210 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20  be freed */.    
1a220 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
1a230 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
1a240 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65 69  ize before freei
1a250 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67  ng */..    nOrig
1a260 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
1a270 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  t(pBt);.    if( 
1a280 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1a290 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72  t, nOrig) || nOr
1a2a0 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ig==PENDING_BYTE
1a2b0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1a2c0 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74      /* It is not
1a2d0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65   possible to cre
1a2e0 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66  ate a database f
1a2f0 6f 72 20 77 68 69 63 68 20 74 68 65 20 66 69 6e  or which the fin
1a300 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  al page.      **
1a310 20 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69   is either a poi
1a320 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72  nter-map page or
1a330 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74   the pending-byt
1a340 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20  e page. If one. 
1a350 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75       ** is encou
1a360 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64  ntered, this ind
1a370 69 63 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f  icates corruptio
1a380 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
1a390 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a3a0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1a3b0 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d    }..    nFree =
1a3c0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
1a3d0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1a3e0 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66  ]);.    nFin = f
1a3f0 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20  inalDbSize(pBt, 
1a400 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20  nOrig, nFree);. 
1a410 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69     if( nFin>nOri
1a420 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  g ) return SQLIT
1a430 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1a440 20 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72      if( nFin<nOr
1a450 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ig ){.      rc =
1a460 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
1a470 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pBt, 0, 0);.    
1a480 7d 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d  }.    for(iFree=
1a490 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69  nOrig; iFree>nFi
1a4a0 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
1a4b0 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20  OK; iFree--){.  
1a4c0 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
1a4d0 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69  uumStep(pBt, nFi
1a4e0 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a 20 20  n, iFree, 1);.  
1a4f0 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d    }.    if( (rc=
1a500 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20  =SQLITE_DONE || 
1a510 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26  rc==SQLITE_OK) &
1a520 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20  & nFree>0 ){.   
1a530 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1a540 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
1a550 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
1a560 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1a570 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1a580 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20  ata[32], 0);.   
1a590 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
1a5a0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1a5b0 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  36], 0);.      p
1a5c0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
1a5d0 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
1a5e0 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42   nFin);.      pB
1a5f0 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d  t->bDoTruncate =
1a600 20 31 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   1;.      pBt->n
1a610 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20  Page = nFin;.   
1a620 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
1a630 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a640 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
1a650 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
1a660 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
1a670 65 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74  ert( nRef>=sqlit
1a680 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
1a690 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
1a6a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65  urn rc;.}..#else
1a6b0 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54   /* ifndef SQLIT
1a6c0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1a6d0 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65  M */.# define se
1a6e0 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29  tChildPtrmaps(x)
1a6f0 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69   SQLITE_OK.#endi
1a700 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
1a710 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
1a720 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61 20  irst phase of a 
1a730 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  two-phase commit
1a740 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
1a750 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c  ** causes a roll
1a760 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  back journal to 
1a770 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20 69  be created (if i
1a780 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  t does not alrea
1a790 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64  dy exist).** and
1a7a0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
1a7b0 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69  enough informati
1a7c0 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61 20  on so that if a 
1a7d0 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72  power loss occur
1a7e0 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
1a7f0 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  e can be restore
1a800 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
1a810 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79 69  l state by playi
1a820 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a  ng back.** the j
1a830 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68  ournal.  Then th
1a840 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1a850 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c  e journal are fl
1a860 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20  ushed out to.** 
1a870 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72  the disk.  After
1a880 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1a890 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c  safely on oxide,
1a8a0 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20   the changes to 
1a8b0 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
1a8c0 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  are written into
1a8d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1a8e0 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74  le and flushed t
1a8f0 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74  o oxide..** At t
1a900 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63  he end of this c
1a910 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63  all, the rollbac
1a920 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20  k journal still 
1a930 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a  exists on the.**
1a940 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65   disk and we are
1a950 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
1a960 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65  ll locks, so the
1a970 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
1a980 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65   not.** committe
1a990 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 42  d.  See sqlite3B
1a9a0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
1a9b0 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65 63  wo() for the sec
1a9c0 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68 65  ond phase of the
1a9d0 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  .** commit proce
1a9e0 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ss..**.** This c
1a9f0 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  all is a no-op i
1aa00 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  f no write-trans
1aa10 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e  action is curren
1aa20 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42  tly active on pB
1aa30 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  t..**.** Otherwi
1aa40 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74  se, sync the dat
1aa50 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
1aa60 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d  he btree pBt. zM
1aa70 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a  aster points to.
1aa80 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ** the name of a
1aa90 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1aaa0 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
1aab0 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
1aac0 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
1aad0 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  al journal file,
1aae0 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64   or is NULL, ind
1aaf0 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65  icating no maste
1ab00 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a  r journal file .
1ab10 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62  ** (single datab
1ab20 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
1ab30 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
1ab40 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  s is called, the
1ab50 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1ab60 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68  should already h
1ab70 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61  ave been.** crea
1ab80 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77  ted, populated w
1ab90 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ith this journal
1aba0 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e   pointer and syn
1abb0 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
1abc0 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20  ** Once this is 
1abd0 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74 75  routine has retu
1abe0 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74  rned, the only t
1abf0 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f  hing required to
1ac00 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77   commit.** the w
1ac10 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1ac20 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
1ac30 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65  se file is to de
1ac40 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
1ac50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ac60 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1ac70 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f  One(Btree *p, co
1ac80 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
1ac90 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
1aca0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
1acb0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1acc0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42  S_WRITE ){.    B
1acd0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1ace0 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74  ->pBt;.    sqlit
1acf0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1ad00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ad10 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1ad20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
1ad30 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
1ad40 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d   rc = autoVacuum
1ad50 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20  Commit(pBt);.   
1ad60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ad70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1ad80 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1ad90 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  e(p);.        re
1ada0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1adb0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1adc0 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
1add0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1ade0 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
1adf0 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ge(pBt->pPager, 
1ae00 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
1ae10 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63   }.#endif.    rc
1ae20 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
1ae30 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
1ae40 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  t->pPager, zMast
1ae50 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  er, 0);.    sqli
1ae60 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1ae70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1ae80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1ae90 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1aea0 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74  led from both Bt
1aeb0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
1aec0 6f 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c  o() and BtreeRol
1aed0 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68  lback().** at th
1aee0 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
1aef0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  a transaction..*
1af00 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
1af10 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
1af20 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  n(Btree *p){.  B
1af30 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1af40 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
1af50 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
1af60 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
1af70 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
1af80 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) );..#ifndef SQ
1af90 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1afa0 43 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54  CUUM.  pBt->bDoT
1afb0 72 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e  runcate = 0;.#en
1afc0 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  dif.  if( p->inT
1afd0 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  rans>TRANS_NONE 
1afe0 26 26 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64  && db->nVdbeRead
1aff0 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  >1 ){.    /* If 
1b000 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20  there are other 
1b010 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
1b020 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f  s that belong to
1b030 20 74 68 69 73 20 64 61 74 61 62 61 73 65 0a 20   this database. 
1b040 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f     ** handle, do
1b050 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72 65 61  wngrade to a rea
1b060 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69  d-only transacti
1b070 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74  on. The other st
1b080 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20  atements.    ** 
1b090 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61  may still be rea
1b0a0 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61  ding from the da
1b0b0 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  tabase.  */.    
1b0c0 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72  downgradeAllShar
1b0d0 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1b0e0 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54  s(p);.    p->inT
1b0f0 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41  rans = TRANS_REA
1b100 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
1b110 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
1b120 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66   had any kind of
1b130 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
1b140 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65  n, decrement the
1b150 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63   .    ** transac
1b160 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68  tion count of th
1b170 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20  e shared btree. 
1b180 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
1b190 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a  on count .    **
1b1a0 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 20   reaches 0, set 
1b1b0 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
1b1c0 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20   to TRANS_NONE. 
1b1d0 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  The unlockBtreeI
1b1e0 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a  fUnused().    **
1b1f0 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c   call below will
1b200 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
1b210 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  r.  */.    if( p
1b220 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
1b230 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63  _NONE ){.      c
1b240 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
1b250 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
1b260 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
1b270 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
1b280 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54    if( 0==pBt->nT
1b290 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
1b2a0 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
1b2b0 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
1b2c0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _NONE;.      }. 
1b2d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
1b2e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
1b2f0 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74  nsaction state t
1b300 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64  o TRANS_NONE and
1b310 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20   unlock the .   
1b320 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68 69   ** pager if thi
1b330 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68  s call closed th
1b340 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77  e only read or w
1b350 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1b360 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54  .  */.    p->inT
1b370 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
1b380 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  E;.    unlockBtr
1b390 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
1b3a0 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74  .  }..  btreeInt
1b3b0 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a  egrity(p);.}../*
1b3c0 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74  .** Commit the t
1b3d0 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
1b3e0 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
1b3f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1b400 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
1b410 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
1b420 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f   of a 2-phase co
1b430 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71  mmit.  The.** sq
1b440 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1b450 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69  PhaseOne() routi
1b460 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
1b470 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75  t phase and shou
1b480 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64  ld.** be invoked
1b490 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
1b4a0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
1b4b0 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   The sqlite3Btre
1b4c0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
1b4d0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64  ).** routine did
1b4e0 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66   all the work of
1b4f0 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61   writing informa
1b500 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tion out to disk
1b510 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68   and flushing th
1b520 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f  e.** contents so
1b530 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77   that they are w
1b540 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20  ritten onto the 
1b550 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41  disk platter.  A
1b560 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
1b570 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20  ne has to do is 
1b580 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61  delete or trunca
1b590 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68  te or zero the h
1b5a0 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20  eader in the.** 
1b5b0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1b5c0 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75 73  rnal (which caus
1b5d0 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  es the transacti
1b5e0 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e  on to commit) an
1b5f0 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e  d.** drop locks.
1b600 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
1b610 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
1b620 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 70 61  urs while the pa
1b630 67 65 72 20 6c 61 79 65 72 20 69 73 20 61 74 74  ger layer is att
1b640 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66  empting to .** f
1b650 69 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65  inalize the unde
1b660 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  rlying journal f
1b670 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ile, this functi
1b680 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  on returns an er
1b690 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75  ror and.** the u
1b6a0 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20  pper layer will 
1b6b0 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61  attempt a rollba
1b6c0 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ck. However, if 
1b6d0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1b6e0 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  ent.** is non-ze
1b6f0 72 6f 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74  ro then this b-t
1b700 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ree transaction 
1b710 69 73 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c  is part of a mul
1b720 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e  ti-file .** tran
1b730 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73  saction. In this
1b740 20 63 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73   case, the trans
1b750 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
1b760 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65  dy been committe
1b770 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69  d .** (by deleti
1b780 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ng a master jour
1b790 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68  nal file) and th
1b7a0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67  e caller will ig
1b7b0 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75  nore this .** fu
1b7c0 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63  nctions return c
1b7d0 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66  ode. So, even if
1b7e0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1b7f0 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61   in the pager la
1b800 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68  yer,.** reset th
1b810 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73  e b-tree objects
1b820 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
1b830 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
1b840 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72   the write.** tr
1b850 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
1b860 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20  en closed. This 
1b870 69 73 20 71 75 69 74 65 20 73 61 66 65 2c 20 61  is quite safe, a
1b880 73 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c  s the pager will
1b890 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74   have.** transit
1b8a0 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72  ioned to the err
1b8b0 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  or state..**.** 
1b8c0 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
1b8d0 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
1b8e0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1b8f0 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
1b900 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
1b910 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
1b920 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
1b930 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
1b940 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
1b950 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72  mmitPhaseTwo(Btr
1b960 65 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61  ee *p, int bClea
1b970 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e  nup){..  if( p->
1b980 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
1b990 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ONE ) return SQL
1b9a0 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65  ITE_OK;.  sqlite
1b9b0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1b9c0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
1b9d0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
1b9e0 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77  e handle has a w
1b9f0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1ba00 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68   open, commit th
1ba10 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20  e shared-btrees 
1ba20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
1ba30 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68  n and set the sh
1ba40 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
1ba50 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20  ANS_READ..  */. 
1ba60 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1ba70 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
1ba80 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
1ba90 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1baa0 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  p->pBt;.    asse
1bab0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
1bac0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1bad0 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ITE );.    asser
1bae0 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  t( pBt->nTransac
1baf0 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63  tion>0 );.    rc
1bb00 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
1bb10 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
1bb20 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
1bb30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1bb40 4b 20 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30  K && bCleanup==0
1bb50 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1bb60 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1bb70 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1bb80 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
1bb90 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
1bba0 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20  TRANS_READ;.    
1bbb0 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
1bbc0 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  tent(pBt);.  }..
1bbd0 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
1bbe0 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
1bbf0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1bc00 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1bc10 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
1bc20 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66  o both phases of
1bc30 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e   a commit..*/.in
1bc40 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
1bc50 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a  mmit(Btree *p){.
1bc60 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
1bc70 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1bc80 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1bc90 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1bca0 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28  One(p, 0);.  if(
1bcb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1bcc0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1bcd0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1bce0 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d  seTwo(p, 0);.  }
1bcf0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1bd00 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1bd10 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1bd20 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
1bd30 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43 55   the state to CU
1bd40 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74  RSOR_FAULT and t
1bd50 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  he error.** code
1bd60 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20   to errCode for 
1bd70 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20  every cursor on 
1bd80 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70 42  BtShared that pB
1bd90 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  tree.** referenc
1bda0 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20  es..**.** Every 
1bdb0 63 75 72 73 6f 72 20 69 73 20 74 72 69 70 70 65  cursor is trippe
1bdc0 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72  d, including cur
1bdd0 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f 6e 67  sors that belong
1bde0 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64 61 74  .** to other dat
1bdf0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1be00 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f  s that happen to
1be10 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74   be sharing.** t
1be20 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42  he cache with pB
1be30 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tree..**.** This
1be40 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61   routine gets ca
1be50 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c  lled when a roll
1be60 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20  back occurs..** 
1be70 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73 69 6e  All cursors usin
1be80 67 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65  g the same cache
1be90 20 6d 75 73 74 20 62 65 20 74 72 69 70 70 65 64   must be tripped
1bea0 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74  .** to prevent t
1beb0 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67 20  hem from trying 
1bec0 74 6f 20 75 73 65 20 74 68 65 20 62 74 72 65 65  to use the btree
1bed0 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f   after.** the ro
1bee0 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c  llback.  The rol
1bef0 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64  lback may have d
1bf00 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a  eleted tables.**
1bf10 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70   or moved root p
1bf20 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73 20 6e  ages, so it is n
1bf30 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f  ot sufficient to
1bf40 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73 74 61  .** save the sta
1bf50 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  te of the cursor
1bf60 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  .  The cursor mu
1bf70 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  st be.** invalid
1bf80 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
1bf90 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
1bfa0 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a  lCursors(Btree *
1bfb0 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43  pBtree, int errC
1bfc0 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  ode){.  BtCursor
1bfd0 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74 72 65   *p;.  if( pBtre
1bfe0 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
1bff0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1c000 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f  er(pBtree);.  fo
1c010 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d  r(p=pBtree->pBt-
1c020 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
1c030 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
1c040 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t i;.    sqlite3
1c050 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
1c060 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61  (p);.    p->eSta
1c070 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c  te = CURSOR_FAUL
1c080 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65  T;.    p->skipNe
1c090 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20  xt = errCode;.  
1c0a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d    for(i=0; i<=p-
1c0b0 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
1c0c0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1c0d0 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  p->apPage[i]);. 
1c0e0 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69       p->apPage[i
1c0f0 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = 0;.    }.  }
1c100 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1c110 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a  eave(pBtree);.}.
1c120 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
1c130 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1c140 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c  in progress.  Al
1c150 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  l cursors will b
1c160 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62  e.** invalided b
1c170 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
1c180 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
1c190 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a  o use a cursor.*
1c1a0 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20  * that was open 
1c1b0 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
1c1c0 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   of this operati
1c1d0 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a  on will result.*
1c1e0 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  * in an error..*
1c1f0 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
1c200 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
1c210 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1c220 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
1c230 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
1c240 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
1c250 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
1c260 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
1c270 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1c280 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
1c290 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70 43 6f  e *p, int tripCo
1c2a0 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  de){.  int rc;. 
1c2b0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1c2c0 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
1c2d0 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73  ge *pPage1;..  s
1c2e0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1c2f0 28 70 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43  (p);.  if( tripC
1c300 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
1c310 7b 0a 20 20 20 20 72 63 20 3d 20 74 72 69 70 43  {.    rc = tripC
1c320 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72  ode = saveAllCur
1c330 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
1c340 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1c350 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1c360 7d 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65  }.  if( tripCode
1c370 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
1c380 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
1c390 72 73 28 70 2c 20 74 72 69 70 43 6f 64 65 29 3b  rs(p, tripCode);
1c3a0 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65  .  }.  btreeInte
1c3b0 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28  grity(p);..  if(
1c3c0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1c3d0 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
1c3e0 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73  int rc2;..    as
1c3f0 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54  sert( TRANS_WRIT
1c400 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  E==pBt->inTransa
1c410 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32  ction );.    rc2
1c420 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
1c430 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61  ollback(pBt->pPa
1c440 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
1c450 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2!=SQLITE_OK ){.
1c460 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
1c470 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
1c480 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
1c490 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68  ave destroyed th
1c4a0 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
1c4b0 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a  value.  So.    *
1c4c0 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50  * call btreeGetP
1c4d0 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20  age() on page 1 
1c4e0 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20  again to make.  
1c4f0 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31    ** sure pPage1
1c500 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63  ->aData is set c
1c510 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20  orrectly. */.   
1c520 20 69 66 28 20 62 74 72 65 65 47 65 74 50 61 67   if( btreeGetPag
1c530 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
1c540 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1, 0)==SQLITE_OK
1c550 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   ){.      int nP
1c560 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32  age = get4byte(2
1c570 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  8+(u8*)pPage1->a
1c580 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73  Data);.      tes
1c590 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20  tcase( nPage==0 
1c5a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61  );.      if( nPa
1c5b0 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50  ge==0 ) sqlite3P
1c5c0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
1c5d0 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
1c5e0 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
1c5f0 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  se( pBt->nPage!=
1c600 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70  nPage );.      p
1c610 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67  Bt->nPage = nPag
1c620 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  e;.      release
1c630 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
1c640 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1c650 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72  countValidCursor
1c660 73 28 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a  s(pBt, 1)==0 );.
1c670 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
1c680 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
1c690 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c  EAD;.    btreeCl
1c6a0 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
1c6b0 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
1c6c0 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
1c6d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1c6e0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1c6f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1c700 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65   Start a stateme
1c710 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
1c720 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  n. The subtransa
1c730 63 74 69 6f 6e 20 63 61 6e 20 63 61 6e 20 62 65  ction can can be
1c740 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
1c750 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66  independently of
1c760 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
1c770 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20  ction. You must 
1c780 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
1c790 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73  ion .** before s
1c7a0 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61  tarting a subtra
1c7b0 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
1c7c0 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  btransaction is 
1c7d0 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ended automatica
1c7e0 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d  lly .** if the m
1c7f0 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ain transaction 
1c800 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73  commits or rolls
1c810 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61   back..**.** Sta
1c820 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
1c830 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20  ctions are used 
1c840 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61  around individua
1c850 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  l SQL statements
1c860 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e  .** that are con
1c870 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20  tained within a 
1c880 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62  BEGIN...COMMIT b
1c890 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73  lock.  If a cons
1c8a0 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20  traint.** error 
1c8b0 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
1c8c0 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  e statement, the
1c8d0 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20   effect of that 
1c8e0 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  one statement.**
1c8f0 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
1c900 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
1c910 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ng to rollback t
1c920 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
1c930 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73  ction..**.** A s
1c940 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61  tatement sub-tra
1c950 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c  nsaction is impl
1c960 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e  emented as an an
1c970 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
1c980 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20  t. The.** value 
1c990 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
1c9a0 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
1c9b0 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
1c9c0 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73  er of savepoints
1c9d0 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74  ,.** including t
1c9e0 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73  he new anonymous
1c9f0 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e   savepoint, open
1ca00 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20   on the B-Tree. 
1ca10 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a  i.e. if there.**
1ca20 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73   are no active s
1ca30 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f  avepoints and no
1ca40 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
1ca50 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70  -transactions op
1ca60 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e  en,.** iStatemen
1ca70 74 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f  t is 1. This ano
1ca80 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
1ca90 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64   can be released
1caa0 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a   or rolled back.
1cab0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c  ** using the sql
1cac0 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
1cad0 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  nt() function..*
1cae0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1caf0 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65  eeBeginStmt(Btre
1cb00 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65  e *p, int iState
1cb10 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ment){.  int rc;
1cb20 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1cb30 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
1cb40 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1cb50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
1cb60 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1cb70 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
1cb80 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
1cb90 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
1cba0 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
1cbb0 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29  ( iStatement>0 )
1cbc0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
1cbd0 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53  tement>p->db->nS
1cbe0 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73  avepoint );.  as
1cbf0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
1cc00 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1cc10 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74  WRITE );.  /* At
1cc20 20 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c   the pager level
1cc30 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  , a statement tr
1cc40 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73  ansaction is a s
1cc50 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20  avepoint with.  
1cc60 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61  ** an index grea
1cc70 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76  ter than all sav
1cc80 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20  epoints created 
1cc90 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67  explicitly using
1cca0 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d  .  ** SQL statem
1ccb0 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65  ents. It is ille
1ccc0 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c  gal to open, rel
1ccd0 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
1cce0 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73   any.  ** such s
1ccf0 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20  avepoints while 
1cd00 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
1cd10 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
1cd20 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20  int is active.. 
1cd30 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
1cd40 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
1cd50 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
1cd60 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20  , iStatement);. 
1cd70 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1cd80 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1cd90 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
1cda0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1cdb0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1cdc0 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73  n, op, is always
1cdd0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
1cde0 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f  ACK.** or SAVEPO
1cdf0 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69  INT_RELEASE. Thi
1ce00 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65  s function eithe
1ce10 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f  r releases or ro
1ce20 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20  lls back the.** 
1ce30 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69  savepoint identi
1ce40 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
1ce50 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65  r iSavepoint, de
1ce60 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76  pending on the v
1ce70 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a  alue .** of op..
1ce80 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
1ce90 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72  iSavepoint is gr
1cea0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
1ceb0 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77  ual to zero. How
1cec0 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a  ever, if op is.*
1ced0 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  * SAVEPOINT_ROLL
1cee0 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65  BACK, then iSave
1cef0 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62  point may also b
1cf00 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61  e -1. In this ca
1cf10 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  se the .** conte
1cf20 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72  nts of the entir
1cf30 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e transaction ar
1cf40 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54  e rolled back. T
1cf50 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74  his is different
1cf60 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61  .** from a norma
1cf70 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  l transaction ro
1cf80 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f  llback, as no lo
1cf90 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65 64  cks are released
1cfa0 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e   and the.** tran
1cfb0 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20  saction remains 
1cfc0 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  open..*/.int sql
1cfd0 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
1cfe0 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  nt(Btree *p, int
1cff0 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f   op, int iSavepo
1d000 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  int){.  int rc =
1d010 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
1d020 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ( p && p->inTran
1d030 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1d040 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
1d050 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1d060 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41    assert( op==SA
1d070 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
1d080 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  || op==SAVEPOINT
1d090 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20  _ROLLBACK );.   
1d0a0 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f   assert( iSavepo
1d0b0 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65  int>=0 || (iSave
1d0c0 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d  point==-1 && op=
1d0d0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
1d0e0 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ACK) );.    sqli
1d0f0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1d100 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1d110 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e3PagerSavepoint
1d120 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70  (pBt->pPager, op
1d130 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
1d140 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d150 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
1d160 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26  ( iSavepoint<0 &
1d170 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
1d180 20 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59   & BTS_INITIALLY
1d190 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20  _EMPTY)!=0 ){.  
1d1a0 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
1d1b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1d1c0 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61      rc = newData
1d1d0 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20  base(pBt);.     
1d1e0 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65   pBt->nPage = ge
1d1f0 74 34 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d  t4byte(28 + pBt-
1d200 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  >pPage1->aData);
1d210 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64  ..      /* The d
1d220 61 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73  atabase size was
1d230 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1d240 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74  e offset 28 of t
1d250 68 65 20 68 65 61 64 65 72 0a 20 20 20 20 20 20  he header.      
1d260 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  ** when the tran
1d270 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c  saction started,
1d280 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74   so we know that
1d290 20 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66   the value at of
1d2a0 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38  fset.      ** 28
1d2b0 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a   is nonzero. */.
1d2c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
1d2d0 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20  t->nPage>0 );.  
1d2e0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
1d2f0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1d300 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1d310 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
1d320 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20   new cursor for 
1d330 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20  the BTree whose 
1d340 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70  root is on the p
1d350 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49  age.** iTable. I
1d360 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  f a read-only cu
1d370 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65  rsor is requeste
1d380 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  d, it is assumed
1d390 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c   that.** the cal
1d3a0 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61 73 20  ler already has 
1d3b0 61 74 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d  at least a read-
1d3c0 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  only transaction
1d3d0 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20   open.** on the 
1d3e0 64 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79  database already
1d3f0 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63 75 72  . If a write-cur
1d400 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64  sor is requested
1d410 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61  , then.** the ca
1d420 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64 20  ller is assumed 
1d430 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20  to have an open 
1d440 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
1d450 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c  n..**.** If wrFl
1d460 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  ag==0, then the 
1d470 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20  cursor can only 
1d480 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
1d490 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61  ing..** If wrFla
1d4a0 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63  g==1, then the c
1d4b0 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65  ursor can be use
1d4c0 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72  d for reading or
1d4d0 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20   for.** writing 
1d4e0 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69  if other conditi
1d4f0 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20  ons for writing 
1d500 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54  are also met.  T
1d510 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20  hese.** are the 
1d520 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20  conditions that 
1d530 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f  must be met in o
1d540 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67  rder for writing
1d550 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65   to.** be allowe
1d560 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65  d:.**.** 1:  The
1d570 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76   cursor must hav
1d580 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69  e been opened wi
1d590 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a  th wrFlag==1.**.
1d5a0 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74  ** 2:  Other dat
1d5b0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1d5c0 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65  s that share the
1d5d0 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68   same pager cach
1d5e0 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69  e.**     but whi
1d5f0 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  ch are not in th
1d600 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54  e READ_UNCOMMITT
1d610 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74  ED state may not
1d620 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72   have.**     cur
1d630 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77  sors open with w
1d640 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20  rFlag==0 on the 
1d650 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68  same table.  Oth
1d660 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68  erwise.**     th
1d670 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  e changes made b
1d680 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72  y this write cur
1d690 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73  sor would be vis
1d6a0 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74  ible to.**     t
1d6b0 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  he read cursors 
1d6c0 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74  in the other dat
1d6d0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1d6e0 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20  ..**.** 3:  The 
1d6f0 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
1d700 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f   writable (not o
1d710 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69  n read-only medi
1d720 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65  a).**.** 4:  The
1d730 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63  re must be an ac
1d740 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
1d750 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b  ..**.** No check
1d760 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d  ing is done to m
1d770 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61  ake sure that pa
1d780 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79  ge iTable really
1d790 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   is the.** root 
1d7a0 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65  page of a b-tree
1d7b0 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  .  If it is not,
1d7c0 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
1d7d0 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c   acquired.** wil
1d7e0 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65  l not work corre
1d7f0 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ctly..**.** It i
1d800 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
1d810 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
1d820 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20  ursorZero() has 
1d830 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f  been called.** o
1d840 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61  n pCur to initia
1d850 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  lize the memory 
1d860 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69  space prior to i
1d870 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75  nvoking this rou
1d880 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tine..*/.static 
1d890 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28  int btreeCursor(
1d8a0 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
1d8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1d8d0 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
1d8e0 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
1d8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d900 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
1d910 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
1d920 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
1d930 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d940 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d950 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
1d960 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
1d970 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
1d980 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
1d990 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
1d9a0 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66   to comparison f
1d9b0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43  unction */.  BtC
1d9c0 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20  ursor *pCur     
1d9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9e0 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
1d9f0 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29   new cursor */.)
1da00 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
1da10 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20  t = p->pBt;     
1da20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
1da30 61 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64  ared b-tree hand
1da40 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  le */..  assert(
1da50 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
1da60 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
1da70 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
1da80 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29  0 || wrFlag==1 )
1da90 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
1daa0 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61  owing assert sta
1dab0 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74  tements verify t
1dac0 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20 61  hat if this is a
1dad0 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20   sharable .  ** 
1dae0 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 2c  b-tree database,
1daf0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
1db00 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72  is holding the r
1db10 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f  equired table lo
1db20 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74  cks, .  ** and t
1db30 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hat no other con
1db40 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20  nection has any 
1db50 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74  open cursor that
1db60 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20   conflicts with 
1db70 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e  .  ** this lock.
1db80 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68    */.  assert( h
1db90 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
1dba0 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65  leLock(p, iTable
1dbb0 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77  , pKeyInfo!=0, w
1dbc0 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61 73  rFlag+1) );.  as
1dbd0 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
1dbe0 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c  || !hasReadConfl
1dbf0 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20  icts(p, iTable) 
1dc00 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
1dc10 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
1dc20 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72  has opened the r
1dc30 65 71 75 69 72 65 64 20 74 72 61 6e 73 61 63 74  equired transact
1dc40 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ion. */.  assert
1dc50 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  ( p->inTrans>TRA
1dc60 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73  NS_NONE );.  ass
1dc70 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
1dc80 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  | p->inTrans==TR
1dc90 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
1dca0 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
1dcb0 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  e1 && pBt->pPage
1dcc0 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20 69  1->aData );..  i
1dcd0 66 28 20 4e 45 56 45 52 28 77 72 46 6c 61 67 20  f( NEVER(wrFlag 
1dce0 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
1dcf0 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
1dd00 59 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 72 65  Y)!=0) ){.    re
1dd10 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
1dd20 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
1dd30 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72  iTable==1 && btr
1dd40 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
1dd50 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
1dd60 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a  t( wrFlag==0 );.
1dd70 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a      iTable = 0;.
1dd80 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68    }..  /* Now th
1dd90 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f  at no other erro
1dda0 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69  rs can occur, fi
1ddb0 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20  nish filling in 
1ddc0 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a  the BtCursor.  *
1ddd0 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20  * variables and 
1dde0 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20  link the cursor 
1ddf0 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65  into the BtShare
1de00 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43  d list.  */.  pC
1de10 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28  ur->pgnoRoot = (
1de20 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70  Pgno)iTable;.  p
1de30 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b  Cur->iPage = -1;
1de40 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  .  pCur->pKeyInf
1de50 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  o = pKeyInfo;.  
1de60 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70  pCur->pBtree = p
1de70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20  ;.  pCur->pBt = 
1de80 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 77  pBt;.  assert( w
1de90 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c  rFlag==0 || wrFl
1dea0 61 67 3d 3d 42 54 43 46 5f 57 72 69 74 65 46 6c  ag==BTCF_WriteFl
1deb0 61 67 20 29 3b 0a 20 20 70 43 75 72 2d 3e 63 75  ag );.  pCur->cu
1dec0 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 3b  rFlags = wrFlag;
1ded0 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d  .  pCur->pNext =
1dee0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
1def0 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74   if( pCur->pNext
1df00 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e   ){.    pCur->pN
1df10 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75  ext->pPrev = pCu
1df20 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43  r;.  }.  pBt->pC
1df30 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20  ursor = pCur;.  
1df40 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
1df50 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
1df60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1df70 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  K;.}.int sqlite3
1df80 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  BtreeCursor(.  B
1df90 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
1dfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1dfc0 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
1dfd0 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
1dfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dff0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
1e000 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
1e010 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
1e020 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
1e030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e040 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20          /* 1 to 
1e050 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e  write. 0 read-on
1e060 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b  ly */.  struct K
1e070 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1e080 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e090 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
1e0a0 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a   to xCompare() *
1e0b0 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
1e0c0 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
1e0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0e0 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72  /* Write new cur
1e0f0 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  sor here */.){. 
1e100 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
1e110 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1e120 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72  .  rc = btreeCur
1e130 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77  sor(p, iTable, w
1e140 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c  rFlag, pKeyInfo,
1e150 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65   pCur);.  sqlite
1e160 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1e170 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e180 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1e190 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72   size of a BtCur
1e1a0 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79  sor object in by
1e1b0 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tes..**.** This 
1e1c0 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e 65  interfaces is ne
1e1d0 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73 65  eded so that use
1e1e0 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61  rs of cursors ca
1e1f0 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a  n preallocate.**
1e200 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72   sufficient stor
1e210 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75  age to hold a cu
1e220 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72  rsor.  The BtCur
1e230 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70  sor object is op
1e240 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73  aque.** to users
1e250 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20   so they cannot 
1e260 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20  do the sizeof() 
1e270 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65  themselves - the
1e280 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74  y must call.** t
1e290 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  his routine..*/.
1e2a0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1e2b0 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29  CursorSize(void)
1e2c0 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44  {.  return ROUND
1e2d0 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f  8(sizeof(BtCurso
1e2e0 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  r));.}../*.** In
1e2f0 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20  itialize memory 
1e300 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e  that will be con
1e310 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42 74  verted into a Bt
1e320 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a  Cursor object..*
1e330 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65 20  *.** The simple 
1e340 61 70 70 72 6f 61 63 68 20 68 65 72 65 20 77 6f  approach here wo
1e350 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65 74  uld be to memset
1e360 28 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f 62  () the entire ob
1e370 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e  ject.** to zero.
1e380 20 20 42 75 74 20 69 74 20 74 75 72 6e 73 20 6f    But it turns o
1e390 75 74 20 74 68 61 74 20 74 68 65 20 61 70 50 61  ut that the apPa
1e3a0 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d  ge[] and aiIdx[]
1e3b0 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f   arrays.** do no
1e3c0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65 72  t need to be zer
1e3d0 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61 72 65  oed and they are
1e3e0 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63 61   large, so we ca
1e3f0 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20  n save a lot.** 
1e400 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20 73  of run-time by s
1e410 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74  kipping the init
1e420 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68  ialization of th
1e430 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f  ose elements..*/
1e440 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
1e450 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74 43  eeCursorZero(BtC
1e460 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d  ursor *p){.  mem
1e470 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65 74  set(p, 0, offset
1e480 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69 50 61  of(BtCursor, iPa
1e490 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ge));.}../*.** C
1e4a0 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20  lose a cursor.  
1e4b0 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  The read lock on
1e4c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1e4d0 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a  le is released.*
1e4e0 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
1e4f0 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64  cursor is closed
1e500 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e510 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
1e520 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1e530 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  {.  Btree *pBtre
1e540 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  e = pCur->pBtree
1e550 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29  ;.  if( pBtree )
1e560 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
1e570 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1e580 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20   pCur->pBt;.    
1e590 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1e5a0 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73  r(pBtree);.    s
1e5b0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
1e5c0 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
1e5d0 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65    if( pCur->pPre
1e5e0 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  v ){.      pCur-
1e5f0 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
1e600 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
1e610 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42   }else{.      pB
1e620 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
1e630 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  r->pNext;.    }.
1e640 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e      if( pCur->pN
1e650 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75  ext ){.      pCu
1e660 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  r->pNext->pPrev 
1e670 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20  = pCur->pPrev;. 
1e680 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
1e690 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
1e6a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
1e6b0 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
1e6c0 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
1e6d0 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  }.    unlockBtre
1e6e0 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
1e6f0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1e700 65 28 70 42 74 72 65 65 2d 3e 64 62 2c 20 70 43  e(pBtree->db, pC
1e710 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a  ur->aOverflow);.
1e720 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66      /* sqlite3_f
1e730 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20  ree(pCur); */.  
1e740 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1e750 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
1e760 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1e770 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  _OK;.}../*.** Ma
1e780 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43 75  ke sure the BtCu
1e790 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74  rsor* given in t
1e7a0 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20  he argument has 
1e7b0 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72  a valid.** BtCur
1e7c0 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75  sor.info structu
1e7d0 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  re.  If it is no
1e7e0 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c  t already valid,
1e7f0 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61   call.** btreePa
1e800 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c  rseCell() to fil
1e810 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42  l it in..**.** B
1e820 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20  tCursor.info is 
1e830 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 69  a cache of the i
1e840 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
1e850 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a  e current cell..
1e860 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63 61  ** Using this ca
1e870 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65 20  che reduces the 
1e880 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
1e890 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  to btreeParseCel
1e8a0 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d  l()..**.** 2007-
1e8b0 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20 69 73  06-25:  There is
1e8c0 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65 20 76   a bug in some v
1e8d0 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20  ersions of MSVC 
1e8e0 74 68 61 74 20 63 61 75 73 65 20 74 68 65 0a 2a  that cause the.*
1e8f0 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72  * compiler to cr
1e900 61 73 68 20 77 68 65 6e 20 67 65 74 43 65 6c 6c  ash when getCell
1e910 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d  Info() is implem
1e920 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63 72 6f  ented as a macro
1e930 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20 69  ..** But there i
1e940 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20  s a measureable 
1e950 73 70 65 65 64 20 61 64 76 61 6e 74 61 67 65 20  speed advantage 
1e960 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d 61 63  to using the mac
1e970 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68  ro on gcc.** (wh
1e980 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72  en less compiler
1e990 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c   optimizations l
1e9a0 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61  ike -Os or -O0 a
1e9b0 72 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a  re used and the.
1e9c0 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e  ** compiler is n
1e9d0 6f 74 20 64 6f 69 6e 67 20 61 67 72 65 73 73 69  ot doing agressi
1e9e0 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53  ve inlining.)  S
1e9f0 6f 20 77 65 20 75 73 65 20 61 20 72 65 61 6c 20  o we use a real 
1ea00 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  function.** for 
1ea10 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72 6f  MSVC and a macro
1ea20 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20   for everything 
1ea30 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23 32  else.  Ticket #2
1ea40 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  457..*/.#ifndef 
1ea50 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20  NDEBUG.  static 
1ea60 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49  void assertCellI
1ea70 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
1ea80 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66  ur){.    CellInf
1ea90 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20  o info;.    int 
1eaa0 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
1eab0 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  age;.    memset(
1eac0 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  &info, 0, sizeof
1ead0 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72  (info));.    btr
1eae0 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
1eaf0 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c  ->apPage[iPage],
1eb00 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61   pCur->aiIdx[iPa
1eb10 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ge], &info);.   
1eb20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
1eb30 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 69  _DB || memcmp(&i
1eb40 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  nfo, &pCur->info
1eb50 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d  , sizeof(info))=
1eb60 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  =0 );.  }.#else.
1eb70 20 20 23 64 65 66 69 6e 65 20 61 73 73 65 72 74    #define assert
1eb80 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64  CellInfo(x).#end
1eb90 69 66 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56  if.#ifdef _MSC_V
1eba0 45 52 0a 20 20 2f 2a 20 55 73 65 20 61 20 72 65  ER.  /* Use a re
1ebb0 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d  al function in M
1ebc0 53 56 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75  SVC to work arou
1ebd0 6e 64 20 62 75 67 73 20 69 6e 20 74 68 61 74 20  nd bugs in that 
1ebe0 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73  compiler. */.  s
1ebf0 74 61 74 69 63 20 76 6f 69 64 20 67 65 74 43 65  tatic void getCe
1ec00 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
1ec10 2a 70 43 75 72 29 7b 0a 20 20 20 20 69 66 28 20  *pCur){.    if( 
1ec20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1ec30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
1ec40 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
1ec50 50 61 67 65 3b 0a 20 20 20 20 20 20 62 74 72 65  Page;.      btre
1ec60 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
1ec70 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70  >apPage[iPage],p
1ec80 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
1ec90 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a  ],&pCur->info);.
1eca0 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
1ecb0 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
1ecc0 69 64 4e 4b 65 79 3b 0a 20 20 20 20 7d 65 6c 73  idNKey;.    }els
1ecd0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 43  e{.      assertC
1ece0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1ecf0 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f     }.  }.#else /
1ed00 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45  * if not _MSC_VE
1ed10 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20  R */.  /* Use a 
1ed20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68  macro in all oth
1ed30 65 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20  er compilers so 
1ed40 74 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f  that the functio
1ed50 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a  n is inlined */.
1ed60 23 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49  #define getCellI
1ed70 6e 66 6f 28 70 43 75 72 29 20 20 20 20 20 20 20  nfo(pCur)       
1ed80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1edb0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66  .  if( pCur->inf
1edc0 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20  o.nSize==0 ){   
1edd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ede0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee00 5c 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20  \.    int iPage 
1ee10 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 20  = pCur->iPage;  
1ee20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee50 20 5c 0a 20 20 20 20 62 74 72 65 65 50 61 72 73   \.    btreePars
1ee60 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
1ee70 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e  ge[iPage],pCur->
1ee80 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43  aiIdx[iPage],&pC
1ee90 75 72 2d 3e 69 6e 66 6f 29 3b 20 20 20 20 20 20  ur->info);      
1eea0 20 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 63 75    \.    pCur->cu
1eeb0 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56  rFlags |= BTCF_V
1eec0 61 6c 69 64 4e 4b 65 79 3b 20 20 20 20 20 20 20  alidNKey;       
1eed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eef0 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20     \.  }else{   
1ef00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef40 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74      \.    assert
1ef50 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20  CellInfo(pCur); 
1ef60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef90 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69       \.  }.#endi
1efa0 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f  f /* _MSC_VER */
1efb0 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
1efc0 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f    /* The next ro
1efd0 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20  utine used only 
1efe0 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
1eff0 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a  statements */./*
1f000 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
1f010 69 66 20 74 68 65 20 67 69 76 65 6e 20 42 74 43  if the given BtC
1f020 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20  ursor is valid. 
1f030 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20   A valid cursor 
1f040 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69  is one.** that i
1f050 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
1f060 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e  ting to a row in
1f070 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74   a (non-empty) t
1f080 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73  able..** This is
1f090 20 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20   a verification 
1f0a0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
1f0b0 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
1f0c0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e  rt() statements.
1f0d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1f0e0 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
1f0f0 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
1f100 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
1f110 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
1f120 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  ==CURSOR_VALID;.
1f130 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42  }.#endif /* NDEB
1f140 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  UG */../*.** Set
1f150 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73   *pSize to the s
1f160 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65  ize of the buffe
1f170 72 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64  r needed to hold
1f180 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a   the value of.**
1f190 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65   the key for the
1f1a0 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20   current entry. 
1f1b0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
1f1c0 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a  s not pointing.*
1f1d0 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74  * to a valid ent
1f1e0 72 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65  ry, *pSize is se
1f1f0 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46  t to 0. .**.** F
1f200 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  or a table with 
1f210 74 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20  the INTKEY flag 
1f220 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  set, this routin
1f230 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65  e returns the ke
1f240 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74  y.** itself, not
1f250 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1f260 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e  ytes in the key.
1f270 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
1f280 72 20 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e 20  r must position 
1f290 74 68 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72  the cursor prior
1f2a0 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69   to invoking thi
1f2b0 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a  s routine..** .*
1f2c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
1f2d0 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74 20  annot fail.  It 
1f2e0 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53  always returns S
1f2f0 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69  QLITE_OK.  .*/.i
1f300 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
1f310 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  eySize(BtCursor 
1f320 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a  *pCur, i64 *pSiz
1f330 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  e){.  assert( cu
1f340 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1f350 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1f360 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1f370 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c  CURSOR_INVALID |
1f380 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
1f390 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1f3a0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1f3b0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
1f3c0 20 29 7b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d   ){.    *pSize =
1f3d0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1f3e0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
1f3f0 72 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d  r);.    *pSize =
1f400 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
1f410 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1f420 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1f430 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f  ** Set *pSize to
1f440 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1f450 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20  ytes of data in 
1f460 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a  the entry the.**
1f470 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c   cursor currentl
1f480 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a  y points to..**.
1f490 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
1f4a0 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  st guarantee tha
1f4b0 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
1f4c0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f  pointing to a no
1f4d0 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20  n-NULL.** valid 
1f4e0 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72  entry.  In other
1f4f0 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c   words, the call
1f500 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75  ing procedure mu
1f510 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20  st guarantee.** 
1f520 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
1f530 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74  has Cursor.eStat
1f540 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e  e==CURSOR_VALID.
1f550 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69  .**.** Failure i
1f560 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20  s not possible. 
1f570 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
1f580 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51  lways returns SQ
1f590 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d  LITE_OK..** It m
1f5a0 69 67 68 74 20 6a 75 73 74 20 61 73 20 77 65 6c  ight just as wel
1f5b0 6c 20 62 65 20 61 20 70 72 6f 63 65 64 75 72 65  l be a procedure
1f5c0 20 28 72 65 74 75 72 6e 69 6e 67 20 76 6f 69 64   (returning void
1f5d0 29 20 62 75 74 20 77 65 20 63 6f 6e 74 69 6e 75  ) but we continu
1f5e0 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20 61  e.** to return a
1f5f0 6e 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74  n integer result
1f600 20 63 6f 64 65 20 66 6f 72 20 68 69 73 74 6f 72   code for histor
1f610 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f  ical reasons..*/
1f620 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1f630 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73  eDataSize(BtCurs
1f640 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
1f650 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Size){.  assert(
1f660 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1f670 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1f680 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1f690 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1f6a0 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  );.  getCellInfo
1f6b0 28 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65  (pCur);.  *pSize
1f6c0 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44   = pCur->info.nD
1f6d0 61 74 61 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ata;.  return SQ
1f6e0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1f6f0 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65  * Given the page
1f700 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76   number of an ov
1f710 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
1f720 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61 72  he database (par
1f730 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c  ameter.** ovfl),
1f740 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
1f750 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e 75  inds the page nu
1f760 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
1f770 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a   page in the .**
1f780 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
1f790 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
1f7a0 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20  If possible, it 
1f7b0 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61  uses the auto-va
1f7c0 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d  cuum.** pointer-
1f7d0 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61 64  map data instead
1f7e0 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65 20   of reading the 
1f7f0 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20  content of page 
1f800 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a  ovfl to do so. .
1f810 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
1f820 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69  r occurs an SQLi
1f830 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
1f840 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
1f850 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  wise:.**.** The 
1f860 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
1f870 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77  he next overflow
1f880 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e   page in the lin
1f890 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20  ked list is .** 
1f8a0 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e  written to *pPgn
1f8b0 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f  oNext. If page o
1f8c0 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20  vfl is the last 
1f8d0 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b  page in its link
1f8e0 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50  ed .** list, *pP
1f8f0 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74  gnoNext is set t
1f900 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  o zero. .**.** I
1f910 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20  f ppPage is not 
1f920 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65  NULL, and a refe
1f930 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d  rence to the Mem
1f940 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72  Page object corr
1f950 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
1f960 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66  page number pOvf
1f970 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20  l was obtained, 
1f980 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20  then *ppPage is 
1f990 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
1f9a0 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63  that.** referenc
1f9b0 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  e. It is the res
1f9c0 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
1f9d0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c  he caller to cal
1f9e0 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a  l releasePage().
1f9f0 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f  ** on *ppPage to
1fa00 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72 65   free the refere
1fa10 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72  nce. In no refer
1fa20 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65  ence was obtaine
1fa30 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  d (because.** th
1fa40 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61  e pointer-map wa
1fa50 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e  s used to obtain
1fa60 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a   the value for *
1fa70 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e  pPgnoNext), then
1fa80 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73  .** *ppPage is s
1fa90 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  et to zero..*/.s
1faa0 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65  tatic int getOve
1fab0 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53  rflowPage(.  BtS
1fac0 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
1fad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1fae0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1faf0 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20  /.  Pgno ovfl,  
1fb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb10 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72   /* Current over
1fb20 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
1fb30 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
1fb40 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  ppPage,         
1fb50 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61     /* OUT: MemPa
1fb60 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62  ge handle (may b
1fb70 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e  e NULL) */.  Pgn
1fb80 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20  o *pPgnoNext    
1fb90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1fba0 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  : Next overflow 
1fbb0 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  page number */.)
1fbc0 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20  {.  Pgno next = 
1fbd0 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
1fbe0 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  age = 0;.  int r
1fbf0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1fc00 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1fc10 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1fc20 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1fc30 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b  sert(pPgnoNext);
1fc40 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1fc50 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1fc60 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e  .  /* Try to fin
1fc70 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  d the next page 
1fc80 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
1fc90 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20  list using the. 
1fca0 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70   ** autovacuum p
1fcb0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
1fcc0 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65  . Guess that the
1fcd0 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20   next page in . 
1fce0 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   ** the overflow
1fcf0 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75   list is page nu
1fd00 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49  mber (ovfl+1). I
1fd10 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72  f that guess tur
1fd20 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20  ns .  ** out to 
1fd30 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62  be wrong, fall b
1fd40 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74  ack to loading t
1fd50 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20  he data of page 
1fd60 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66  .  ** number ovf
1fd70 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  l to determine t
1fd80 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d  he next page num
1fd90 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ber..  */.  if( 
1fda0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1fdb0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
1fdc0 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73  ;.    Pgno iGues
1fdd0 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20  s = ovfl+1;.    
1fde0 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77  u8 eType;..    w
1fdf0 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
1fe00 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29  AGE(pBt, iGuess)
1fe10 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44   || iGuess==PEND
1fe20 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1fe30 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65  t) ){.      iGue
1fe40 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ss++;.    }..   
1fe50 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74 72   if( iGuess<=btr
1fe60 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
1fe70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1fe80 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47  trmapGet(pBt, iG
1fe90 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70  uess, &eType, &p
1fea0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
1feb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1fec0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1fed0 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f  VERFLOW2 && pgno
1fee0 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20  ==ovfl ){.      
1fef0 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b    next = iGuess;
1ff00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1ff10 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
1ff20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
1ff30 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  dif..  assert( n
1ff40 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  ext==0 || rc==SQ
1ff50 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69  LITE_DONE );.  i
1ff60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ff70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
1ff80 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f  eeGetPage(pBt, o
1ff90 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28 70 70  vfl, &pPage, (pp
1ffa0 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47 45 52  Page==0) ? PAGER
1ffb0 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  _GET_READONLY : 
1ffc0 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
1ffd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
1ffe0 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20   pPage==0 );.   
1fff0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20000 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74  OK ){.      next
20010 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61 67   = get4byte(pPag
20020 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d  e->aData);.    }
20030 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65  .  }..  *pPgnoNe
20040 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28  xt = next;.  if(
20050 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a   ppPage ){.    *
20060 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a  ppPage = pPage;.
20070 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c    }else{.    rel
20080 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
20090 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72  .  }.  return (r
200a0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f  c==SQLITE_DONE ?
200b0 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29   SQLITE_OK : rc)
200c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  ;.}../*.** Copy 
200d0 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
200e0 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72  er to a page, or
200f0 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20   from a page to 
20100 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  a buffer..**.** 
20110 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f  pPayload is a po
20120 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73 74  inter to data st
20130 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65  ored on database
20140 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a   page pDbPage..*
20150 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f  * If argument eO
20160 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  p is false, then
20170 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
20180 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a  data are copied.
20190 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64  ** from pPayload
201a0 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70   to the buffer p
201b0 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42 75  ointed at by pBu
201c0 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72 75  f. If eOp is tru
201d0 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74  e,.** then sqlit
201e0 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
201f0 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50  s called on pDbP
20200 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79  age and nByte by
20210 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61  tes.** of data a
20220 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74  re copied from t
20230 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20 74  he buffer pBuf t
20240 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a  o pPayload..**.*
20250 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
20260 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
20270 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e  ss, otherwise an
20280 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
20290 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50  static int copyP
202a0 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a  ayload(.  void *
202b0 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20  pPayload,       
202c0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
202d0 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  o page data */. 
202e0 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
202f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
20300 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
20310 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20  */.  int nByte, 
20320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20330 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
20340 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69  s to copy */.  i
20350 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20  nt eOp,         
20360 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e           /* 0 ->
20370 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c   copy from page,
20380 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61   1 -> copy to pa
20390 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ge */.  DbPage *
203a0 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20 20  pDbPage         
203b0 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
203c0 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f  ning pPayload */
203d0 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b  .){.  if( eOp ){
203e0 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74  .    /* Copy dat
203f0 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f  a from buffer to
20400 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20 6f   page (a write o
20410 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
20420 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
20430 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
20440 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
20450 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
20460 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
20470 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
20480 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c  (pPayload, pBuf,
20490 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65   nByte);.  }else
204a0 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
204b0 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20  ta from page to 
204c0 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20 6f  buffer (a read o
204d0 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
204e0 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50   memcpy(pBuf, pP
204f0 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a  ayload, nByte);.
20500 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
20510 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
20520 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
20530 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f  s used to read o
20540 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c  r overwrite payl
20550 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  oad information.
20560 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79  ** for the entry
20570 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20 63   that the pCur c
20580 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
20590 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a 2a  g to. The eOp.**
205a0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 6e 74   argument is int
205b0 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c  erpreted as foll
205c0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20  ows:.**.**   0: 
205d0 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  The operation is
205e0 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c 61 74   a read. Populat
205f0 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
20600 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54 68  ache..**   1: Th
20610 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
20620 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61 74 65   write. Populate
20630 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61   the overflow ca
20640 63 68 65 2e 0a 2a 2a 20 20 20 32 3a 20 54 68 65  che..**   2: The
20650 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20   operation is a 
20660 72 65 61 64 2e 20 44 6f 20 6e 6f 74 20 70 6f 70  read. Do not pop
20670 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  ulate the overfl
20680 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  ow cache..**.** 
20690 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22  A total of "amt"
206a0 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64 20   bytes are read 
206b0 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e  or written begin
206c0 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22  ning at "offset"
206d0 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61  ..** Data is rea
206e0 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65  d to or from the
206f0 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a   buffer pBuf..**
20700 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  .** The content 
20710 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77 72  being read or wr
20720 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70 65  itten might appe
20730 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70  ar on the main p
20740 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61  age.** or be sca
20750 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75  ttered out on mu
20760 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20  ltiple overflow 
20770 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pages..**.** If 
20780 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
20790 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e  or entry uses on
207a0 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
207b0 6f 77 20 70 61 67 65 73 20 61 6e 64 20 74 68 65  ow pages and the
207c0 0a 2a 2a 20 65 4f 70 20 61 72 67 75 6d 65 6e 74  .** eOp argument
207d0 20 69 73 20 6e 6f 74 20 32 2c 20 74 68 69 73 20   is not 2, this 
207e0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c 6c  function may all
207f0 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
20800 61 6e 64 20 6c 61 7a 69 6c 79 20 0a 2a 2a 20 70  and lazily .** p
20810 6f 70 6c 75 61 74 65 73 20 74 68 65 20 6f 76 65  opluates the ove
20820 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
20830 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74 43  cache array (BtC
20840 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29  ursor.aOverflow)
20850 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74  . .** Subsequent
20860 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 20   calls use this 
20870 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65  cache to make se
20880 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  eking to the sup
20890 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a 2a 2a  plied offset .**
208a0 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e   more efficient.
208b0 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f  .**.** Once an o
208c0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
208d0 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
208e0 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d   allocated, it m
208f0 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  ay be.** invalid
20900 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68  ated if some oth
20910 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65 73  er cursor writes
20920 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62   to the same tab
20930 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65  le, or if.** the
20940 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64   cursor is moved
20950 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
20960 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  row. Additionall
20970 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  y, in auto-vacuu
20980 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66  m.** mode, the f
20990 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20  ollowing events 
209a0 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61  may invalidate a
209b0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  n overflow page-
209c0 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  list cache..**.*
209d0 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65  *   * An increme
209e0 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20  ntal vacuum,.** 
209f0 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20    * A commit in 
20a00 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c  auto_vacuum="ful
20a10 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20  l" mode,.**   * 
20a20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65  Creating a table
20a30 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f   (may require mo
20a40 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77  ving an overflow
20a50 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69   page)..*/.stati
20a60 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c  c int accessPayl
20a70 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
20a80 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
20a90 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
20aa0 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
20ab0 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66  from */.  u32 of
20ac0 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f  fset,          /
20ad0 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20  * Begin reading 
20ae0 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61  this far into pa
20af0 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61  yload */.  u32 a
20b00 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
20b10 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e  /* Read this man
20b20 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73  y bytes */.  uns
20b30 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66  igned char *pBuf
20b40 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62  , /* Write the b
20b50 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62  ytes into this b
20b60 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20  uffer */ .  int 
20b70 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20  eOp             
20b80 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64   /* zero to read
20b90 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72  . non-zero to wr
20ba0 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  ite. */.){.  uns
20bb0 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79  igned char *aPay
20bc0 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  load;.  int rc =
20bd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33   SQLITE_OK;.  u3
20be0 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49  2 nKey;.  int iI
20bf0 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  dx = 0;.  MemPag
20c00 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
20c10 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
20c20 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70  age]; /* Btree p
20c30 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65  age of current e
20c40 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72  ntry */.  BtShar
20c50 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
20c60 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
20c70 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74        /* Btree t
20c80 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e  his cursor belon
20c90 67 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20  gs to */.#ifdef 
20ca0 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56  SQLITE_DIRECT_OV
20cb0 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 69 6e  ERFLOW_READ.  in
20cc0 74 20 62 45 6e 64 3b 20 20 20 20 20 20 20 20 20  t bEnd;         
20cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
20cf0 65 20 69 66 20 72 65 61 64 69 6e 67 20 74 6f 20  e if reading to 
20d00 65 6e 64 20 6f 66 20 64 61 74 61 20 2a 2f 0a 23  end of data */.#
20d10 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
20d20 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65   pPage );.  asse
20d30 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
20d40 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
20d50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
20d60 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
20d70 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
20d80 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  l );.  assert( c
20d90 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
20da0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
20db0 74 28 20 65 4f 70 21 3d 32 20 7c 7c 20 6f 66 66  t( eOp!=2 || off
20dc0 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  set==0 );      /
20dd0 2a 20 41 6c 77 61 79 73 20 73 74 61 72 74 20 66  * Always start f
20de0 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67 20 66 6f  rom beginning fo
20df0 72 20 65 4f 70 3d 3d 32 20 2a 2f 0a 0a 20 20 67  r eOp==2 */..  g
20e00 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
20e10 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70  ;.  aPayload = p
20e20 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20  Cur->info.pCell 
20e30 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65  + pCur->info.nHe
20e40 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28  ader;.  nKey = (
20e50 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20  pPage->intKey ? 
20e60 30 20 3a 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  0 : (int)pCur->i
20e70 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 23 69 66 64 65  nfo.nKey);.#ifde
20e80 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
20e90 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
20ea0 62 45 6e 64 20 3d 20 28 6f 66 66 73 65 74 2b 61  bEnd = (offset+a
20eb0 6d 74 3d 3d 6e 4b 65 79 2b 70 43 75 72 2d 3e 69  mt==nKey+pCur->i
20ec0 6e 66 6f 2e 6e 44 61 74 61 29 3b 0a 23 65 6e 64  nfo.nData);.#end
20ed0 69 66 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28  if..  if( NEVER(
20ee0 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65  offset+amt > nKe
20ef0 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61  y+pCur->info.nDa
20f00 74 61 29 20 0a 20 20 20 7c 7c 20 26 61 50 61 79  ta) .   || &aPay
20f10 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e  load[pCur->info.
20f20 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65  nLocal] > &pPage
20f30 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61  ->aData[pBt->usa
20f40 62 6c 65 53 69 7a 65 5d 0a 20 20 29 7b 0a 20 20  bleSize].  ){.  
20f50 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72    /* Trying to r
20f60 65 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73  ead or write pas
20f70 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
20f80 20 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f   data is an erro
20f90 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  r */.    return 
20fa0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
20fb0 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  KPT;.  }..  /* C
20fc0 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73  heck if data mus
20fd0 74 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65  t be read/writte
20fe0 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74  n to/from the bt
20ff0 72 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e  ree page itself.
21000 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74   */.  if( offset
21010 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  <pCur->info.nLoc
21020 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20  al ){.    int a 
21030 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61  = amt;.    if( a
21040 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e  +offset>pCur->in
21050 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
21060 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66     a = pCur->inf
21070 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65  o.nLocal - offse
21080 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
21090 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
210a0 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c  Payload[offset],
210b0 20 70 42 75 66 2c 20 61 2c 20 28 65 4f 70 20 26   pBuf, a, (eOp &
210c0 20 30 78 30 31 29 2c 20 70 50 61 67 65 2d 3e 70   0x01), pPage->p
210d0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66  DbPage);.    off
210e0 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75  set = 0;.    pBu
210f0 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20  f += a;.    amt 
21100 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  -= a;.  }else{. 
21110 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75     offset -= pCu
21120 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
21130 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
21140 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
21150 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75  0 ){.    const u
21160 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42  32 ovflSize = pB
21170 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
21180 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e  4;  /* Bytes con
21190 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61  tent per ovfl pa
211a0 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ge */.    Pgno n
211b0 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65  extPage;..    ne
211c0 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
211d0 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72  e(&aPayload[pCur
211e0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b  ->info.nLocal]);
211f0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
21200 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
21210 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65 65  ow[] has not bee
21220 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c  n allocated, all
21230 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20  ocate it now..  
21240 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f 20    ** Except, do 
21250 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 4f 76  not allocate aOv
21260 65 72 66 6c 6f 77 5b 5d 20 66 6f 72 20 65 4f 70  erflow[] for eOp
21270 3d 3d 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ==2..    **.    
21280 2a 2a 20 54 68 65 20 61 4f 76 65 72 66 6c 6f 77  ** The aOverflow
21290 5b 5d 20 61 72 72 61 79 20 69 73 20 73 69 7a 65  [] array is size
212a0 64 20 61 74 20 6f 6e 65 20 65 6e 74 72 79 20 66  d at one entry f
212b0 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77  or each overflow
212c0 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20   page.    ** in 
212d0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  the overflow cha
212e0 69 6e 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d  in. The page num
212f0 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74  ber of the first
21300 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
21310 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20  s.    ** stored 
21320 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c  in aOverflow[0],
21330 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66   etc. A value of
21340 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66   0 in the aOverf
21350 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20 20 20  low[] array.    
21360 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65  ** means "not ye
21370 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63 61  t known" (the ca
21380 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f  che is lazily po
21390 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f  pulated)..    */
213a0 0a 20 20 20 20 69 66 28 20 65 4f 70 21 3d 32 20  .    if( eOp!=2 
213b0 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  && (pCur->curFla
213c0 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f  gs & BTCF_ValidO
213d0 76 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  vfl)==0 ){.     
213e0 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43   int nOvfl = (pC
213f0 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ur->info.nPayloa
21400 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d-pCur->info.nLo
21410 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f  cal+ovflSize-1)/
21420 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20  ovflSize;.      
21430 69 66 28 20 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e  if( nOvfl>pCur->
21440 6e 4f 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20  nOvflAlloc ){.  
21450 20 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77        Pgno *aNew
21460 20 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65   = (Pgno*)sqlite
21470 33 44 62 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20  3DbRealloc(.    
21480 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 42          pCur->pB
21490 74 72 65 65 2d 3e 64 62 2c 20 70 43 75 72 2d 3e  tree->db, pCur->
214a0 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c  aOverflow, nOvfl
214b0 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a  *2*sizeof(Pgno).
214c0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
214d0 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
214e0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
214f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
21500 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
21510 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 6e 4f          pCur->nO
21520 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c  vflAlloc = nOvfl
21530 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  *2;.          pC
21540 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20  ur->aOverflow = 
21550 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  aNew;.        }.
21560 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
21570 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21580 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  ){.        memse
21590 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  t(pCur->aOverflo
215a0 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65  w, 0, nOvfl*size
215b0 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20  of(Pgno));.     
215c0 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
215d0 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f  s |= BTCF_ValidO
215e0 76 66 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  vfl;.      }.   
215f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
21600 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
21610 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62  list cache has b
21620 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  een allocated an
21630 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74  d the.    ** ent
21640 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  ry for the first
21650 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c   required overfl
21660 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64  ow page is valid
21670 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69  , skip.    ** di
21680 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20  rectly to it..  
21690 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 43    */.    if( (pC
216a0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
216b0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21 3d  TCF_ValidOvfl)!=
216c0 30 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72  0 && pCur->aOver
216d0 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c  flow[offset/ovfl
216e0 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 69  Size] ){.      i
216f0 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76  Idx = (offset/ov
21700 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e  flSize);.      n
21710 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  extPage = pCur->
21720 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b  aOverflow[iIdx];
21730 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20  .      offset = 
21740 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65  (offset%ovflSize
21750 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f  );.    }..    fo
21760 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  r( ; rc==SQLITE_
21770 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e  OK && amt>0 && n
21780 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29  extPage; iIdx++)
21790 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  {..      /* If r
217a0 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74  equired, populat
217b0 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
217c0 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20  age-list cache. 
217d0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70 43  */.      if( (pC
217e0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
217f0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21 3d  TCF_ValidOvfl)!=
21800 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
21810 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72  ert(!pCur->aOver
21820 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43  flow[iIdx] || pC
21830 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
21840 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a  dx]==nextPage);.
21850 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
21860 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20  verflow[iIdx] = 
21870 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20  nextPage;.      
21880 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66  }..      if( off
21890 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b  set>=ovflSize ){
218a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
218b0 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72  only reason to r
218c0 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73  ead this page is
218d0 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70   to obtain the p
218e0 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
218f0 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65  umber for the ne
21900 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
21910 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
21920 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
21930 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72  ** data is not r
21940 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73  equired. So firs
21950 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20  t try to lookup 
21960 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20  the overflow.   
21970 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73       ** page-lis
21980 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c  t cache, if any,
21990 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20   then fall back 
219a0 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c  to the getOverfl
219b0 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20  owPage().       
219c0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20   ** function..  
219d0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
219e0 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
219f0 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
21a00 72 61 79 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f  ray must be allo
21a10 63 61 74 65 64 20 62 65 63 61 75 73 65 20 65 4f  cated because eO
21a20 70 21 3d 32 0a 20 20 20 20 20 20 20 20 2a 2a 20  p!=2.        ** 
21a30 68 65 72 65 2e 20 20 49 66 20 65 4f 70 3d 3d 32  here.  If eOp==2
21a40 2c 20 74 68 65 6e 20 6f 66 66 73 65 74 3d 3d 30  , then offset==0
21a50 20 61 6e 64 20 74 68 69 73 20 62 72 61 6e 63 68   and this branch
21a60 20 69 73 20 6e 65 76 65 72 20 74 61 6b 65 6e 2e   is never taken.
21a70 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
21a80 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 21      assert( eOp!
21a90 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =2 );.        as
21aa0 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 46  sert( pCur->curF
21ab0 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
21ac0 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20 20 20 20  dOvfl );.       
21ad0 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
21ae0 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a  flow[iIdx+1] ){.
21af0 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
21b00 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
21b10 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20  flow[iIdx+1];.  
21b20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21b30 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f         rc = getO
21b40 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
21b50 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e   nextPage, 0, &n
21b60 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20  extPage);.      
21b70 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66 73    }.        offs
21b80 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a  et -= ovflSize;.
21b90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21ba0 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20       /* Need to 
21bb0 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70  read this page p
21bc0 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74  roperly. It cont
21bd0 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65  ains some of the
21be0 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67  .        ** rang
21bf0 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  e of data that i
21c00 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f  s being read (eO
21c10 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e  p==0) or written
21c20 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20   (eOp!=0)..     
21c30 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c     */.#ifdef SQL
21c40 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
21c50 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20  LOW_READ.       
21c60 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
21c70 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  d;.#endif.      
21c80 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
21c90 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f         if( a + o
21ca0 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65  ffset > ovflSize
21cb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20   ){.          a 
21cc0 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66  = ovflSize - off
21cd0 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  set;.        }..
21ce0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
21cf0 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
21d00 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  AD.        /* If
21d10 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69   all the followi
21d20 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20  ng are true:.   
21d30 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
21d40 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69 73 20  **   1) this is 
21d50 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
21d60 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a  , and .        *
21d70 2a 20 20 20 32 29 20 64 61 74 61 20 69 73 20 72  *   2) data is r
21d80 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65  equired from the
21d90 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f   start of this o
21da0 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e  verflow page, an
21db0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33  d.        **   3
21dc0 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  ) the database i
21dd0 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61  s file-backed, a
21de0 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
21df0 34 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f  4) there is no o
21e00 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e 73 61  pen write-transa
21e10 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20  ction, and.     
21e20 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20 64     **   5) the d
21e30 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61  atabase is not a
21e40 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 0a 20   WAL database,. 
21e50 20 20 20 20 20 20 20 2a 2a 20 20 20 36 29 20 61         **   6) a
21e60 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ll data from the
21e70 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 72   page is being r
21e80 65 61 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ead..        **.
21e90 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
21ea0 64 61 74 61 20 63 61 6e 20 62 65 20 72 65 61 64  data can be read
21eb0 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74   directly from t
21ec0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
21ed0 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
21ee0 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66    ** output buff
21ef0 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68  er, bypassing th
21f00 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6c 74  e page-cache alt
21f10 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20 73 70  ogether. This sp
21f20 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  eeds.        ** 
21f30 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65  up loading large
21f40 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 73 70   records that sp
21f50 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77  an many overflow
21f60 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20 20 20   pages..        
21f70 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  */.        if( (
21f80 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 20 20 20  eOp&0x01)==0    
21f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fb0 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20    /* (1) */.    
21fc0 20 20 20 20 20 26 26 20 6f 66 66 73 65 74 3d 3d       && offset==
21fd0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
21fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
22000 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
22010 20 28 62 45 6e 64 20 7c 7c 20 61 3d 3d 6f 76 66   (bEnd || a==ovf
22020 6c 53 69 7a 65 29 20 20 20 20 20 20 20 20 20 20  lSize)          
22030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22040 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20      /* (6) */.  
22050 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 69         && pBt->i
22060 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
22070 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20 20  ANS_READ        
22080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22090 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (4) */.         
220a0 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65 33  && (fd = sqlite3
220b0 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70  PagerFile(pBt->p
220c0 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64  Pager))->pMethod
220d0 73 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a  s     /* (3) */.
220e0 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d           && pBt-
220f0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 31  >pPage1->aData[1
22100 39 5d 3d 3d 30 78 30 31 20 20 20 20 20 20 20 20  9]==0x01        
22110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22120 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (5) */.       
22130 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38   ){.          u8
22140 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20   aSave[4];.     
22150 20 20 20 20 20 75 38 20 2a 61 57 72 69 74 65 20       u8 *aWrite 
22160 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20  = &pBuf[-4];.   
22170 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 53         memcpy(aS
22180 61 76 65 2c 20 61 57 72 69 74 65 2c 20 34 29 3b  ave, aWrite, 4);
22190 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
221a0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64  sqlite3OsRead(fd
221b0 2c 20 61 57 72 69 74 65 2c 20 61 2b 34 2c 20 28  , aWrite, a+4, (
221c0 69 36 34 29 70 42 74 2d 3e 70 61 67 65 53 69 7a  i64)pBt->pageSiz
221d0 65 2a 28 6e 65 78 74 50 61 67 65 2d 31 29 29 3b  e*(nextPage-1));
221e0 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
221f0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61  age = get4byte(a
22200 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20  Write);.        
22210 20 20 6d 65 6d 63 70 79 28 61 57 72 69 74 65 2c    memcpy(aWrite,
22220 20 61 53 61 76 65 2c 20 34 29 3b 0a 20 20 20 20   aSave, 4);.    
22230 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
22240 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  ..        {.    
22250 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44        DbPage *pD
22260 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  bPage;.         
22270 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
22280 65 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70  erAcquire(pBt->p
22290 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c  Pager, nextPage,
222a0 20 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20 20   &pDbPage,.     
222b0 20 20 20 20 20 20 20 20 20 28 28 65 4f 70 26 30           ((eOp&0
222c0 78 30 31 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f  x01)==0 ? PAGER_
222d0 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30  GET_READONLY : 0
222e0 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ).          );. 
222f0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
22300 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22310 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f            aPaylo
22320 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ad = sqlite3Page
22330 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
22340 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  );.            n
22350 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
22360 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20  te(aPayload);.  
22370 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63            rc = c
22380 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
22390 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20  load[offset+4], 
223a0 70 42 75 66 2c 20 61 2c 20 28 65 4f 70 26 30 78  pBuf, a, (eOp&0x
223b0 30 31 29 2c 20 70 44 62 50 61 67 65 29 3b 0a 20  01), pDbPage);. 
223c0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
223d0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
223e0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
223f0 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
22400 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22410 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d 74     }.        amt
22420 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70   -= a;.        p
22430 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20  Buf += a;.      
22440 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
22450 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22460 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
22470 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
22480 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
22490 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
224a0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74  ./*.** Read part
224b0 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f   of the key asso
224c0 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
224d0 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c  or pCur.  Exactl
224e0 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73  y.** "amt" bytes
224f0 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65   will be transfe
22500 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e  red into pBuf[].
22510 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a    The transfer.*
22520 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66  * begins at "off
22530 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  set"..**.** The 
22540 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75  caller must ensu
22550 72 65 20 74 68 61 74 20 70 43 75 72 20 69 73 20  re that pCur is 
22560 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61  pointing to a va
22570 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68  lid row.** in th
22580 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52  e table..**.** R
22590 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
225a0 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
225b0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
225c0 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
225d0 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
225e0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
225f0 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
22600 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
22610 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
22620 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
22630 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43  ite3BtreeKey(BtC
22640 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
22650 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
22660 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
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 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
226a0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
226b0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
226c0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
226d0 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
226e0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
226f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
22700 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
22710 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
22720 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
22730 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74  ->nCell );.  ret
22740 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  urn accessPayloa
22750 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
22760 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  amt, (unsigned c
22770 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d  har*)pBuf, 0);.}
22780 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
22790 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 73  t of the data as
227a0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
227b0 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63  rsor pCur.  Exac
227c0 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74  tly.** "amt" byt
227d0 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
227e0 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  fered into pBuf[
227f0 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
22800 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
22810 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65  ffset"..**.** Re
22820 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
22830 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
22840 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
22850 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
22860 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
22870 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
22880 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
22890 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
228a0 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
228b0 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
228c0 74 65 33 42 74 72 65 65 44 61 74 61 28 42 74 43  te3BtreeData(BtC
228d0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
228e0 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
228f0 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
22900 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65   int rc;..#ifnde
22910 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
22920 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43  CRBLOB.  if ( pC
22930 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
22940 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
22950 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22960 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  ABORT;.  }.#endi
22970 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  f..  assert( cur
22980 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
22990 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
229a0 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
229b0 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
229c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
229d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
229e0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
229f0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
22a00 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
22a10 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
22a20 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
22a30 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ge] );.    asser
22a40 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
22a50 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
22a60 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
22a70 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
22a80 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
22a90 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
22aa0 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20  set, amt, pBuf, 
22ab0 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
22ac0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
22ad0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
22ae0 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  o payload inform
22af0 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65  ation from the e
22b00 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a  ntry that the .*
22b10 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  * pCur cursor is
22b20 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54   pointing to.  T
22b30 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f  he pointer is to
22b40 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
22b50 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20  f.** the key if 
22b60 69 6e 64 65 78 20 62 74 72 65 65 73 20 28 70 50  index btrees (pP
22b70 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20  age->intKey==0) 
22b80 61 6e 64 20 69 73 20 74 68 65 20 64 61 74 61 20  and is the data 
22b90 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72  for.** table btr
22ba0 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ees (pPage->intK
22bb0 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62  ey==1). The numb
22bc0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61  er of bytes of a
22bd0 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f  vailable.** key/
22be0 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
22bf0 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20  into *pAmt.  If 
22c00 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74  *pAmt==0, then t
22c10 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75  he value.** retu
22c20 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rned will not be
22c30 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72   a valid pointer
22c40 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
22c50 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d  tine is an optim
22c60 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20  ization.  It is 
22c70 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65  common for the e
22c80 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64  ntire key.** and
22c90 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20   data to fit on 
22ca0 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61  the local page a
22cb0 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20  nd for there to 
22cc0 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a  be no overflow.*
22cd0 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74  * pages.  When t
22ce0 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20  hat is so, this 
22cf0 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75  routine can be u
22d00 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68  sed to access th
22d10 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74  e.** key and dat
22d20 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67  a without making
22d30 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65   a copy.  If the
22d40 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61   key and/or data
22d50 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20   spills.** onto 
22d60 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
22d70 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  then accessPaylo
22d80 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65  ad() must be use
22d90 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a  d to reassemble.
22da0 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20  ** the key/data 
22db0 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f  and copy it into
22dc0 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20   a preallocated 
22dd0 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  buffer..**.** Th
22de0 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
22df0 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ed by this routi
22e00 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c  ne looks directl
22e10 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  y into the cache
22e20 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65  d.** page of the
22e30 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
22e40 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67  data might chang
22e50 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65  e or move the ne
22e60 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62  xt time.** any b
22e70 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20  tree routine is 
22e80 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
22e90 63 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65  c const void *fe
22ea0 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  tchPayload(.  Bt
22eb0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
22ec0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
22ed0 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
22ee0 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
22ef0 20 75 33 32 20 2a 70 41 6d 74 20 20 20 20 20 20   u32 *pAmt      
22f00 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
22f10 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
22f20 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72  ilable bytes her
22f30 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  e */.){.  assert
22f40 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75  ( pCur!=0 && pCu
22f50 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
22f60 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
22f70 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73 73  ->iPage]);.  ass
22f80 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
22f90 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
22fa0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
22fb0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
22fc0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
22fd0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
22fe0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
22ff0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
23000 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23010 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
23020 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
23030 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
23040 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
23050 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
23060 65 3e 30 20 29 3b 0a 20 20 2a 70 41 6d 74 20 3d  e>0 );.  *pAmt =
23070 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
23080 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f  al;.  return (vo
23090 69 64 2a 29 28 70 43 75 72 2d 3e 69 6e 66 6f 2e  id*)(pCur->info.
230a0 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e  pCell + pCur->in
230b0 66 6f 2e 6e 48 65 61 64 65 72 29 3b 0a 7d 0a 0a  fo.nHeader);.}..
230c0 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65  ./*.** For the e
230d0 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
230e0 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74   pCur is point t
230f0 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20  o, return as.** 
23100 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68  many bytes of th
23110 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73  e key or data as
23120 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f   are available o
23130 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62  n the local.** b
23140 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69  -tree page.  Wri
23150 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
23160 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
23170 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a   into *pAmt..**.
23180 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
23190 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d  eturned is ephem
231a0 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64  eral.  The key/d
231b0 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20  ata may move.** 
231c0 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  or be destroyed 
231d0 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  on the next call
231e0 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f   to any Btree ro
231f0 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64  utine,.** includ
23200 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f  ing calls from o
23210 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61  ther threads aga
23220 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61  inst the same ca
23230 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61  che..** Hence, a
23240 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74   mutex on the Bt
23250 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65  Shared should be
23260 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63   held prior to c
23270 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72  alling.** this r
23280 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
23290 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20  ese routines is 
232a0 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63  used to get quic
232b0 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20  k access to key 
232c0 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74  and data.** in t
232d0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
232e0 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  here no overflow
232f0 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e   pages are used.
23300 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  .*/.const void *
23310 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46  sqlite3BtreeKeyF
23320 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
23330 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b  Cur, u32 *pAmt){
23340 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63 68 50  .  return fetchP
23350 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
23360 74 29 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64  t);.}.const void
23370 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44 61   *sqlite3BtreeDa
23380 74 61 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  taFetch(BtCursor
23390 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d   *pCur, u32 *pAm
233a0 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74  t){.  return fet
233b0 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
233c0 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pAmt);.}.../*.**
233d0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
233e0 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63   down to a new c
233f0 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20  hild page.  The 
23400 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74  newPgno argument
23410 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   is the.** page 
23420 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68  number of the ch
23430 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ild page to move
23440 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   to..**.** This 
23450 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
23460 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
23470 69 66 20 74 68 65 20 70 61 67 65 2d 68 65 61 64  if the page-head
23480 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f  er flags field o
23490 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69  f.** the new chi
234a0 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74  ld page does not
234b0 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67 73   match the flags
234c0 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61   field of the pa
234d0 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66  rent (i.e..** if
234e0 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20   an intkey page 
234f0 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 74 68  appears to be th
23500 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f  e parent of a no
23510 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f  n-intkey page, o
23520 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29  r.** vice-versa)
23530 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23540 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75  moveToChild(BtCu
23550 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
23560 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  newPgno){.  int 
23570 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 43  rc;.  int i = pC
23580 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d  ur->iPage;.  Mem
23590 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a  Page *pNewPage;.
235a0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
235b0 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20  = pCur->pBt;..  
235c0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
235d0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
235e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
235f0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
23600 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
23610 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c  rt( pCur->iPage<
23620 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
23630 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
23640 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29  pCur->iPage>=0 )
23650 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ;.  if( pCur->iP
23660 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d  age>=(BTCURSOR_M
23670 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20  AX_DEPTH-1) ){. 
23680 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
23690 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
236a0 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64   }.  rc = getAnd
236b0 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65  InitPage(pBt, ne
236c0 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65  wPgno, &pNewPage
236d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
236e0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
236f0 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61   & BTCF_WriteFla
23700 67 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45  g)==0 ? PAGER_GE
23710 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b  T_READONLY : 0);
23720 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
23730 72 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61  rn rc;.  pCur->a
23740 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65  pPage[i+1] = pNe
23750 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61  wPage;.  pCur->a
23760 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20  iIdx[i+1] = 0;. 
23770 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a   pCur->iPage++;.
23780 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
23790 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
237a0 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
237b0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
237c0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20  CF_ValidOvfl);. 
237d0 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e   if( pNewPage->n
237e0 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e 65 77 50 61  Cell<1 || pNewPa
237f0 67 65 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72  ge->intKey!=pCur
23800 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 69 6e 74  ->apPage[i]->int
23810 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Key ){.    retur
23820 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
23830 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
23840 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
23850 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 50 61  ..#if 0./*.** Pa
23860 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e  ge pParent is an
23870 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c   internal (non-l
23880 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20  eaf) tree page. 
23890 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  This function .*
238a0 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70  * asserts that p
238b0 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c  age number iChil
238c0 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68  d is the left-ch
238d0 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27  ild if the iIdx'
238e0 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61  th.** cell in pa
238f0 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20  ge pParent. Or, 
23900 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c  if iIdx is equal
23910 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   to the total nu
23920 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73  mber of.** cells
23930 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61   in pParent, tha
23940 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43  t page number iC
23950 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68  hild is the righ
23960 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68  t-child of.** th
23970 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
23980 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72  c void assertPar
23990 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65  entIndex(MemPage
239a0 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69   *pParent, int i
239b0 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64  Idx, Pgno iChild
239c0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 49 64  ){.  assert( iId
239d0 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  x<=pParent->nCel
239e0 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d  l );.  if( iIdx=
239f0 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
23a00 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  ){.    assert( g
23a10 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
23a20 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
23a30 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d  >hdrOffset+8])==
23a40 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73  iChild );.  }els
23a50 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  e{.    assert( g
23a60 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
23a70 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29  (pParent, iIdx))
23a80 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a  ==iChild );.  }.
23a90 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  }.#else.#  defin
23aa0 65 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  e assertParentIn
23ab0 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64  dex(x,y,z) .#end
23ac0 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  if../*.** Move t
23ad0 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20  he cursor up to 
23ae0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
23af0 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78  .**.** pCur->idx
23b00 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63   is set to the c
23b10 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63  ell index that c
23b20 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e  ontains the poin
23b30 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61  ter.** to the pa
23b40 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67  ge we are coming
23b50 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72   from.  If we ar
23b60 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68  e coming from th
23b70 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20  e.** right-most 
23b80 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20  child page then 
23b90 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
23ba0 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61   to one more tha
23bb0 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74  n.** the largest
23bc0 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a   cell index..*/.
23bd0 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65  static void move
23be0 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f  ToParent(BtCurso
23bf0 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
23c00 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
23c10 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
23c20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
23c30 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
23c40 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
23c50 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
23c60 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
23c70 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
23c80 61 67 65 5d 20 29 3b 0a 0a 20 20 2f 2a 20 55 50  age] );..  /* UP
23c90 44 41 54 45 3a 20 49 74 20 69 73 20 61 63 74 75  DATE: It is actu
23ca0 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 66 6f  ally possible fo
23cb0 72 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  r the condition 
23cc0 74 65 73 74 65 64 20 62 79 20 74 68 65 20 61 73  tested by the as
23cd0 73 65 72 74 0a 20 20 2a 2a 20 62 65 6c 6f 77 20  sert.  ** below 
23ce0 74 6f 20 62 65 20 75 6e 74 72 75 65 20 69 66 20  to be untrue if 
23cf0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
23d00 65 20 69 73 20 63 6f 72 72 75 70 74 2e 20 54 68  e is corrupt. Th
23d10 69 73 20 63 61 6e 20 6f 63 63 75 72 20 69 66 0a  is can occur if.
23d20 20 20 2a 2a 20 6f 6e 65 20 63 75 72 73 6f 72 20    ** one cursor 
23d30 68 61 73 20 6d 6f 64 69 66 69 65 64 20 70 61 67  has modified pag
23d40 65 20 70 50 61 72 65 6e 74 20 77 68 69 6c 65 20  e pParent while 
23d50 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69  a reference to i
23d60 74 20 69 73 20 68 65 6c 64 20 0a 20 20 2a 2a 20  t is held .  ** 
23d70 62 79 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73  by a second curs
23d80 6f 72 2e 20 57 68 69 63 68 20 63 61 6e 20 6f 6e  or. Which can on
23d90 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61 20 73  ly happen if a s
23da0 69 6e 67 6c 65 20 70 61 67 65 20 69 73 20 6c 69  ingle page is li
23db0 6e 6b 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 6d  nked.  ** into m
23dc0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74  ore than one b-t
23dd0 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69 6e  ree structure in
23de0 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
23df0 61 73 65 2e 20 20 2a 2f 0a 23 69 66 20 30 0a 20  ase.  */.#if 0. 
23e00 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
23e10 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ex(.    pCur->ap
23e20 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
23e30 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
23e40 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
23e50 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d  e-1], .    pCur-
23e60 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
23e70 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a  age]->pgno.  );.
23e80 23 65 6e 64 69 66 0a 20 20 74 65 73 74 63 61 73  #endif.  testcas
23e90 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
23ea0 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20  Cur->iPage-1] > 
23eb0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
23ec0 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65  r->iPage-1]->nCe
23ed0 6c 6c 20 29 3b 0a 0a 20 20 72 65 6c 65 61 73 65  ll );..  release
23ee0 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
23ef0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b  e[pCur->iPage]);
23f00 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d  .  pCur->iPage--
23f10 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
23f20 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
23f30 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
23f40 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
23f50 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
23f60 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
23f70 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
23f80 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  t to the root pa
23f90 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65  ge of its b-tree
23fa0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
23fb0 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68  * If the table h
23fc0 61 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f  as a virtual roo
23fd0 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  t page, then the
23fe0 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64   cursor is moved
23ff0 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20   to point.** to 
24000 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  the virtual root
24010 20 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66   page instead of
24020 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74   the actual root
24030 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68   page. A table h
24040 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20  as a.** virtual 
24050 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74  root page when t
24060 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70  he actual root p
24070 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  age contains no 
24080 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20  cells and a .** 
24090 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67  single child pag
240a0 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e. This can only
240b0 20 68 61 70 70 65 6e 20 77 69 74 68 20 74 68 65   happen with the
240c0 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74   table rooted at
240d0 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49   page 1..**.** I
240e0 66 20 74 68 65 20 62 2d 74 72 65 65 20 73 74 72  f the b-tree str
240f0 75 63 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c  ucture is empty,
24100 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74   the cursor stat
24110 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20  e is set to .** 
24120 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20  CURSOR_INVALID. 
24130 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 63  Otherwise, the c
24140 75 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20  ursor is set to 
24150 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72  point to the fir
24160 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74  st.** cell locat
24170 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28  ed on the root (
24180 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29  or virtual root)
24190 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 63 75   page and the cu
241a0 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69 73  rsor state.** is
241b0 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 56   set to CURSOR_V
241c0 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ALID..**.** If t
241d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
241e0 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c  urns successfull
241f0 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73 73  y, it may be ass
24200 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a  umed that the.**
24210 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61   page-header fla
24220 67 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  gs indicate that
24230 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20 72   the [virtual] r
24240 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65 20  oot-page is the 
24250 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e  expected .** kin
24260 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65  d of b-tree page
24270 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f   (i.e. if when o
24280 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f  pening the curso
24290 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64  r the caller did
242a0 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79 20   not.** specify 
242b0 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
242c0 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ure the flags by
242d0 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30  te is set to 0x0
242e0 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e  5 or 0x0D,.** in
242f0 64 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c 65  dicating a table
24300 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20 74   b-tree, or if t
24310 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73 70  he caller did sp
24320 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20  ecify a KeyInfo 
24330 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 68  .** structure th
24340 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20  e flags byte is 
24350 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20 30  set to 0x02 or 0
24360 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  x0A, indicating 
24370 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72  an index.** b-tr
24380 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ee)..*/.static i
24390 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74  nt moveToRoot(Bt
243a0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
243b0 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b   MemPage *pRoot;
243c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
243d0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
243e0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
243f0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
24400 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56  sert( CURSOR_INV
24410 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45  ALID < CURSOR_RE
24420 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61  QUIRESEEK );.  a
24430 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
24440 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52  LID   < CURSOR_R
24450 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
24460 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46  assert( CURSOR_F
24470 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f  AULT   > CURSOR_
24480 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
24490 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
244a0 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
244b0 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28  ESEEK ){.    if(
244c0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
244d0 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20  URSOR_FAULT ){. 
244e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
244f0 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c  r->skipNext!=SQL
24500 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
24510 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
24520 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
24530 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
24540 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
24550 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d    }..  if( pCur-
24560 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  >iPage>=0 ){.   
24570 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 50   while( pCur->iP
24580 61 67 65 20 29 20 72 65 6c 65 61 73 65 50 61 67  age ) releasePag
24590 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  e(pCur->apPage[p
245a0 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a  Cur->iPage--]);.
245b0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72    }else if( pCur
245c0 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b  ->pgnoRoot==0 ){
245d0 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
245e0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
245f0 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ID;.    return S
24600 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
24610 65 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41  e{.    rc = getA
24620 6e 64 49 6e 69 74 50 61 67 65 28 70 43 75 72 2d  ndInitPage(pCur-
24630 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c 20 70 43  >pBtree->pBt, pC
24640 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  ur->pgnoRoot, &p
24650 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2c 0a  Cur->apPage[0],.
24660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24670 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
24680 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61   & BTCF_WriteFla
24690 67 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45  g)==0 ? PAGER_GE
246a0 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b  T_READONLY : 0);
246b0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
246c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
246d0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
246e0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
246f0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
24700 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
24710 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  iPage = 0;.  }. 
24720 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61   pRoot = pCur->a
24730 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65  pPage[0];.  asse
24740 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d  rt( pRoot->pgno=
24750 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20  =pCur->pgnoRoot 
24760 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43 75 72  );..  /* If pCur
24770 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f  ->pKeyInfo is no
24780 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  t NULL, then the
24790 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70 65   caller that ope
247a0 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f 72 0a  ned this cursor.
247b0 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f    ** expected to
247c0 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69   open it on an i
247d0 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68  ndex b-tree. Oth
247e0 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79 49  erwise, if pKeyI
247f0 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c  nfo is.  ** NULL
24800 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70  , the caller exp
24810 65 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74  ects a table b-t
24820 72 65 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  ree. If this is 
24830 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20  not the case,.  
24840 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  ** return an SQL
24850 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f  ITE_CORRUPT erro
24860 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61  r. .  **.  ** Ea
24870 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  rlier versions o
24880 66 20 53 51 4c 69 74 65 20 61 73 73 75 6d 65 64  f SQLite assumed
24890 20 74 68 61 74 20 74 68 69 73 20 74 65 73 74 20   that this test 
248a0 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c 0a 20  could not fail. 
248b0 20 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f 74 20   ** if the root 
248c0 70 61 67 65 20 77 61 73 20 61 6c 72 65 61 64 79  page was already
248d0 20 6c 6f 61 64 65 64 20 77 68 65 6e 20 74 68 69   loaded when thi
248e0 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  s function was c
248f0 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20 2a 2a  alled (i.e..  **
24900 20 69 66 20 70 43 75 72 2d 3e 69 50 61 67 65 3e   if pCur->iPage>
24910 3d 30 29 2e 20 42 75 74 20 74 68 69 73 20 69 73  =0). But this is
24920 20 6e 6f 74 20 73 6f 20 69 66 20 74 68 65 20 64   not so if the d
24930 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75  atabase is corru
24940 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20 73 75  pted .  ** in su
24950 63 68 20 61 20 77 61 79 20 74 68 61 74 20 70 61  ch a way that pa
24960 67 65 20 70 52 6f 6f 74 20 69 73 20 6c 69 6e 6b  ge pRoot is link
24970 65 64 20 69 6e 74 6f 20 61 20 73 65 63 6f 6e 64  ed into a second
24980 20 62 2d 74 72 65 65 20 74 61 62 6c 65 20 0a 20   b-tree table . 
24990 20 2a 2a 20 28 6f 72 20 74 68 65 20 66 72 65 65   ** (or the free
249a0 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61 73 73  list).  */.  ass
249b0 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b  ert( pRoot->intK
249c0 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e  ey==1 || pRoot->
249d0 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 69  intKey==0 );.  i
249e0 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74  f( pRoot->isInit
249f0 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 70 4b  ==0 || (pCur->pK
24a00 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f  eyInfo==0)!=pRoo
24a10 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  t->intKey ){.   
24a20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
24a30 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
24a40 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ..  pCur->aiIdx[
24a50 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  0] = 0;.  pCur->
24a60 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
24a70 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
24a80 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73   &= ~(BTCF_AtLas
24a90 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  t|BTCF_ValidNKey
24aa0 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
24ab0 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  ;..  if( pRoot->
24ac0 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70  nCell>0 ){.    p
24ad0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
24ae0 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65  RSOR_VALID;.  }e
24af0 6c 73 65 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e  lse if( !pRoot->
24b00 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
24b10 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66   subpage;.    if
24b20 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31  ( pRoot->pgno!=1
24b30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
24b40 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
24b50 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74     subpage = get
24b60 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44  4byte(&pRoot->aD
24b70 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66  ata[pRoot->hdrOf
24b80 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43  fset+8]);.    pC
24b90 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
24ba0 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72  SOR_VALID;.    r
24bb0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
24bc0 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a  pCur, subpage);.
24bd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75    }else{.    pCu
24be0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
24bf0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a  OR_INVALID;.  }.
24c00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24c10 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
24c20 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
24c30 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
24c40 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
24c50 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77  he.** entry to w
24c60 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
24c70 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a  ntly pointing..*
24c80 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f  *.** The left-mo
24c90 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f  st leaf is the o
24ca0 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c  ne with the smal
24cb0 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66  lest key - the f
24cc0 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e  irst.** in ascen
24cd0 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
24ce0 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
24cf0 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  Leftmost(BtCurso
24d00 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
24d10 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20   pgno;.  int rc 
24d20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
24d30 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
24d40 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
24d50 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
24d60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
24d70 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
24d80 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
24d90 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
24da0 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
24db0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
24dc0 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66  r->iPage])->leaf
24dd0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
24de0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
24df0 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
24e00 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e  nCell );.    pgn
24e10 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  o = get4byte(fin
24e20 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
24e30 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
24e40 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63 20  Page]));.    rc 
24e50 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
24e60 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ur, pgno);.  }. 
24e70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
24e80 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
24e90 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
24ea0 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
24eb0 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
24ec0 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68  he.** page to wh
24ed0 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
24ee0 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e  tly pointing.  N
24ef0 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72  otice the differ
24f00 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20  ence.** between 
24f10 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
24f20 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74   and moveToRight
24f30 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c  most().  moveToL
24f40 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  eftmost().** fin
24f50 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ds the left-most
24f60 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
24f70 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65  he *entry* where
24f80 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  as moveToRightmo
24f90 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
24fa0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
24fb0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
24fc0 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  page*..**.** The
24fd0 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
24fe0 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  y is the one wit
24ff0 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65  h the largest ke
25000 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  y - the last.** 
25010 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  key in ascending
25020 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
25030 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68  c int moveToRigh
25040 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
25050 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
25060 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
25070 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
25080 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
25090 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
250a0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
250b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
250c0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
250d0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
250e0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
250f0 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d  _OK && !(pPage =
25100 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
25110 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61  ur->iPage])->lea
25120 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  f ){.    pgno = 
25130 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
25140 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
25150 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
25160 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
25170 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67  r->iPage] = pPag
25180 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63  e->nCell;.    rc
25190 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
251a0 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  Cur, pgno);.  }.
251b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
251c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  _OK ){.    pCur-
251d0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
251e0 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ge] = pPage->nCe
251f0 6c 6c 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e  ll-1;.    pCur->
25200 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
25210 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
25220 67 73 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69  gs &= ~BTCF_Vali
25230 64 4e 4b 65 79 3b 0a 20 20 7d 0a 20 20 72 65 74  dNKey;.  }.  ret
25240 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  urn rc;.}../* Mo
25250 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
25260 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
25270 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
25280 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
25290 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
252a0 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
252b0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
252c0 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
252d0 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
252e0 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
252f0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
25300 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
25310 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28  lite3BtreeFirst(
25320 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
25330 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
25340 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
25350 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
25360 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
25370 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
25380 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
25390 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
253a0 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   );.  rc = moveT
253b0 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
253c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
253d0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
253e0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
253f0 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
25400 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25410 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
25420 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
25430 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d  ->iPage]->nCell=
25440 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  =0 );.      *pRe
25450 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  s = 1;.    }else
25460 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
25470 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
25480 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
25490 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  >0 );.      *pRe
254a0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  s = 0;.      rc 
254b0 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
254c0 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
254d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
254e0 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
254f0 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74  rsor to the last
25500 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
25510 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
25520 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
25530 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
25540 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
25550 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
25560 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
25570 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
25580 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
25590 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
255a0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
255b0 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Last(BtCursor *p
255c0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
255d0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61  .  int rc;. .  a
255e0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
255f0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
25600 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
25610 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
25620 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
25630 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
25640 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c  If the cursor al
25650 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20  ready points to 
25660 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20  the last entry, 
25670 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
25680 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53 4f 52   */.  if( CURSOR
25690 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
256a0 74 61 74 65 20 26 26 20 28 70 43 75 72 2d 3e 63  tate && (pCur->c
256b0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41  urFlags & BTCF_A
256c0 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 23 69 66  tLast)!=0 ){.#if
256d0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
256e0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f  .    /* This blo
256f0 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73 73  ck serves to ass
25700 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20 63  ert() that the c
25710 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65  ursor really doe
25720 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20  s point .    ** 
25730 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
25740 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e  y in the b-tree.
25750 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   */.    int ii;.
25760 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
25770 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69  <pCur->iPage; ii
25780 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
25790 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  t( pCur->aiIdx[i
257a0 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  i]==pCur->apPage
257b0 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  [ii]->nCell );. 
257c0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
257d0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
257e0 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d  r->iPage]==pCur-
257f0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
25800 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b  age]->nCell-1 );
25810 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
25820 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
25830 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a  iPage]->leaf );.
25840 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
25850 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
25860 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ..  rc = moveToR
25870 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
25880 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
25890 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  {.    if( CURSOR
258a0 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
258b0 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
258c0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
258d0 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
258e0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
258f0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
25900 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
25910 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
25920 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
25930 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
25940 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
25950 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
25960 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
25970 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
25980 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
25990 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
259a0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
259b0 20 7c 3d 20 42 54 43 46 5f 41 74 4c 61 73 74 3b   |= BTCF_AtLast;
259c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
259d0 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
259e0 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 41 74  lags &= ~BTCF_At
259f0 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Last;.      }.  
25a00 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65   .    }.  }.  re
25a10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
25a20 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73  ove the cursor s
25a30 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
25a40 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61   to an entry nea
25a50 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70  r the key .** sp
25a60 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78 4b  ecified by pIdxK
25a70 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20  ey or intKey.   
25a80 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73  Return a success
25a90 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   code..**.** For
25aa0 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20   INTKEY tables, 
25ab0 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d  the intKey param
25ac0 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70  eter is used.  p
25ad0 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20  IdxKey .** must 
25ae0 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e  be NULL.  For in
25af0 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78  dex tables, pIdx
25b00 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64 20  Key is used and 
25b10 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e  intKey.** is ign
25b20 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ored..**.** If a
25b30 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73  n exact match is
25b40 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e   not found, then
25b50 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
25b60 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f  lways.** left po
25b70 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66  inting at a leaf
25b80 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c   page which woul
25b90 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79  d hold the entry
25ba0 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70   if it.** were p
25bb0 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72  resent.  The cur
25bc0 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  sor might point 
25bd0 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  to an entry that
25be0 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65   comes.** before
25bf0 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65   or after the ke
25c00 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65  y..**.** An inte
25c10 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69  ger is written i
25c20 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20  nto *pRes which 
25c30 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  is the result of
25c40 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68  .** comparing th
25c50 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 65  e key with the e
25c60 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68  ntry to which th
25c70 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20  e cursor is .** 
25c80 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d  pointing.  The m
25c90 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e  eaning of the in
25ca0 74 65 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e  teger written in
25cb0 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61  to.** *pRes is a
25cc0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
25cd0 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20       *pRes<0    
25ce0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
25cf0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
25d00 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
25d10 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
25d20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68     is smaller th
25d30 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  an intKey/pIdxKe
25d40 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c  y or if the tabl
25d50 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20  e is empty.**   
25d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
25d70 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  nd the cursor is
25d80 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20   therefore left 
25d90 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67  point to nothing
25da0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  ..**.**     *pRe
25db0 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75 72  s==0     The cur
25dc0 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
25dd0 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
25de0 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
25df0 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c            exactl
25e00 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79  y matches intKey
25e10 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20  /pIdxKey..**.** 
25e20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20      *pRes>0     
25e30 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
25e40 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
25e50 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
25e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e70 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e    is larger than
25e80 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e   intKey/pIdxKey.
25e90 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .**.*/.int sqlit
25ea0 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
25eb0 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f  acked(.  BtCurso
25ec0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
25ed0 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
25ee0 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20  to be moved */. 
25ef0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
25f00 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70  *pIdxKey, /* Unp
25f10 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
25f20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c  */.  i64 intKey,
25f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25f40 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a   The table key *
25f50 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68  /.  int biasRigh
25f60 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
25f70 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68  If true, bias th
25f80 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  e search to the 
25f90 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
25fa0 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
25fb0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
25fc0 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68  search results h
25fd0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
25fe0 72 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70  rc;.  RecordComp
25ff0 61 72 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  are xRecordCompa
26000 72 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  re;..  assert( c
26010 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
26020 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
26030 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
26040 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
26050 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
26060 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
26070 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
26080 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75  IdxKey==0)==(pCu
26090 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20  r->pKeyInfo==0) 
260a0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
260b0 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64  cursor is alread
260c0 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20  y positioned at 
260d0 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65  the point we are
260e0 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20   trying.  ** to 
260f0 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75  move to, then ju
26100 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  st return withou
26110 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b  t doing any work
26120 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   */.  if( pCur->
26130 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
26140 41 4c 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63  ALID && (pCur->c
26150 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
26160 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 20  alidNKey)!=0.   
26170 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
26180 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b  0]->intKey .  ){
26190 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
261a0 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79  nfo.nKey==intKey
261b0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
261c0 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
261d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
261e0 20 7d 0a 20 20 20 20 69 66 28 20 28 70 43 75 72   }.    if( (pCur
261f0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
26200 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 26 26 20  F_AtLast)!=0 && 
26210 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c  pCur->info.nKey<
26220 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
26230 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  *pRes = -1;.    
26240 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26250 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OK;.    }.  }.. 
26260 20 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a   if( pIdxKey ){.
26270 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61      xRecordCompa
26280 72 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  re = sqlite3Vdbe
26290 46 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64 78  FindCompare(pIdx
262a0 4b 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b 65  Key);.    pIdxKe
262b0 79 2d 3e 69 73 43 6f 72 72 75 70 74 20 3d 20 30  y->isCorrupt = 0
262c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
262d0 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72  dxKey->default_r
262e0 63 3d 3d 31 20 0a 20 20 20 20 20 20 20 20 20 7c  c==1 .         |
262f0 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75  | pIdxKey->defau
26300 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20 20  lt_rc==0 .      
26310 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64     || pIdxKey->d
26320 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20  efault_rc==-1.  
26330 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    );.  }else{.  
26340 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65    xRecordCompare
26350 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79   = 0; /* All key
26360 73 20 61 72 65 20 69 6e 74 65 67 65 72 73 20 2a  s are integers *
26370 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  /.  }..  rc = mo
26380 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
26390 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
263a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
263b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
263c0 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
263d0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
263e0 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
263f0 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
26400 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
26410 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
26420 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  ge]->isInit );. 
26430 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
26440 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
26450 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 61  VALID || pCur->a
26460 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
26470 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  e]->nCell>0 );. 
26480 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
26490 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
264a0 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  D ){.    *pRes =
264b0 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28   -1;.    assert(
264c0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
264d0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
264e0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
264f0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
26500 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
26510 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
26520 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
26530 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78  ->intKey || pIdx
26540 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29  Key );.  for(;;)
26550 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75  {.    int lwr, u
26560 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20 20 20 20  pr, idx, c;.    
26570 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20  Pgno chldPg;.   
26580 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
26590 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
265a0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
265b0 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20   u8 *pCell;     
265c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265d0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
265e0 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20  to current cell 
265f0 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20  in pPage */..   
26600 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   /* pPage->nCell
26610 20 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72   must be greater
26620 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74   than zero. If t
26630 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d  his is the root-
26640 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  page.    ** the 
26650 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76  cursor would hav
26660 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61  e been INVALID a
26670 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f  bove and this fo
26680 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a  r(;;) loop.    *
26690 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68  * not run. If th
266a0 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f  is is not the ro
266b0 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot-page, then th
266c0 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20  e moveToChild() 
266d0 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77  routine.    ** w
266e0 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
266f0 79 20 64 65 74 65 63 74 65 64 20 64 62 20 63 6f  y detected db co
26700 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61  rruption. Simila
26710 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a  rly, pPage must.
26720 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69      ** be the ri
26730 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20  ght kind (index 
26740 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74  or table) of b-t
26750 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77  ree page. Otherw
26760 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76  ise.    ** a mov
26770 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f  eToChild() or mo
26780 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20  veToRoot() call 
26790 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65 63  would have detec
267a0 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ted corruption. 
267b0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
267c0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
267d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
267e0 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49  age->intKey==(pI
267f0 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20  dxKey==0) );.   
26800 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70   lwr = 0;.    up
26810 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  r = pPage->nCell
26820 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
26830 62 69 61 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20  biasRight==0 || 
26840 62 69 61 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a  biasRight==1 );.
26850 20 20 20 20 69 64 78 20 3d 20 75 70 72 3e 3e 28      idx = upr>>(
26860 31 2d 62 69 61 73 52 69 67 68 74 29 3b 20 2f 2a  1-biasRight); /*
26870 20 69 64 78 20 3d 20 62 69 61 73 52 69 67 68 74   idx = biasRight
26880 20 3f 20 75 70 72 20 3a 20 28 6c 77 72 2b 75 70   ? upr : (lwr+up
26890 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75  r)/2; */.    pCu
268a0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
268b0 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78  Page] = (u16)idx
268c0 3b 0a 20 20 20 20 69 66 28 20 78 52 65 63 6f 72  ;.    if( xRecor
268d0 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20  dCompare==0 ){. 
268e0 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20       for(;;){.  
268f0 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b        i64 nCellK
26900 65 79 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  ey;.        pCel
26910 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
26920 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65  ge, idx) + pPage
26930 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
26940 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
26950 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20  e->hasData ){.  
26960 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 30          while( 0
26970 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b  x80 <= *(pCell++
26980 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
26990 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67   if( pCell>=pPag
269a0 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 20 72 65  e->aDataEnd ) re
269b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
269c0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
269d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
269e0 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e          getVarin
269f0 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26  t(pCell, (u64*)&
26a00 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  nCellKey);.     
26a10 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c     if( nCellKey<
26a20 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
26a30 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b      lwr = idx+1;
26a40 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c  .          if( l
26a50 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d 31  wr>upr ){ c = -1
26a60 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20  ; break; }.     
26a70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65     }else if( nCe
26a80 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a  llKey>intKey ){.
26a90 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20            upr = 
26aa0 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 20  idx-1;.         
26ab0 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20   if( lwr>upr ){ 
26ac0 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d  c = +1; break; }
26ad0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
26ae0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
26af0 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b  ( nCellKey==intK
26b00 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ey );.          
26b10 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
26b20 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  = BTCF_ValidNKey
26b30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
26b40 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43  ->info.nKey = nC
26b50 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  ellKey;.        
26b60 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
26b70 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
26b80 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  6)idx;.         
26b90 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
26ba0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  f ){.           
26bb0 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20   lwr = idx;.    
26bc0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
26bd0 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a  eto_next_layer;.
26be0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
26bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 52  .            *pR
26c00 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
26c10 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26c20 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  OK;.            
26c30 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
26c40 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
26c50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26c60 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70    assert( lwr+up
26c70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r>=0 );.        
26c80 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e  idx = (lwr+upr)>
26c90 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c  >1;  /* idx = (l
26ca0 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20  wr+upr)/2; */.  
26cb0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
26cc0 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a  .      for(;;){.
26cd0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c          int nCel
26ce0 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  l;.        pCell
26cf0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
26d00 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65 2d  e, idx) + pPage-
26d10 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 0a  >childPtrSize;..
26d20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
26d30 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64  aximum supported
26d40 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35   page-size is 65
26d50 35 33 36 20 62 79 74 65 73 2e 20 54 68 69 73 20  536 bytes. This 
26d60 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20  means that.     
26d70 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75     ** the maximu
26d80 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  m number of reco
26d90 72 64 20 62 79 74 65 73 20 73 74 6f 72 65 64 20  rd bytes stored 
26da0 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72  on an index B-Tr
26db0 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ee.        ** pa
26dc0 67 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ge is less than 
26dd0 31 36 33 38 34 20 62 79 74 65 73 20 61 6e 64 20  16384 bytes and 
26de0 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73  may be stored as
26df0 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20   a 2-byte.      
26e00 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69    ** varint. Thi
26e10 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
26e20 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74   used to attempt
26e30 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e   to avoid parsin
26e40 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  g .        ** th
26e50 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79  e entire cell by
26e60 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68   checking for th
26e70 65 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68  e cases where th
26e80 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20  e record is .   
26e90 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65       ** stored e
26ea0 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74  ntirely within t
26eb0 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 62  he b-tree page b
26ec0 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65  y inspecting the
26ed0 20 66 69 72 73 74 20 0a 20 20 20 20 20 20 20 20   first .        
26ee0 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74 68  ** 2 bytes of th
26ef0 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20  e cell..        
26f00 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  */.        nCell
26f10 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20   = pCell[0];.   
26f20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d       if( nCell<=
26f30 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50  pPage->max1byteP
26f40 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20  ayload ){.      
26f50 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
26f60 63 68 20 72 75 6e 73 20 69 66 20 74 68 65 20 72  ch runs if the r
26f70 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64  ecord-size field
26f80 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20   of the cell is 
26f90 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  a.          ** s
26fa0 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e  ingle byte varin
26fb0 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64  t and the record
26fc0 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f   fits entirely o
26fd0 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20  n the main.     
26fe0 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70       ** b-tree p
26ff0 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
27000 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65     testcase( pCe
27010 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67  ll+nCell+1==pPag
27020 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20  e->aDataEnd );. 
27030 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65           c = xRe
27040 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
27050 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c  l, (void*)&pCell
27060 5b 31 5d 2c 20 70 49 64 78 4b 65 79 2c 20 30 29  [1], pIdxKey, 0)
27070 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
27080 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26  if( !(pCell[1] &
27090 20 30 78 38 30 29 20 0a 20 20 20 20 20 20 20 20   0x80) .        
270a0 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28    && (nCell = ((
270b0 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20  nCell&0x7f)<<7) 
270c0 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61  + pCell[1])<=pPa
270d0 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20  ge->maxLocal.   
270e0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
270f0 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d    /* The record-
27100 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20  size field is a 
27110 32 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e  2 byte varint an
27120 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20  d the record .  
27130 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20          ** fits 
27140 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20  entirely on the 
27150 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65  main b-tree page
27160 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
27170 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b  testcase( pCell+
27180 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e  nCell+2==pPage->
27190 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20  aDataEnd );.    
271a0 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72        c = xRecor
271b0 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20  dCompare(nCell, 
271c0 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d  (void*)&pCell[2]
271d0 2c 20 70 49 64 78 4b 65 79 2c 20 30 29 3b 0a 20  , pIdxKey, 0);. 
271e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
271f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
27200 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72  ecord flows over
27210 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72   onto one or mor
27220 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
27230 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  . In.          *
27240 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  * this case the 
27250 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73  whole cell needs
27260 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61   to be parsed, a
27270 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
27280 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  d.          ** a
27290 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nd accessPayload
272a0 28 29 20 75 73 65 64 20 74 6f 20 72 65 74 72 69  () used to retri
272b0 65 76 65 20 74 68 65 20 72 65 63 6f 72 64 20 69  eve the record i
272c0 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
272d0 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f    ** buffer befo
272e0 72 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  re VdbeRecordCom
272f0 70 61 72 65 28 29 20 63 61 6e 20 62 65 20 63 61  pare() can be ca
27300 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  lled. */.       
27310 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65     void *pCellKe
27320 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  y;.          u8 
27330 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64  * const pCellBod
27340 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67  y = pCell - pPag
27350 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
27360 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65  .          btree
27370 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
27380 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26  ge, pCellBody, &
27390 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20  pCur->info);.   
273a0 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28         nCell = (
273b0 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  int)pCur->info.n
273c0 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Key;.          p
273d0 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
273e0 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20 29  3Malloc( nCell )
273f0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
27400 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20  pCellKey==0 ){. 
27410 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
27420 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
27430 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
27440 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
27450 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27460 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
27470 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
27480 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
27490 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
274a0 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e  yload(pCur, 0, n
274b0 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20  Cell, (unsigned 
274c0 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20  char*)pCellKey, 
274d0 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  2);.          if
274e0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
274f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
27500 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
27510 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
27520 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
27530 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27540 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
27550 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c  pare(nCell, pCel
27560 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 2c 20 30  lKey, pIdxKey, 0
27570 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
27580 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
27590 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ey);.        }. 
275a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
275b0 49 64 78 4b 65 79 2d 3e 69 73 43 6f 72 72 75 70  IdxKey->isCorrup
275c0 74 3d 3d 30 20 7c 7c 20 63 3d 3d 30 20 29 3b 0a  t==0 || c==0 );.
275d0 20 20 20 20 20 20 20 20 69 66 28 20 63 3c 30 20          if( c<0 
275e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72  ){.          lwr
275f0 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20   = idx+1;.      
27600 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 30 20    }else if( c>0 
27610 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72  ){.          upr
27620 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20   = idx-1;.      
27630 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27640 20 20 20 61 73 73 65 72 74 28 20 63 3d 3d 30 20     assert( c==0 
27650 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52  );.          *pR
27660 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
27670 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
27680 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
27690 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
276a0 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b  age] = (u16)idx;
276b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
276c0 49 64 78 4b 65 79 2d 3e 69 73 43 6f 72 72 75 70  IdxKey->isCorrup
276d0 74 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  t ) rc = SQLITE_
276e0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20  CORRUPT;.       
276f0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
27700 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d  inish;.        }
27710 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72  .        if( lwr
27720 3e 75 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  >upr ) break;.  
27730 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77        assert( lw
27740 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20  r+upr>=0 );.    
27750 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75      idx = (lwr+u
27760 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20  pr)>>1;  /* idx 
27770 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a 2f  = (lwr+upr)/2 */
27780 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
27790 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d     assert( lwr==
277a0 75 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d  upr+1 || (pPage-
277b0 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67  >intKey && !pPag
277c0 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20 20  e->leaf) );.    
277d0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
277e0 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28  sInit );.    if(
277f0 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
27800 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
27810 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
27820 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
27830 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
27840 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20  ->nCell );.     
27850 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
27860 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
27870 29 69 64 78 3b 0a 20 20 20 20 20 20 2a 70 52 65  )idx;.      *pRe
27880 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20  s = c;.      rc 
27890 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
278a0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
278b0 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76  inish;.    }.mov
278c0 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a 0a  eto_next_layer:.
278d0 20 20 20 20 69 66 28 20 6c 77 72 3e 3d 70 50 61      if( lwr>=pPa
278e0 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
278f0 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34     chldPg = get4
27900 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
27910 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
27920 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c  set+8]);.    }el
27930 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67  se{.      chldPg
27940 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64   = get4byte(find
27950 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29  Cell(pPage, lwr)
27960 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  );.    }.    pCu
27970 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
27980 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77 72  Page] = (u16)lwr
27990 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
279a0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c  oChild(pCur, chl
279b0 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  dPg);.    if( rc
279c0 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f   ) break;.  }.mo
279d0 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 70  veto_finish:.  p
279e0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
279f0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
27a00 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
27a10 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
27a20 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 72 65 74  alidOvfl);.  ret
27a30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
27a40 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
27a50 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
27a60 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ot pointing at a
27a70 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74  n entry of the t
27a80 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45  able..**.** TRUE
27a90 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
27aa0 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  d after a call t
27ab0 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  o sqlite3BtreeNe
27ac0 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61  xt() moves.** pa
27ad0 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  st the last entr
27ae0 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f  y in the table o
27af0 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  r sqlite3BtreePr
27b00 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a  ev() moves past.
27b10 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  ** the first ent
27b20 72 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73  ry.  TRUE is als
27b30 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  o returned if th
27b40 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
27b50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
27b60 42 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f  BtreeEof(BtCurso
27b70 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54  r *pCur){.  /* T
27b80 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65  ODO: What if the
27b90 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55   cursor is in CU
27ba0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
27bb0 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65   but all table e
27bc0 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65  ntries.  ** have
27bd0 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54   been deleted? T
27be0 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65  his API will nee
27bf0 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72  d to change to r
27c00 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
27c10 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c  ode.  ** as well
27c20 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20   as the boolean 
27c30 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20  result value..  
27c40 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52  */.  return (CUR
27c50 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d  SOR_VALID!=pCur-
27c60 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a  >eState);.}../*.
27c70 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63  ** Advance the c
27c80 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  ursor to the nex
27c90 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
27ca0 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20  atabase.  If.** 
27cb0 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20  successful then 
27cc0 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66  set *pRes=0.  If
27cd0 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
27ce0 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  as already point
27cf0 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20  ing to the last 
27d00 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
27d10 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20  abase before.** 
27d20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
27d30 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65   called, then se
27d40 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a  t *pRes=1..**.**
27d50 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
27d60 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a  ction will set *
27d70 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20  pRes to 0 or 1. 
27d80 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52   The initial *pR
27d90 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c  es value.** will
27da0 20 62 65 20 31 20 69 66 20 74 68 65 20 63 75 72   be 1 if the cur
27db0 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70 65  sor being steppe
27dc0 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  d corresponds to
27dd0 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e   an SQL index an
27de0 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75  d.** if this rou
27df0 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20  tine could have 
27e00 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20  been skipped if 
27e10 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68  that SQL index h
27e20 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69  ad been.** a uni
27e30 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65  que index.  Othe
27e40 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72  rwise the caller
27e50 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a   will have set *
27e60 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a  pRes to zero..**
27e70 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d   Zero is the com
27e80 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74  mon case. The bt
27e90 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ree implementati
27ea0 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75 73  on is free to us
27eb0 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c  e the.** initial
27ec0 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73 20   *pRes value as 
27ed0 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76  a hint to improv
27ee0 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62  e performance, b
27ef0 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  ut the current.*
27f00 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65 20 69  * SQLite btree i
27f10 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f  mplementation do
27f20 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68  es not. (Note th
27f30 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74  at the comdb2 bt
27f40 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  ree.** implement
27f50 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74  ation does use t
27f60 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65  his hint, howeve
27f70 72 2e 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  r.).*/.int sqlit
27f80 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75  e3BtreeNext(BtCu
27f90 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
27fa0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
27fb0 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d  ;.  int idx;.  M
27fc0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
27fd0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
27fe0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
27ff0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
28000 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  es!=0 );.  asser
28010 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a  t( *pRes==0 || *
28020 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73  pRes==1 );.  ass
28030 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
28040 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
28050 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
28060 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70 43  ALID );.  if( pC
28070 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
28080 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
28090 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
280a0 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20  owCache(pCur);. 
280b0 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43     rc = restoreC
280c0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
280d0 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ur);.    if( rc!
280e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
280f0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
28100 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
28110 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55      }.    if( CU
28120 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
28130 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
28140 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
28150 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
28160 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
28170 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
28180 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ext ){.      ass
28190 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
281a0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
281b0 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
281c0 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54  =CURSOR_SKIPNEXT
281d0 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   );.      pCur->
281e0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
281f0 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28  VALID;.      if(
28200 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e   pCur->skipNext>
28210 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
28220 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
28230 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
28240 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
28250 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
28260 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72      }.      pCur
28270 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
28280 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
28290 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
282a0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
282b0 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e    idx = ++pCur->
282c0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
282d0 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e];.  assert( pP
282e0 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a  age->isInit );..
282f0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
28300 62 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72  base file is cor
28310 72 75 70 74 2c 20 69 74 20 69 73 20 70 6f 73 73  rupt, it is poss
28320 69 62 6c 65 20 66 6f 72 20 74 68 65 20 76 61 6c  ible for the val
28330 75 65 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20  ue of idx .  ** 
28340 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 20 68 65  to be invalid he
28350 72 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  re. This can onl
28360 79 20 6f 63 63 75 72 20 69 66 20 61 20 73 65 63  y occur if a sec
28370 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64 69 66  ond cursor modif
28380 69 65 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  ies.  ** the pag
28390 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72 20 70  e while cursor p
283a0 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  Cur is holding a
283b0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74   reference to it
283c0 2e 20 57 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a  . Which can.  **
283d0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
283e0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
283f0 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63 68 20  corrupt in such 
28400 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b  a way as to link
28410 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69   the.  ** page i
28420 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  nto more than on
28430 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  e b-tree structu
28440 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  re. */.  testcas
28450 65 28 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43  e( idx>pPage->nC
28460 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e  ell );..  pCur->
28470 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
28480 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
28490 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
284a0 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
284b0 76 66 6c 29 3b 0a 20 20 69 66 28 20 69 64 78 3e  vfl);.  if( idx>
284c0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
284d0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
284e0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
284f0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
28500 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26  pCur, get4byte(&
28510 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
28520 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
28530 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
28540 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65   ){.        *pRe
28550 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  s = 0;.        r
28560 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
28570 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  }.      rc = mov
28580 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
28590 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
285a0 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
285b0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64   rc;.    }.    d
285c0 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  o{.      if( pCu
285d0 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  r->iPage==0 ){. 
285e0 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
285f0 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
28600 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
28610 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
28620 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28630 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
28640 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43   moveToParent(pC
28650 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ur);.      pPage
28660 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
28670 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
28680 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e    }while( pCur->
28690 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
286a0 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  e]>=pPage->nCell
286b0 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   );.    *pRes = 
286c0 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  0;.    if( pPage
286d0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
286e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
286f0 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52  reeNext(pCur, pR
28700 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
28710 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
28720 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
28730 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
28740 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66   *pRes = 0;.  if
28750 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
28760 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
28770 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20  TE_OK;.  }.  rc 
28780 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
28790 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
287a0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53   rc;.}.../*.** S
287b0 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74  tep the cursor t
287c0 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68  o the back to th
287d0 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  e previous entry
287e0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
287f0 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
28800 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
28810 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
28820 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
28830 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
28840 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
28850 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
28860 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72  before.** this r
28870 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
28880 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  d, then set *pRe
28890 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  s=1..**.** The c
288a0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
288b0 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74  will set *pRes t
288c0 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69  o 0 or 1.  The i
288d0 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c  nitial *pRes val
288e0 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20  ue.** will be 1 
288f0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 62 65  if the cursor be
28900 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72 72  ing stepped corr
28910 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51  esponds to an SQ
28920 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69  L index and.** i
28930 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  f this routine c
28940 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73  ould have been s
28950 6b 69 70 70 65 64 20 69 66 20 74 68 61 74 20 53  kipped if that S
28960 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65 65  QL index had bee
28970 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e  n.** a unique in
28980 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20  dex.  Otherwise 
28990 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
289a0 68 61 76 65 20 73 65 74 20 2a 70 52 65 73 20 74  have set *pRes t
289b0 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20  o zero..** Zero 
289c0 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  is the common ca
289d0 73 65 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d  se. The btree im
289e0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20  plementation is 
289f0 66 72 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a  free to use the.
28a00 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73  ** initial *pRes
28a10 20 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74   value as a hint
28a20 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66   to improve perf
28a30 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65  ormance, but the
28a40 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69   current.** SQLi
28a50 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65  te btree impleme
28a60 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ntation does not
28a70 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65  . (Note that the
28a80 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a   comdb2 btree.**
28a90 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
28aa0 64 6f 65 73 20 75 73 65 20 74 68 69 73 20 68 69  does use this hi
28ab0 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f  nt, however.).*/
28ac0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
28ad0 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
28ae0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
28af0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
28b00 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
28b10 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
28b20 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
28b30 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
28b40 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73   pRes!=0 );.  as
28b50 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c  sert( *pRes==0 |
28b60 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20  | *pRes==1 );.  
28b70 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
28b80 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75  ipNext==0 || pCu
28b90 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
28ba0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 43 75  R_VALID );.  pCu
28bb0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
28bc0 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
28bd0 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20  F_ValidOvfl);.  
28be0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
28bf0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
28c00 7b 0a 20 20 20 20 69 66 28 20 41 4c 57 41 59 53  {.    if( ALWAYS
28c10 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43  (pCur->eState>=C
28c20 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
28c30 4b 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  K) ){.      rc =
28c40 20 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72   btreeRestoreCur
28c50 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
28c60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
28c70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28c80 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
28c90 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
28ca0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
28cb0 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  }.    if( CURSOR
28cc0 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
28cd0 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
28ce0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
28cf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28d00 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
28d10 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
28d20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
28d30 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
28d40 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
28d50 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
28d60 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a  SOR_SKIPNEXT );.
28d70 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
28d80 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
28d90 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  D;.      if( pCu
28da0 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b  r->skipNext<0 ){
28db0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73  .        pCur->s
28dc0 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
28dd0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
28de0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
28df0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
28e00 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b  }.      pCur->sk
28e10 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
28e20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d  }.  }..  pPage =
28e30 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
28e40 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
28e50 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
28e60 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50  nit );.  if( !pP
28e70 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
28e80 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d   int idx = pCur-
28e90 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
28ea0 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ge];.    rc = mo
28eb0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
28ec0 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
28ed0 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b  l(pPage, idx)));
28ee0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
28ef0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
28f00 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
28f10 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
28f20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
28f30 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCur);.  }else{.
28f40 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d      while( pCur-
28f50 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
28f60 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ge]==0 ){.      
28f70 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
28f80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  =0 ){.        pC
28f90 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
28fa0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
28fb0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
28fc0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
28fd0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
28fe0 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61  }.      moveToPa
28ff0 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
29000 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  }.    pCur->info
29010 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
29020 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
29030 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
29040 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
29050 6c 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61  l);..    pCur->a
29060 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
29070 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d  ]--;.    pPage =
29080 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
29090 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
290a0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
290b0 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
290c0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
290d0 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
290e0 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29  ious(pCur, pRes)
290f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
29100 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
29110 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  K;.    }.  }.  *
29120 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74 75  pRes = 0;.  retu
29130 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
29140 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
29150 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
29160 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
29170 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69  * The new page i
29180 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  s marked as dirt
29190 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f  y.  (In other wo
291a0 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65  rds, sqlite3Page
291b0 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20  rWrite().** has 
291c0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
291d0 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  led on the new p
291e0 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70  age.)  The new p
291f0 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20  age has also.** 
29200 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20  been referenced 
29210 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  and the calling 
29220 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f  routine is respo
29230 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69  nsible for calli
29240 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  ng.** sqlite3Pag
29250 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65  erUnref() on the
29260 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69   new page when i
29270 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  t is done..**.**
29280 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
29290 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
292a0 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65  s.  Any other re
292b0 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63  turn value indic
292c0 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  ates.** an error
292d0 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a  .  *ppPage and *
292e0 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69  pPgno are undefi
292f0 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  ned in the event
29300 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a   of an error..**
29310 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73   Do not invoke s
29320 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
29330 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66  () on *ppPage if
29340 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   an error is ret
29350 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
29360 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72  the "nearby" par
29370 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c  ameter is not 0,
29380 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72 74 20   then an effort 
29390 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c  is made to .** l
293a0 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f  ocate a page clo
293b0 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e  se to the page n
293c0 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20  umber "nearby". 
293d0 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
293e0 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d  d in an.** attem
293f0 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74  pt to keep relat
29400 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74  ed pages close t
29410 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20  o each other in 
29420 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
29430 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74  e,.** which in t
29440 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74  urn can make dat
29450 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73  abase access fas
29460 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ter..**.** If th
29470 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65 74 65  e eMode paramete
29480 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41  r is BTALLOC_EXA
29490 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61 72 62  CT and the nearb
294a0 79 20 70 61 67 65 20 65 78 69 73 74 73 0a 2a 2a  y page exists.**
294b0 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65   anywhere on the
294c0 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
294d0 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
294e0 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  d to be returned
294f0 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69  .  If.** eMode i
29500 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65  s BTALLOC_LT the
29510 6e 20 74 68 65 20 70 61 67 65 20 72 65 74 75 72  n the page retur
29520 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65 73 73  ned will be less
29530 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
29540 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66 20 61  * to nearby if a
29550 6e 79 20 73 75 63 68 20 70 61 67 65 20 65 78 69  ny such page exi
29560 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65 20 69  sts.  If eMode i
29570 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68  s BTALLOC_ANY th
29580 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  en there.** are 
29590 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  no restrictions 
295a0 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20 69 73  on which page is
295b0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
295c0 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
295d0 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74  eBtreePage(.  Bt
295e0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
295f0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
29600 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
29610 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 2f 2a  *ppPage,      /*
29620 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72 20 74   Store pointer t
29630 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  o the allocated 
29640 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 50  page here */.  P
29650 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20  gno *pPgno,     
29660 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74        /* Store t
29670 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 68  he page number h
29680 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65  ere */.  Pgno ne
29690 61 72 62 79 2c 20 20 20 20 20 20 20 20 20 20 20  arby,           
296a0 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20  /* Search for a 
296b0 70 61 67 65 20 6e 65 61 72 20 74 68 69 73 20 6f  page near this o
296c0 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65  ne */.  u8 eMode
296d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
296e0 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c  * BTALLOC_EXACT,
296f0 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20   BTALLOC_LT, or 
29700 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29  BTALLOC_ANY */.)
29710 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
29720 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ge1;.  int rc;. 
29730 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e   u32 n;     /* N
29740 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
29750 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  n the freelist *
29760 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f  /.  u32 k;     /
29770 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76  * Number of leav
29780 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  es on the trunk 
29790 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
297a0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  */.  MemPage *pT
297b0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  runk = 0;.  MemP
297c0 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20  age *pPrevTrunk 
297d0 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61  = 0;.  Pgno mxPa
297e0 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  ge;     /* Total
297f0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
29800 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
29810 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
29820 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
29830 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
29840 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  ert( eMode==BTAL
29850 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72  LOC_ANY || (near
29860 62 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f 6d 69  by>0 && IfNotOmi
29870 74 41 56 28 70 42 74 2d 3e 61 75 74 6f 56 61 63  tAV(pBt->autoVac
29880 75 75 6d 29 29 20 29 3b 0a 20 20 70 50 61 67 65  uum)) );.  pPage
29890 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
298a0 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74 72 65  .  mxPage = btre
298b0 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
298c0 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28  .  n = get4byte(
298d0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
298e0 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  6]);.  testcase(
298f0 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a   n==mxPage-1 );.
29900 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20    if( n>=mxPage 
29910 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
29920 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
29930 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30  T;.  }.  if( n>0
29940 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
29950 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68   are pages on th
29960 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75  e freelist.  Reu
29970 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  se one of those 
29980 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67  pages. */.    Pg
29990 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75  no iTrunk;.    u
299a0 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30  8 searchList = 0
299b0 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65  ; /* If the free
299c0 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65  -list must be se
299d0 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72  arched for 'near
299e0 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20  by' */.    .    
299f0 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41  /* If eMode==BTA
29a00 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 61  LLOC_EXACT and a
29a10 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f   query of the po
29a20 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a  inter-map.    **
29a30 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65 20   shows that the 
29a40 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73  page 'nearby' is
29a50 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68   somewhere on th
29a60 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
29a70 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74  n.    ** the ent
29a80 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65  ire-list will be
29a90 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
29aa0 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  at page..    */.
29ab0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
29ac0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
29ad0 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54     if( eMode==BT
29ae0 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20  ALLOC_EXACT ){. 
29af0 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3c       if( nearby<
29b00 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20  =mxPage ){.     
29b10 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
29b20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 61       assert( nea
29b30 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  rby>0 );.       
29b40 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
29b50 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20  toVacuum );.    
29b60 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
29b70 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20  et(pBt, nearby, 
29b80 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20  &eType, 0);.    
29b90 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
29ba0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
29bb0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
29bc0 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
29bd0 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
29be0 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  st = 1;.        
29bf0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
29c00 6c 73 65 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42  lse if( eMode==B
29c10 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20  TALLOC_LE ){.   
29c20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
29c30 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  1;.    }.#endif.
29c40 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
29c50 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  t the free-list 
29c60 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20  count by 1. Set 
29c70 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e  iTrunk to the in
29c80 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  dex of the.    *
29c90 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73  * first free-lis
29ca0 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50  t trunk page. iP
29cb0 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74  revTrunk is init
29cc0 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a  ially 1..    */.
29cd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
29ce0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
29cf0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
29d00 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
29d10 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74   rc;.    put4byt
29d20 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
29d30 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20  [36], n-1);..   
29d40 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74   /* The code wit
29d50 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73  hin this loop is
29d60 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69   run only once i
29d70 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69 73  f the 'searchLis
29d80 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  t' variable.    
29d90 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20  ** is not true. 
29da0 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 75  Otherwise, it ru
29db0 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ns once for each
29dc0 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74   trunk-page on t
29dd0 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c  he.    ** free-l
29de0 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61  ist until the pa
29df0 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c  ge 'nearby' is l
29e00 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42  ocated (eMode==B
29e10 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20  TALLOC_EXACT).  
29e20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20    ** or until a 
29e30 70 61 67 65 20 6c 65 73 73 20 74 68 61 6e 20 27  page less than '
29e40 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74  nearby' is locat
29e50 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  ed (eMode==BTALL
29e60 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20  OC_LT).    */.  
29e70 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72    do {.      pPr
29e80 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b  evTrunk = pTrunk
29e90 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65  ;.      if( pPre
29ea0 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
29eb0 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
29ec0 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  yte(&pPrevTrunk-
29ed0 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20  >aData[0]);.    
29ee0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29ef0 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
29f00 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
29f10 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  a[32]);.      }.
29f20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
29f30 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29  iTrunk==mxPage )
29f40 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 72 75  ;.      if( iTru
29f50 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  nk>mxPage ){.   
29f60 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
29f70 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
29f80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
29f90 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
29fa0 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e  tPage(pBt, iTrun
29fb0 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a  k, &pTrunk, 0);.
29fc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
29fd0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
29fe0 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
29ff0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2a000 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
2a010 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
2a020 28 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a 20  ( pTrunk!=0 );. 
2a030 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
2a040 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29 3b  unk->aData!=0 );
2a050 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34  ..      k = get4
2a060 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
2a070 61 74 61 5b 34 5d 29 3b 20 2f 2a 20 23 20 6f 66  ata[4]); /* # of
2a080 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 69 73 20   leaves on this 
2a090 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20  trunk page */.  
2a0a0 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20      if( k==0 && 
2a0b0 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20  !searchList ){. 
2a0c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
2a0d0 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65  unk has no leave
2a0e0 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69  s and the list i
2a0f0 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72  s not being sear
2a100 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a  ched. .        *
2a110 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65  * So extract the
2a120 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65   trunk page itse
2a130 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73  lf and use it as
2a140 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20   the newly .    
2a150 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64      ** allocated
2a160 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
2a170 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72   assert( pPrevTr
2a180 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk==0 );.      
2a190 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2a1a0 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
2a1b0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2a1c0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2a1d0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2a1e0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2a1f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a200 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b   *pPgno = iTrunk
2a210 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
2a220 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2a230 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
2a240 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
2a250 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
2a260 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  runk;.        pT
2a270 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
2a280 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
2a290 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
2a2a0 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
2a2b0 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
2a2c0 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  1));.      }else
2a2d0 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74   if( k>(u32)(pBt
2a2e0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
2a2f0 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   2) ){.        /
2a300 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20  * Value of k is 
2a310 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44  out of range.  D
2a320 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
2a330 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  on */.        rc
2a340 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2a350 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
2a360 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2a370 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20  e_page;.#ifndef 
2a380 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2a390 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c  VACUUM.      }el
2a3a0 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69 73  se if( searchLis
2a3b0 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  t .            &
2a3c0 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e  & (nearby==iTrun
2a3d0 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65 61  k || (iTrunk<nea
2a3e0 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54  rby && eMode==BT
2a3f0 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20  ALLOC_LE)) .    
2a400 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20    ){.        /* 
2a410 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e  The list is bein
2a420 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20 74  g searched and t
2a430 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69  his trunk page i
2a440 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  s the page.     
2a450 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74     ** to allocat
2a460 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  e, regardless of
2a470 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73 20   whether it has 
2a480 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20  leaves..        
2a490 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e  */.        *pPgn
2a4a0 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  o = iTrunk;.    
2a4b0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
2a4c0 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65  runk;.        se
2a4d0 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20  archList = 0;.  
2a4e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2a4f0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
2a500 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2a510 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
2a520 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
2a530 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2a540 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
2a550 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b       if( k==0 ){
2a560 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
2a570 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
2a580 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
2a590 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2a5a0 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
2a5b0 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
2a5c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2a5d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2a5e0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2a5f0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50  pPrevTrunk->pDbP
2a600 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2a610 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2a620 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2a630 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2a640 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2a650 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a660 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
2a670 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
2a680 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
2a690 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
2a6a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a6b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2a6c0 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61   /* The trunk pa
2a6d0 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62  ge is required b
2a6e0 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74  y the caller but
2a6f0 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20   it contains .  
2a700 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74          ** point
2a710 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74  ers to free-list
2a720 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69 72   leaves. The fir
2a730 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20  st leaf becomes 
2a740 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20  a trunk.        
2a750 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69    ** page in thi
2a760 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20  s case..        
2a770 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d    */.          M
2a780 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e  emPage *pNewTrun
2a790 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e  k;.          Pgn
2a7a0 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65  o iNewTrunk = ge
2a7b0 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
2a7c0 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20  aData[8]);.     
2a7d0 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72 75       if( iNewTru
2a7e0 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20 20  nk>mxPage ){ .  
2a7f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2a800 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2a810 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
2a820 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2a830 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2a840 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65    }.          te
2a850 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e  stcase( iNewTrun
2a860 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  k==mxPage );.   
2a870 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
2a880 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4e  eGetPage(pBt, iN
2a890 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72  ewTrunk, &pNewTr
2a8a0 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  unk, 0);.       
2a8b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2a8c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2a8d0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2a8e0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
2a8f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a900 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2a910 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75  gerWrite(pNewTru
2a920 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
2a930 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2a940 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a950 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
2a960 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
2a970 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2a980 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2a990 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
2a9a0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
2a9b0 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
2a9c0 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
2a9d0 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
2a9e0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
2a9f0 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  e(&pNewTrunk->aD
2aa00 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
2aa10 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2aa20 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
2aa30 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [8], &pTrunk->aD
2aa40 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34  ata[12], (k-1)*4
2aa50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  );.          rel
2aa60 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
2aa70 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nk);.          i
2aa80 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
2aa90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
2aaa0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2aab0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2aac0 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29  age1->pDbPage) )
2aad0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ;.            pu
2aae0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
2aaf0 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54  aData[32], iNewT
2ab00 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
2ab10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2ab20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2ab30 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76  PagerWrite(pPrev
2ab40 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
2ab50 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2ab60 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
2ab70 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2ab80 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2ab90 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2aba0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
2abb0 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
2abc0 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  ta[0], iNewTrunk
2abd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2abe0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2abf0 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
2ac00 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
2ac10 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
2ac20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
2ac30 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
2ac40 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20   n-1));.#endif. 
2ac50 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b       }else if( k
2ac60 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  >0 ){.        /*
2ac70 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20   Extract a leaf 
2ac80 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a  from the trunk *
2ac90 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6c  /.        u32 cl
2aca0 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50  osest;.        P
2acb0 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20  gno iPage;.     
2acc0 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
2acd0 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b   *aData = pTrunk
2ace0 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20  ->aData;.       
2acf0 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b   if( nearby>0 ){
2ad00 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 69  .          u32 i
2ad10 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  ;.          clos
2ad20 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
2ad30 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54     if( eMode==BT
2ad40 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20  ALLOC_LE ){.    
2ad50 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2ad60 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
2ad70 20 20 20 20 20 20 20 20 20 20 69 50 61 67 65 20            iPage 
2ad80 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
2ad90 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20  a[8+i*4]);.     
2ada0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61           if( iPa
2adb0 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20  ge<=nearby ){.  
2adc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c                cl
2add0 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20  osest = i;.     
2ade0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2adf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2ae00 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
2ae10 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2ae20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
2ae30 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20   dist;.         
2ae40 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74 65     dist = sqlite
2ae50 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79  3AbsInt32(get4by
2ae60 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20  te(&aData[8]) - 
2ae70 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20  nearby);.       
2ae80 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
2ae90 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
2aea0 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20         int d2 = 
2aeb0 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28  sqlite3AbsInt32(
2aec0 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
2aed0 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79  8+i*4]) - nearby
2aee0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2aef0 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a   if( d2<dist ){.
2af00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af10 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20  closest = i;.   
2af20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
2af30 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20  t = d2;.        
2af40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2af50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2af60 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
2af70 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
2af80 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
2af90 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65  }..        iPage
2afa0 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
2afb0 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29  ta[8+closest*4])
2afc0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
2afd0 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67  se( iPage==mxPag
2afe0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
2aff0 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b   iPage>mxPage ){
2b000 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2b010 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2b020 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  KPT;.          g
2b030 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2b040 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
2b050 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
2b060 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65  e( iPage==mxPage
2b070 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2b080 21 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20  !searchList .   
2b090 20 20 20 20 20 20 7c 7c 20 28 69 50 61 67 65 3d        || (iPage=
2b0a0 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69 50 61 67  =nearby || (iPag
2b0b0 65 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64  e<nearby && eMod
2b0c0 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20  e==BTALLOC_LE)) 
2b0d0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
2b0e0 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74        int noCont
2b0f0 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2a  ent;.          *
2b100 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20  pPgno = iPage;. 
2b110 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28           TRACE((
2b120 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61  "ALLOCATE: %d wa
2b130 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20  s leaf %d of %d 
2b140 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20  on trunk %d".   
2b150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3a                ":
2b160 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61   %d more free pa
2b170 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ges\n",.        
2b180 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c           *pPgno,
2b190 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70   closest+1, k, p
2b1a0 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31  Trunk->pgno, n-1
2b1b0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ));.          rc
2b1c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2b1d0 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
2b1e0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2b1f0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
2b200 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2b210 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2b220 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20  closest<k-1 ){. 
2b230 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
2b240 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  y(&aData[8+close
2b250 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b  st*4], &aData[4+
2b260 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  k*4], 4);.      
2b270 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2b280 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  put4byte(&aData[
2b290 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
2b2a0 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20      noContent = 
2b2b0 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74  !btreeGetHasCont
2b2c0 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29  ent(pBt, *pPgno)
2b2d0 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43   ? PAGER_GET_NOC
2b2e0 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20 20 20 20  ONTENT : 0;.    
2b2f0 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
2b300 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50  GetPage(pBt, *pP
2b310 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43  gno, ppPage, noC
2b320 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  ontent);.       
2b330 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2b340 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2b350 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b360 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
2b370 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
2b380 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2b390 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2b3a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
2b3b0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
2b3c0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
2b3d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2b3e0 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c           searchL
2b3f0 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
2b400 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2b410 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
2b420 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  evTrunk);.      
2b430 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
2b440 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72      }while( sear
2b450 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73  chList );.  }els
2b460 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  e{.    /* There 
2b470 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20  are no pages on 
2b480 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f  the freelist, so
2b490 20 61 70 70 65 6e 64 20 61 20 6e 65 77 20 70 61   append a new pa
2b4a0 67 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  ge to the.    **
2b4b0 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e   database image.
2b4c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
2b4d0 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67  ormally, new pag
2b4e0 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  es allocated by 
2b4f0 74 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62  this block can b
2b500 65 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d  e requested from
2b510 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
2b520 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65  r layer with the
2b530 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c   'no-content' fl
2b540 61 67 20 73 65 74 2e 20 54 68 69 73 20 70 72 65  ag set. This pre
2b550 76 65 6e 74 73 20 74 68 65 20 70 61 67 65 72 0a  vents the pager.
2b560 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69      ** from tryi
2b570 6e 67 20 74 6f 20 72 65 61 64 20 74 68 65 20 70  ng to read the p
2b580 61 67 65 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f  ages content fro
2b590 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c  m disk. However,
2b5a0 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   if the.    ** c
2b5b0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
2b5c0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 72  on has already r
2b5d0 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69  un one or more i
2b5e0 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
2b5f0 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70 73 2c 20  m.    ** steps, 
2b600 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 77 65  then the page we
2b610 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 61 6c   are about to al
2b620 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e 74 61  locate may conta
2b630 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a  in content.    *
2b640 2a 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  * that is requir
2b650 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  ed in the event 
2b660 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49  of a rollback. I
2b670 6e 20 74 68 69 73 20 63 61 73 65 2c 20 64 6f 0a  n this case, do.
2b680 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74      ** not set t
2b690 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c  he no-content fl
2b6a0 61 67 2e 20 54 68 69 73 20 63 61 75 73 65 73 20  ag. This causes 
2b6b0 74 68 65 20 70 61 67 65 72 20 74 6f 20 6c 6f 61  the pager to loa
2b6c0 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20  d and journal.  
2b6d0 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
2b6e0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 62 65   page content be
2b6f0 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67  fore overwriting
2b700 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20   it..    **.    
2b710 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
2b720 20 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20   pager will not 
2b730 61 63 74 75 61 6c 6c 79 20 61 74 74 65 6d 70 74  actually attempt
2b740 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72   to load or jour
2b750 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74  nal .    ** cont
2b760 65 6e 74 20 66 6f 72 20 61 6e 79 20 70 61 67 65  ent for any page
2b770 20 74 68 61 74 20 72 65 61 6c 6c 79 20 64 6f 65   that really doe
2b780 73 20 6c 69 65 20 70 61 73 74 20 74 68 65 20 65  s lie past the e
2b790 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nd of the databa
2b7a0 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f  se.    ** file o
2b7b0 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68 65 20 65  n disk. So the e
2b7c0 66 66 65 63 74 73 20 6f 66 20 64 69 73 61 62 6c  ffects of disabl
2b7d0 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65  ing the no-conte
2b7e0 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  nt optimization.
2b7f0 20 20 20 20 2a 2a 20 68 65 72 65 20 61 72 65 20      ** here are 
2b800 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f 73  confined to thos
2b810 65 20 70 61 67 65 73 20 74 68 61 74 20 6c 69 65  e pages that lie
2b820 20 62 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64   between the end
2b830 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   of the.    ** d
2b840 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 61 6e  atabase image an
2b850 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  d the end of the
2b860 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2b870 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62      */.    int b
2b880 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d  NoContent = (0==
2b890 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
2b8a0 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 29 20 3f  >bDoTruncate)) ?
2b8b0 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
2b8c0 54 45 4e 54 20 3a 20 30 3b 0a 0a 20 20 20 20 72  TENT : 0;..    r
2b8d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2b8e0 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
2b8f0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
2b900 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2b910 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50   rc;.    pBt->nP
2b920 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  age++;.    if( p
2b930 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49  Bt->nPage==PENDI
2b940 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
2b950 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b  ) ) pBt->nPage++
2b960 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
2b970 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2b980 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
2b990 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52  utoVacuum && PTR
2b9a0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
2b9b0 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20  pBt->nPage) ){. 
2b9c0 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e       /* If *pPgn
2b9d0 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f  o refers to a po
2b9e0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
2b9f0 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77  allocate two new
2ba00 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
2ba10 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
2ba20 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  e file instead o
2ba30 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74  f one. The first
2ba40 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a   allocated page.
2ba50 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73        ** becomes
2ba60 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d   a new pointer-m
2ba70 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63  ap page, the sec
2ba80 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74  ond is used by t
2ba90 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20  he caller..     
2baa0 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
2bab0 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20  e *pPg = 0;.    
2bac0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
2bad0 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
2bae0 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72  of file (pointer
2baf0 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 70  -map page)\n", p
2bb00 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20  Bt->nPage));.   
2bb10 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
2bb20 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42  nPage!=PENDING_B
2bb30 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
2bb40 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
2bb50 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 42  eGetPage(pBt, pB
2bb60 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20  t->nPage, &pPg, 
2bb70 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  bNoContent);.   
2bb80 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2bb90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2bba0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2bbb0 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50  rWrite(pPg->pDbP
2bbc0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
2bbd0 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a  leasePage(pPg);.
2bbe0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2bbf0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2bc00 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
2bc10 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ge++;.      if( 
2bc20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44  pBt->nPage==PEND
2bc30 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2bc40 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65  t) ){ pBt->nPage
2bc50 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64  ++; }.    }.#end
2bc60 69 66 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  if.    put4byte(
2bc70 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70  28 + (u8*)pBt->p
2bc80 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42  Page1->aData, pB
2bc90 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a  t->nPage);.    *
2bca0 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61  pPgno = pBt->nPa
2bcb0 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  ge;..    assert(
2bcc0 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
2bcd0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2bce0 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
2bcf0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70  eGetPage(pBt, *p
2bd00 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e  Pgno, ppPage, bN
2bd10 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69  oContent);.    i
2bd20 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2bd30 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
2bd40 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
2bd50 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
2bd60 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2bd70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2bd80 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
2bd90 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
2bda0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
2bdb0 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
2bdc0 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67  of file\n", *pPg
2bdd0 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  no));.  }..  ass
2bde0 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
2bdf0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
2be00 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f  Bt) );..end_allo
2be10 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c  cate_page:.  rel
2be20 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
2be30 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
2be40 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69  pPrevTrunk);.  i
2be50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2be60 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
2be70 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
2be80 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e  ount((*ppPage)->
2be90 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20  pDbPage)>1 ){.  
2bea0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2beb0 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
2bec0 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
2bed0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2bee0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2bef0 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67     }.    (*ppPag
2bf00 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  e)->isInit = 0;.
2bf10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
2bf20 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Page = 0;.  }.  
2bf30 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
2bf40 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33  TE_OK || sqlite3
2bf50 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2bf60 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
2bf70 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  age) );.  return
2bf80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
2bf90 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
2bfa0 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65 20  sed to add page 
2bfb0 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  iPage to the dat
2bfc0 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d  abase file free-
2bfd0 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20  list. .** It is 
2bfe0 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
2bff0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
2c000 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74  eady a part of t
2c010 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a  he free-list..**
2c020 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61  .** The value pa
2c030 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
2c040 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
2c050 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2c060 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20  optional..** If 
2c070 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65  the caller happe
2c080 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69  ns to have a poi
2c090 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50  nter to the MemP
2c0a0 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63  age object .** c
2c0b0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
2c0c0 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64 79  page iPage handy
2c0d0 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69 74  , it may pass it
2c0e0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76   as the second v
2c0f0 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  alue. .** Otherw
2c100 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73  ise, it may pass
2c110 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
2c120 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d  a pointer to a M
2c130 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73  emPage object is
2c140 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
2c150 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a  econd argument,.
2c160 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65  ** its reference
2c170 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c   count is not al
2c180 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75  tered by this fu
2c190 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
2c1a0 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 28  c int freePage2(
2c1b0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d  BtShared *pBt, M
2c1c0 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65  emPage *pMemPage
2c1d0 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20  , Pgno iPage){. 
2c1e0 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
2c1f0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2c200 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73       /* Free-lis
2c210 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  t trunk page */.
2c220 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20    Pgno iTrunk = 
2c230 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2c240 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
2c250 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73  mber of free-lis
2c260 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20  t trunk page */ 
2c270 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2c280 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
2c290 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  ;      /* Local 
2c2a0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
2c2b0 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  e 1 */.  MemPage
2c2c0 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20   *pPage;        
2c2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c2e0 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  Page being freed
2c2f0 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a  . May be NULL. *
2c300 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
2c310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c320 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2c330 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n Code */.  int 
2c340 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20  nFree;          
2c350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c360 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65  /* Initial numbe
2c370 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72  r of pages on fr
2c380 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73  ee-list */..  as
2c390 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2c3a0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
2c3b0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
2c3c0 28 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61  ( iPage>1 );.  a
2c3d0 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65  ssert( !pMemPage
2c3e0 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67   || pMemPage->pg
2c3f0 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20  no==iPage );..  
2c400 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a  if( pMemPage ){.
2c410 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d      pPage = pMem
2c420 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Page;.    sqlite
2c430 33 50 61 67 65 72 52 65 66 28 70 50 61 67 65 2d  3PagerRef(pPage-
2c440 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c  >pDbPage);.  }el
2c450 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  se{.    pPage = 
2c460 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
2c470 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d  pBt, iPage);.  }
2c480 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74  ..  /* Increment
2c490 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63   the free page c
2c4a0 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a  ount on pPage1 *
2c4b0 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
2c4c0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
2c4d0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
2c4e0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65  f( rc ) goto fre
2c4f0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72  epage_out;.  nFr
2c500 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
2c510 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
2c520 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
2c530 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
2c540 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69  , nFree+1);..  i
2c550 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
2c560 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
2c570 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49  LETE ){.    /* I
2c580 66 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c  f the secure_del
2c590 65 74 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e  ete option is en
2c5a0 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20  abled, then.    
2c5b0 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20  ** always fully 
2c5c0 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  overwrite delete
2c5d0 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
2c5e0 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f  th zeros..    */
2c5f0 0a 20 20 20 20 69 66 28 20 28 21 70 50 61 67 65  .    if( (!pPage
2c600 20 26 26 20 28 28 72 63 20 3d 20 62 74 72 65 65   && ((rc = btree
2c610 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61  GetPage(pBt, iPa
2c620 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21  ge, &pPage, 0))!
2c630 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c 20 20 20  =0) ).     ||   
2c640 20 20 20 20 20 20 20 20 20 28 28 72 63 20 3d 20           ((rc = 
2c650 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2c660 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2c670 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20  ))!=0).    ){.  
2c680 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
2c690 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
2c6a0 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61   memset(pPage->a
2c6b0 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e  Data, 0, pPage->
2c6c0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
2c6d0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
2c6e0 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
2c6f0 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
2c700 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  write an entry i
2c710 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
2c720 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61  p.  ** to indica
2c730 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  te that the page
2c740 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20   is free..  */. 
2c750 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
2c760 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d 61 70 50  M ){.    ptrmapP
2c770 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50  ut(pBt, iPage, P
2c780 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20  TRMAP_FREEPAGE, 
2c790 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  0, &rc);.    if(
2c7a0 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70   rc ) goto freep
2c7b0 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  age_out;.  }..  
2c7c0 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74  /* Now manipulat
2c7d0 65 20 74 68 65 20 61 63 74 75 61 6c 20 64 61 74  e the actual dat
2c7e0 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20  abase free-list 
2c7f0 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 72 65  structure. There
2c800 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f   are two.  ** po
2c810 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20  ssibilities. If 
2c820 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
2c830 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79   currently empty
2c840 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69 72 73  , or if the firs
2c850 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67  t.  ** trunk pag
2c860 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e in the free-li
2c870 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e  st is full, then
2c880 20 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20   this page will 
2c890 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65  become a.  ** ne
2c8a0 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  w free-list trun
2c8b0 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73  k page. Otherwis
2c8c0 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d  e, it will becom
2c8d0 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a  e a leaf of the.
2c8e0 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b    ** first trunk
2c8f0 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 75 72   page in the cur
2c900 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20  rent free-list. 
2c910 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73  This block tests
2c920 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70   if it.  ** is p
2c930 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74  ossible to add t
2c940 68 65 20 70 61 67 65 20 61 73 20 61 20 6e 65 77  he page as a new
2c950 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e   free-list leaf.
2c960 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65  .  */.  if( nFre
2c970 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20  e!=0 ){.    u32 
2c980 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  nLeaf;          
2c990 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
2c9a0 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   number of leaf 
2c9b0 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70  cells on trunk p
2c9c0 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75  age */..    iTru
2c9d0 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
2c9e0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
2c9f0 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
2ca00 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54  eGetPage(pBt, iT
2ca10 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30  runk, &pTrunk, 0
2ca20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2ca30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ca40 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
2ca50 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
2ca60 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74 65  nLeaf = get4byte
2ca70 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
2ca80 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4]);.    assert(
2ca90 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
2caa0 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  >32 );.    if( n
2cab0 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42 74 2d  Leaf > (u32)pBt-
2cac0 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
2cad0 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  2 ){.      rc = 
2cae0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2caf0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
2cb00 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2cb10 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61    }.    if( nLea
2cb20 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e 75 73  f < (u32)pBt->us
2cb30 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29  ableSize/4 - 8 )
2cb40 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68  {.      /* In th
2cb50 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73  is case there is
2cb60 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75   room on the tru
2cb70 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72  nk page to inser
2cb80 74 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  t the page.     
2cb90 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20   ** being freed 
2cba0 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20  as a new leaf.. 
2cbb0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2cbc0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 74   Note that the t
2cbd0 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74  runk page is not
2cbe0 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74   really full unt
2cbf0 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20  il it contains. 
2cc00 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
2cc10 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73  ze/4 - 2 entries
2cc20 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65  , not usableSize
2cc30 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61  /4 - 8 entries a
2cc40 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 20 20  s we have.      
2cc50 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64  ** coded.  But d
2cc60 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65  ue to a coding e
2cc70 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73  rror in versions
2cc80 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72   of SQLite prior
2cc90 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36   to.      ** 3.6
2cca0 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20 77 69  .0, databases wi
2ccb0 74 68 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  th freelist trun
2ccc0 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20  k pages holding 
2ccd0 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20  more than.      
2cce0 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
2ccf0 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c  - 8 entries will
2cd00 20 62 65 20 72 65 70 6f 72 74 65 64 20 61 73 20   be reported as 
2cd10 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64  corrupt.  In ord
2cd20 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d  er.      ** to m
2cd30 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64  aintain backward
2cd40 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s compatibility 
2cd50 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69  with older versi
2cd60 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20  ons of SQLite,. 
2cd70 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20       ** we will 
2cd80 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 73 74  continue to rest
2cd90 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20  rict the number 
2cda0 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73  of entries to us
2cdb0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20  ableSize/4 - 8. 
2cdc0 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e       ** for now.
2cdd0 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20    At some point 
2cde0 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 28 6f  in the future (o
2cdf0 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73  nce everyone has
2ce00 20 75 70 67 72 61 64 65 64 0a 20 20 20 20 20 20   upgraded.      
2ce10 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c  ** to 3.6.0 or l
2ce20 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20  ater) we should 
2ce30 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20  consider fixing 
2ce40 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20  the conditional 
2ce50 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74  above.      ** t
2ce60 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65 53 69  o read "usableSi
2ce70 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20  ze/4-2" instead 
2ce80 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34  of "usableSize/4
2ce90 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  -8"..      */.  
2cea0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2ceb0 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
2cec0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
2ced0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2cee0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2cef0 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  put4byte(&pTrunk
2cf00 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61  ->aData[4], nLea
2cf10 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75  f+1);.        pu
2cf20 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
2cf30 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d  aData[8+nLeaf*4]
2cf40 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
2cf50 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20 28    if( pPage && (
2cf60 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
2cf70 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
2cf80 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  E)==0 ){.       
2cf90 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44     sqlite3PagerD
2cfa0 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e  ontWrite(pPage->
2cfb0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2cfc0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
2cfd0 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74   btreeSetHasCont
2cfe0 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b  ent(pBt, iPage);
2cff0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54  .      }.      T
2d000 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
2d010 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75  : %d leaf on tru
2d020 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50  nk page %d\n",pP
2d030 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b  age->pgno,pTrunk
2d040 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
2d050 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
2d060 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
2d070 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c  /* If control fl
2d080 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ows to this poin
2d090 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e  t, then it was n
2d0a0 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  ot possible to a
2d0b0 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  dd the.  ** the 
2d0c0 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
2d0d0 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65 20   as a leaf page 
2d0e0 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72 75  of the first tru
2d0f0 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  nk in the free-l
2d100 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62  ist..  ** Possib
2d110 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ly because the f
2d120 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74  ree-list is empt
2d130 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62  y, or possibly b
2d140 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a  ecause the .  **
2d150 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20   first trunk in 
2d160 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
2d170 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61   full. Either wa
2d180 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  y, the page bein
2d190 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c  g freed.  ** wil
2d1a0 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
2d1b0 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67   first trunk pag
2d1c0 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e in the free-li
2d1d0 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
2d1e0 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54  Page==0 && SQLIT
2d1f0 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65  E_OK!=(rc = btre
2d200 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
2d210 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29  age, &pPage, 0))
2d220 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65   ){.    goto fre
2d230 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
2d240 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2d250 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
2d260 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
2d270 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2d280 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
2d290 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74  e_out;.  }.  put
2d2a0 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
2d2b0 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70  ta, iTrunk);.  p
2d2c0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
2d2d0 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20  aData[4], 0);.  
2d2e0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
2d2f0 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61  ->aData[32], iPa
2d300 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46  ge);.  TRACE(("F
2d310 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77  REE-PAGE: %d new
2d320 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c   trunk page repl
2d330 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61  acing %d\n", pPa
2d340 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b  ge->pgno, iTrunk
2d350 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75  ));..freepage_ou
2d360 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20 29  t:.  if( pPage )
2d370 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  {.    pPage->isI
2d380 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  nit = 0;.  }.  r
2d390 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2d3a0 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
2d3b0 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75  (pTrunk);.  retu
2d3c0 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20  rn rc;.}.static 
2d3d0 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d 65  void freePage(Me
2d3e0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
2d3f0 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28  t *pRC){.  if( (
2d400 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  *pRC)==SQLITE_OK
2d410 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66   ){.    *pRC = f
2d420 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e  reePage2(pPage->
2d430 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67  pBt, pPage, pPag
2d440 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a  e->pgno);.  }.}.
2d450 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20  ./*.** Free any 
2d460 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
2d470 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
2d480 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a  he given Cell..*
2d490 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65  /.static int cle
2d4a0 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  arCell(MemPage *
2d4b0 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20  pPage, unsigned 
2d4c0 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  char *pCell){.  
2d4d0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2d4e0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65  pPage->pBt;.  Ce
2d4f0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50  llInfo info;.  P
2d500 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20  gno ovflPgno;.  
2d510 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f  int rc;.  int nO
2d520 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50  vfl;.  u32 ovflP
2d530 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65  ageSize;..  asse
2d540 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2d550 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2d560 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 62  t->mutex) );.  b
2d570 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
2d580 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
2d590 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66  info);.  if( inf
2d5a0 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  o.iOverflow==0 )
2d5b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2d5c0 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f  ITE_OK;  /* No o
2d5d0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52  verflow pages. R
2d5e0 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
2d5f0 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a  ing anything */.
2d600 20 20 7d 0a 20 20 69 66 28 20 70 43 65 6c 6c 2b    }.  if( pCell+
2d610 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33  info.iOverflow+3
2d620 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b   > pPage->aData+
2d630 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
2d640 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2d650 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2d660 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65  T;  /* Cell exte
2d670 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f 66 20  nds past end of 
2d680 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76  page */.  }.  ov
2d690 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  flPgno = get4byt
2d6a0 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
2d6b0 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73  verflow]);.  ass
2d6c0 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
2d6d0 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76  Size > 4 );.  ov
2d6e0 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  flPageSize = pBt
2d6f0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
2d700 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66  ;.  nOvfl = (inf
2d710 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66  o.nPayload - inf
2d720 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50  o.nLocal + ovflP
2d730 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66  ageSize - 1)/ovf
2d740 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  lPageSize;.  ass
2d750 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30  ert( ovflPgno==0
2d760 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20   || nOvfl>0 );. 
2d770 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20   while( nOvfl-- 
2d780 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78  ){.    Pgno iNex
2d790 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61  t = 0;.    MemPa
2d7a0 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
2d7b0 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c     if( ovflPgno<
2d7c0 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74  2 || ovflPgno>bt
2d7d0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
2d7e0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20  ) ){.      /* 0 
2d7f0 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70  is not a legal p
2d800 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70  age number and p
2d810 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20  age 1 cannot be 
2d820 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  an .      ** ove
2d830 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72  rflow page. Ther
2d840 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e  efore if ovflPgn
2d850 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65 20  o<2 or past the 
2d860 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20  end of the .    
2d870 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61    ** file the da
2d880 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63  tabase must be c
2d890 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20  orrupt. */.     
2d8a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2d8b0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2d8c0 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c   }.    if( nOvfl
2d8d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67   ){.      rc = g
2d8e0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
2d8f0 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70  Bt, ovflPgno, &p
2d900 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20  Ovfl, &iNext);. 
2d910 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
2d920 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
2d930 20 20 20 20 69 66 28 20 28 20 70 4f 76 66 6c 20      if( ( pOvfl 
2d940 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62 74 72  || ((pOvfl = btr
2d950 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74  eePageLookup(pBt
2d960 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29  , ovflPgno))!=0)
2d970 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74   ).     && sqlit
2d980 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
2d990 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  unt(pOvfl->pDbPa
2d9a0 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20  ge)!=1.    ){.  
2d9b0 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
2d9c0 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20 63 75  no reason any cu
2d9d0 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61 76 65  rsor should have
2d9e0 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   an outstanding 
2d9f0 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20 20 20  reference .     
2da00 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c   ** to an overfl
2da10 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e  ow page belongin
2da20 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68 61 74  g to a cell that
2da30 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65   is being delete
2da40 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20  d/updated..     
2da50 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72 65 20   ** So if there 
2da60 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68 61 6e  exists more than
2da70 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74   one reference t
2da80 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 65  o this page, the
2da90 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d  n it .      ** m
2daa0 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62  ust not really b
2dab0 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
2dac0 67 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ge and the datab
2dad0 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  ase must be corr
2dae0 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49  upt. .      ** I
2daf0 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74 6f 20  t is helpful to 
2db00 64 65 74 65 63 74 20 74 68 69 73 20 62 65 66 6f  detect this befo
2db10 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65 65 50  re calling freeP
2db20 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20 20 20  age2(), as .    
2db30 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32 28 29    ** freePage2()
2db40 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20 70 61   may zero the pa
2db50 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66 20 73  ge contents if s
2db60 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64  ecure-delete mod
2db70 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e  e is.      ** en
2db80 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73 20 27  abled. If this '
2db90 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65 20 68  overflow' page h
2dba0 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 70  appens to be a p
2dbb0 61 67 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  age that the.   
2dbc0 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20     ** caller is 
2dbd0 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
2dbe0 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20 73 6f  h or using in so
2dbf0 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20 74 68  me other way, th
2dc00 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20  is.      ** can 
2dc10 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a  be problematic..
2dc20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2dc30 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2dc40 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c  PT_BKPT;.    }el
2dc50 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  se{.      rc = f
2dc60 72 65 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f  reePage2(pBt, pO
2dc70 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a  vfl, ovflPgno);.
2dc80 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
2dc90 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  Ovfl ){.      sq
2dca0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2dcb0 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b  pOvfl->pDbPage);
2dcc0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2dcd0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2dce0 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e     ovflPgno = iN
2dcf0 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
2dd00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2dd10 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65  /*.** Create the
2dd20 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75   byte sequence u
2dd30 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
2dd40 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20   a cell on page 
2dd50 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69  pPage.** and wri
2dd60 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71  te that byte seq
2dd70 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c  uence into pCell
2dd80 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61  [].  Overflow pa
2dd90 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63  ges are.** alloc
2dda0 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20  ated and filled 
2ddb0 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  in as necessary.
2ddc0 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72    The calling pr
2ddd0 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65  ocedure.** is re
2dde0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
2ddf0 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63  king sure suffic
2de00 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62  ient space has b
2de10 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  een allocated.**
2de20 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a   for pCell[]..**
2de30 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43  .** Note that pC
2de40 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63  ell does not nec
2de50 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70  essary need to p
2de60 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67  oint to the pPag
2de70 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61  e->aData.** area
2de80 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70  .  pCell might p
2de90 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d  oint to some tem
2dea0 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20  porary storage. 
2deb0 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a   The cell will.*
2dec0 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64  * be constructed
2ded0 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61   in this tempora
2dee0 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70  ry area then cop
2def0 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  ied into pPage->
2df00 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a  aData.** later..
2df10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
2df20 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  llInCell(.  MemP
2df30 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
2df40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2df50 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
2df60 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ains the cell */
2df70 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2df80 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
2df90 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65    /* Complete te
2dfa0 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a  xt of the cell *
2dfb0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
2dfc0 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20  pKey, i64 nKey, 
2dfd0 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f     /* The key */
2dfe0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
2dff0 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20  Data,int nData, 
2e000 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f    /* The data */
2e010 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20  .  int nZero,   
2e020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e030 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20    /* Extra zero 
2e040 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20  bytes to append 
2e050 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e  to pData */.  in
2e060 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20  t *pnSize       
2e070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e080 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20  Write cell size 
2e090 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
2e0a0 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e   nPayload;.  con
2e0b0 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69  st u8 *pSrc;.  i
2e0c0 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a  nt nSrc, n, rc;.
2e0d0 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b    int spaceLeft;
2e0e0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66  .  MemPage *pOvf
2e0f0 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  l = 0;.  MemPage
2e100 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30   *pToRelease = 0
2e110 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
2e120 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73  r *pPrior;.  uns
2e130 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79  igned char *pPay
2e140 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64  load;.  BtShared
2e150 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
2e160 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f  Bt;.  Pgno pgnoO
2e170 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  vfl = 0;.  int n
2e180 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e  Header;.  CellIn
2e190 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65  fo info;..  asse
2e1a0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2e1b0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2e1c0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
2e1d0 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20  /* pPage is not 
2e1e0 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74  necessarily writ
2e1f0 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c  eable since pCel
2e200 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c  l might be auxil
2e210 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72  iary.  ** buffer
2e220 20 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73   space that is s
2e230 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65  eparate from the
2e240 20 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72   pPage buffer ar
2e250 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ea */.  assert( 
2e260 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61  pCell<pPage->aDa
2e270 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50  ta || pCell>=&pP
2e280 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
2e290 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
2e2a0 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
2e2b0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2e2c0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2e2d0 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   );..  /* Fill i
2e2e0 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f  n the header. */
2e2f0 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a  .  nHeader = 0;.
2e300 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2e310 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  af ){.    nHeade
2e320 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66  r += 4;.  }.  if
2e330 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
2e340 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
2e350 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28 26  += putVarint32(&
2e360 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
2e370 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20  nData+nZero);.  
2e380 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61  }else{.    nData
2e390 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20   = nZero = 0;.  
2e3a0 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70  }.  nHeader += p
2e3b0 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
2e3c0 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a  nHeader], *(u64*
2e3d0 29 26 6e 4b 65 79 29 3b 0a 20 20 62 74 72 65 65  )&nKey);.  btree
2e3e0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
2e3f0 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
2e400 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
2e410 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61 64  o.nHeader==nHead
2e420 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
2e430 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20  info.nKey==nKey 
2e440 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
2e450 6f 2e 6e 44 61 74 61 3d 3d 28 75 33 32 29 28 6e  o.nData==(u32)(n
2e460 44 61 74 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20  Data+nZero) );. 
2e470 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74   .  /* Fill in t
2e480 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  he payload */.  
2e490 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61  nPayload = nData
2e4a0 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20   + nZero;.  if( 
2e4b0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
2e4c0 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74  .    pSrc = pDat
2e4d0 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44  a;.    nSrc = nD
2e4e0 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d  ata;.    nData =
2e4f0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20   0;.  }else{ .  
2e500 20 20 69 66 28 20 4e 45 56 45 52 28 6e 4b 65 79    if( NEVER(nKey
2e510 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70  >0x7fffffff || p
2e520 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  Key==0) ){.     
2e530 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2e540 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2e550 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
2e560 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20  += (int)nKey;.  
2e570 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20    pSrc = pKey;. 
2e580 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e     nSrc = (int)n
2e590 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69  Key;.  }.  *pnSi
2e5a0 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b  ze = info.nSize;
2e5b0 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69  .  spaceLeft = i
2e5c0 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50  nfo.nLocal;.  pP
2e5d0 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b  ayload = &pCell[
2e5e0 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69  nHeader];.  pPri
2e5f0 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f  or = &pCell[info
2e600 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20  .iOverflow];..  
2e610 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e  while( nPayload>
2e620 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61  0 ){.    if( spa
2e630 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66  ceLeft==0 ){.#if
2e640 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2e650 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2e660 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61    Pgno pgnoPtrma
2e670 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a  p = pgnoOvfl; /*
2e680 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   Overflow page p
2e690 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
2e6a0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
2e6b0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2e6c0 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f  um ){.        do
2e6d0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f  {.          pgno
2e6e0 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Ovfl++;.        
2e6f0 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20  } while( .      
2e700 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47      PTRMAP_ISPAG
2e710 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29  E(pBt, pgnoOvfl)
2e720 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45   || pgnoOvfl==PE
2e730 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2e740 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b  pBt) .        );
2e750 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
2e760 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
2e770 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
2e780 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f  , &pOvfl, &pgnoO
2e790 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30  vfl, pgnoOvfl, 0
2e7a0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2e7b0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2e7c0 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
2e7d0 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
2e7e0 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
2e7f0 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
2e800 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20  or subsequent.  
2e810 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
2e820 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c  page is being al
2e830 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20  located, add an 
2e840 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69  entry to the poi
2e850 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a  nter-map.      *
2e860 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20  * for that page 
2e870 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  now. .      **. 
2e880 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20       ** If this 
2e890 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  is the first ove
2e8a0 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
2e8b0 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c   write a partial
2e8c0 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a   entry .      **
2e8d0 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
2e8e0 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65  map. If we write
2e8f0 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73   nothing to this
2e900 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f   pointer-map slo
2e910 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  t,.      ** then
2e920 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20   the optimistic 
2e930 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70  overflow chain p
2e940 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65  rocessing in cle
2e950 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a  arCell().      *
2e960 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72  * may misinterpr
2e970 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c  et the uninitial
2e980 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20  ized values and 
2e990 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20  delete the.     
2e9a0 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20   ** wrong pages 
2e9b0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
2e9c0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
2e9d0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
2e9e0 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c  acuum && rc==SQL
2e9f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2ea00 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67    u8 eType = (pg
2ea10 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f  noPtrmap?PTRMAP_
2ea20 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50  OVERFLOW2:PTRMAP
2ea30 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20  _OVERFLOW1);.   
2ea40 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
2ea50 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54  Bt, pgnoOvfl, eT
2ea60 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c  ype, pgnoPtrmap,
2ea70 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69   &rc);.        i
2ea80 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2ea90 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2eaa0 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Ovfl);.        }
2eab0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
2eac0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2ead0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2eae0 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
2eaf0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2eb00 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
2eb10 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
2eb20 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
2eb30 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e  than pPrior poin
2eb40 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
2eb50 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f   area.      ** o
2eb60 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
2eb70 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
2eb80 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
2eb90 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  teable. */.     
2eba0 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65   assert( pToRele
2ebb0 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
2ebc0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2ebd0 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44  e(pToRelease->pD
2ebe0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
2ebf0 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73   /* If pPrior is
2ec00 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
2ec10 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c  a area of pPage,
2ec20 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
2ec30 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69  pPage.      ** i
2ec40 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
2ec50 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
2ec60 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d  t( pPrior<pPage-
2ec70 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72  >aData || pPrior
2ec80 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
2ec90 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
2eca0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
2ecb0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2ecc0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
2ecd0 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
2ece0 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
2ecf0 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20   pgnoOvfl);.    
2ed00 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
2ed10 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
2ed20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f   pToRelease = pO
2ed30 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  vfl;.      pPrio
2ed40 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61  r = pOvfl->aData
2ed50 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
2ed60 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20  (pPrior, 0);.   
2ed70 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70     pPayload = &p
2ed80 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a  Ovfl->aData[4];.
2ed90 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20        spaceLeft 
2eda0 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
2edb0 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  e - 4;.    }.   
2edc0 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   n = nPayload;. 
2edd0 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65     if( n>spaceLe
2ede0 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65  ft ) n = spaceLe
2edf0 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70  ft;..    /* If p
2ee00 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
2ee10 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c   zero than pPayl
2ee20 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  oad points into 
2ee30 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
2ee40 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
2ee50 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
2ee60 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
2ee70 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
2ee80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f  .    assert( pTo
2ee90 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71  Release==0 || sq
2eea0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2eeb0 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65  eable(pToRelease
2eec0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
2eed0 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61     /* If pPayloa
2eee0 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  d is part of the
2eef0 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50   data area of pP
2ef00 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  age, then make s
2ef10 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a  ure pPage.    **
2ef20 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
2ef30 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ble */.    asser
2ef40 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67  t( pPayload<pPag
2ef50 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79  e->aData || pPay
2ef60 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44  load>=&pPage->aD
2ef70 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
2ef80 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
2ef90 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
2efa0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
2efb0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
2efc0 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a    if( nSrc>0 ){.
2efd0 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63        if( n>nSrc
2efe0 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20   ) n = nSrc;.   
2eff0 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20     assert( pSrc 
2f000 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
2f010 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20  pPayload, pSrc, 
2f020 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
2f030 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79       memset(pPay
2f040 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20  load, 0, n);.   
2f050 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
2f060 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f  -= n;.    pPaylo
2f070 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72  ad += n;.    pSr
2f080 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63  c += n;.    nSrc
2f090 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65   -= n;.    space
2f0a0 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69  Left -= n;.    i
2f0b0 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20  f( nSrc==0 ){.  
2f0c0 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
2f0d0 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70  ;.      pSrc = p
2f0e0 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Data;.    }.  }.
2f0f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
2f100 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74  oRelease);.  ret
2f110 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2f120 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
2f130 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f  he i-th cell fro
2f140 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72  m pPage.  This r
2f150 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70  outine effects p
2f160 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68  Page only..** Th
2f170 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
2f180 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64  s not freed or d
2f190 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20  eallocated.  It 
2f1a0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
2f1b0 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** the cell cont
2f1c0 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70  ent has been cop
2f1d0 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c  ied someplace el
2f1e0 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
2f1f0 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65  e just.** remove
2f200 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
2f210 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d  to the cell from
2f220 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73   pPage..**.** "s
2f230 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e  z" must be the n
2f240 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
2f250 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73  n the cell..*/.s
2f260 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43  tatic void dropC
2f270 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
2f280 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  ge, int idx, int
2f290 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a   sz, int *pRC){.
2f2a0 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20 20    u32 pc;       
2f2b0 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
2f2c0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63  ell content of c
2f2d0 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65  ell being delete
2f2e0 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  d */.  u8 *data;
2f2f0 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d         /* pPage-
2f300 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a  >aData */.  u8 *
2f310 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55  ptr;        /* U
2f320 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65  sed to move byte
2f330 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20  s around within 
2f340 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
2f350 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  rc;         /* T
2f360 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
2f370 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
2f380 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67      /* Beginning
2f390 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e 20   of the header. 
2f3a0 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20   0 most pages.  
2f3b0 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20  100 page 1 */.. 
2f3c0 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
2f3d0 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  rn;..  assert( i
2f3e0 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61  dx>=0 && idx<pPa
2f3f0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
2f400 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53  ssert( sz==cellS
2f410 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20  ize(pPage, idx) 
2f420 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2f430 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2f440 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
2f450 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
2f460 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2f470 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2f480 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74  >mutex) );.  dat
2f490 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
2f4a0 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61 67 65  ;.  ptr = &pPage
2f4b0 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78  ->aCellIdx[2*idx
2f4c0 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79  ];.  pc = get2by
2f4d0 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d  te(ptr);.  hdr =
2f4e0 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
2f4f0 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  t;.  testcase( p
2f500 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  c==get2byte(&dat
2f510 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74  a[hdr+5]) );.  t
2f520 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d  estcase( pc+sz==
2f530 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
2f540 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  leSize );.  if( 
2f550 70 63 20 3c 20 28 75 33 32 29 67 65 74 32 62 79  pc < (u32)get2by
2f560 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
2f570 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61 67   || pc+sz > pPag
2f580 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
2f590 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  ze ){.    *pRC =
2f5a0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2f5b0 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
2f5c0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65  ;.  }.  rc = fre
2f5d0 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63  eSpace(pPage, pc
2f5e0 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20  , sz);.  if( rc 
2f5f0 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63  ){.    *pRC = rc
2f600 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
2f610 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  }.  pPage->nCell
2f620 2d 2d 3b 0a 20 20 6d 65 6d 6d 6f 76 65 28 70 74  --;.  memmove(pt
2f630 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70 50 61  r, ptr+2, 2*(pPa
2f640 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78 29  ge->nCell - idx)
2f650 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
2f660 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67  ata[hdr+3], pPag
2f670 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61  e->nCell);.  pPa
2f680 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a  ge->nFree += 2;.
2f690 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
2f6a0 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50  a new cell on pP
2f6b0 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65  age at cell inde
2f6c0 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f  x "i".  pCell po
2f6d0 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63  ints to the.** c
2f6e0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65  ontent of the ce
2f6f0 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ll..**.** If the
2f700 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69   cell content wi
2f710 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61  ll fit on the pa
2f720 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20  ge, then put it 
2f730 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a  there.  If it.**
2f740 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74   will not fit, t
2f750 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  hen make a copy 
2f760 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
2f770 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69  ent into pTemp i
2f780 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f  f.** pTemp is no
2f790 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c  t null.  Regardl
2f7a0 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c  ess of pTemp, al
2f7b0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74  locate a new ent
2f7c0 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e  ry.** in pPage->
2f7d0 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b  apOvfl[] and mak
2f7e0 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68  e it point to th
2f7f0 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28  e cell content (
2f800 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65  either.** in pTe
2f810 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  mp or the origin
2f820 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c  al pCell) and al
2f830 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e  so record its in
2f840 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74  dex. .** Allocat
2f850 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ing a new entry 
2f860 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b  in pPage->aCell[
2f870 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a  ] implies that .
2f880 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ** pPage->nOverf
2f890 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  low is increment
2f8a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b  ed..**.** If nSk
2f8b0 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ip is non-zero, 
2f8c0 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79  then do not copy
2f8d0 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70   the first nSkip
2f8e0 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a   bytes of the.**
2f8f0 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65   cell. The calle
2f900 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65  r will overwrite
2f910 20 74 68 65 6d 20 61 66 74 65 72 20 74 68 69 73   them after this
2f920 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
2f930 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69  s. If.** nSkip i
2f940 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
2f950 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70   pCell may not p
2f960 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c  oint to an inval
2f970 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  id memory locati
2f980 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c  on .** (but pCel
2f990 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79  l+nSkip is alway
2f9a0 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61  s valid)..*/.sta
2f9b0 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43  tic void insertC
2f9c0 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
2f9d0 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65  pPage,   /* Page
2f9e0 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61   into which we a
2f9f0 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20  re copying */.  
2fa00 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20  int i,          
2fa10 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65    /* New cell be
2fa20 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63  comes the i-th c
2fa30 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20  ell of the page 
2fa40 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
2fa50 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
2fa60 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c  t of the new cel
2fa70 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20  l */.  int sz,  
2fa80 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
2fa90 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20  s of content in 
2faa0 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
2fab0 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
2fac0 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61  Temp storage spa
2fad0 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66  ce for pCell, if
2fae0 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e   needed */.  Pgn
2faf0 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f  o iChild,      /
2fb00 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72  * If non-zero, r
2fb10 65 70 6c 61 63 65 20 66 69 72 73 74 20 34 20 62  eplace first 4 b
2fb20 79 74 65 73 20 77 69 74 68 20 74 68 69 73 20 76  ytes with this v
2fb30 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  alue */.  int *p
2fb40 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  RC          /* R
2fb50 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 72 65  ead and write re
2fb60 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68  turn code from h
2fb70 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
2fb80 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  idx = 0;      /*
2fb90 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
2fba0 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  new cell content
2fbb0 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
2fbc0 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
2fbd0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2fbe0 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20  r */.  int end; 
2fbf0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2fc00 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
2fc10 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  last cell pointe
2fc20 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  r in data[] */. 
2fc30 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20   int ins;       
2fc40 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64     /* Index in d
2fc50 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20  ata[] where new 
2fc60 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20  cell pointer is 
2fc70 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e  inserted */.  in
2fc80 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  t cellOffset;   
2fc90 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66 69  /* Address of fi
2fca0 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  rst cell pointer
2fcb0 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
2fcc0 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
2fcd0 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74    /* The content
2fce0 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61   of the whole pa
2fcf0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6b 69  ge */.  int nSki
2fd00 70 20 3d 20 28 69 43 68 69 6c 64 20 3f 20 34 20  p = (iChild ? 4 
2fd10 3a 20 30 29 3b 0a 0a 20 20 69 66 28 20 2a 70 52  : 0);..  if( *pR
2fd20 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  C ) return;..  a
2fd30 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
2fd40 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70  <=pPage->nCell+p
2fd50 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
2fd60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 58 5f  );.  assert( MX_
2fd70 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
2fd80 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20 61 73 73  <=10921 );.  ass
2fd90 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
2fda0 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  l<=MX_CELL(pPage
2fdb0 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52 52 55 50  ->pBt) || CORRUP
2fdc0 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  T_DB );.  assert
2fdd0 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
2fde0 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50  ow<=ArraySize(pP
2fdf0 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a  age->apOvfl) );.
2fe00 20 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53    assert( ArrayS
2fe10 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66  ize(pPage->apOvf
2fe20 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65 28 70 50  l)==ArraySize(pP
2fe30 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a  age->aiOvfl) );.
2fe40 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2fe50 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
2fe60 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
2fe70 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c  );.  /* The cell
2fe80 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79   should normally
2fe90 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65 63   be sized correc
2fea0 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20 77  tly.  However, w
2feb0 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a  hen moving a.  *
2fec0 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c  * malformed cell
2fed0 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61 67   from a leaf pag
2fee0 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72  e to an interior
2fef0 20 70 61 67 65 2c 20 69 66 20 74 68 65 20 63 65   page, if the ce
2ff00 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e  ll size.  ** wan
2ff10 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74  ted to be less t
2ff20 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72 6f  han 4 but got ro
2ff30 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f 6e  unded up to 4 on
2ff40 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e 20   the leaf, then 
2ff50 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20  size.  ** might 
2ff60 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38 20 28  be less than 8 (
2ff70 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e  leaf-size + poin
2ff80 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e 74 65  ter) on the inte
2ff90 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63  rior node.  Henc
2ffa0 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72 6d 20  e.  ** the term 
2ffb0 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69 6e 20  after the || in 
2ffc0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
2ffd0 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73  sert(). */.  ass
2ffe0 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a  ert( sz==cellSiz
2fff0 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
30000 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20  l) || (sz==8 && 
30010 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69  iChild>0) );.  i
30020 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
30030 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67  low || sz+2>pPag
30040 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
30050 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20  if( pTemp ){.   
30060 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b     memcpy(pTemp+
30070 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b  nSkip, pCell+nSk
30080 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20  ip, sz-nSkip);. 
30090 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65       pCell = pTe
300a0 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  mp;.    }.    if
300b0 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20  ( iChild ){.    
300c0 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
300d0 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d  , iChild);.    }
300e0 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e  .    j = pPage->
300f0 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20  nOverflow++;.   
30100 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74 29   assert( j<(int)
30110 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  (sizeof(pPage->a
30120 70 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50  pOvfl)/sizeof(pP
30130 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29 29  age->apOvfl[0]))
30140 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61   );.    pPage->a
30150 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c  pOvfl[j] = pCell
30160 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 69 4f  ;.    pPage->aiO
30170 76 66 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b  vfl[j] = (u16)i;
30180 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
30190 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
301a0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
301b0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
301c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
301d0 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20  ){.      *pRC = 
301e0 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
301f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
30200 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
30210 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
30220 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
30230 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d     data = pPage-
30240 3e 61 44 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c  >aData;.    cell
30250 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
30260 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20  cellOffset;.    
30270 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  end = cellOffset
30280 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
30290 6c 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c  l;.    ins = cel
302a0 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20  lOffset + 2*i;. 
302b0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
302c0 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c  Space(pPage, sz,
302d0 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20   &idx);.    if( 
302e0 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b  rc ){ *pRC = rc;
302f0 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f   return; }.    /
30300 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 53 70  * The allocateSp
30310 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20 67 75  ace() routine gu
30320 61 72 61 6e 74 65 65 73 20 74 68 65 20 66 6f 6c  arantees the fol
30330 6c 6f 77 69 6e 67 20 74 77 6f 20 70 72 6f 70 65  lowing two prope
30340 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66 20  rties.    ** if 
30350 69 74 20 72 65 74 75 72 6e 73 20 73 75 63 63 65  it returns succe
30360 73 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ss */.    assert
30370 28 20 69 64 78 20 3e 3d 20 65 6e 64 2b 32 20 29  ( idx >= end+2 )
30380 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  ;.    assert( id
30390 78 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61  x+sz <= (int)pPa
303a0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
303b0 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ize );.    pPage
303c0 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70  ->nCell++;.    p
303d0 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28  Page->nFree -= (
303e0 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20  u16)(2 + sz);.  
303f0 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69    memcpy(&data[i
30400 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c  dx+nSkip], pCell
30410 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70  +nSkip, sz-nSkip
30420 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c  );.    if( iChil
30430 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62  d ){.      put4b
30440 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20  yte(&data[idx], 
30450 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  iChild);.    }. 
30460 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61     memmove(&data
30470 5b 69 6e 73 2b 32 5d 2c 20 26 64 61 74 61 5b 69  [ins+2], &data[i
30480 6e 73 5d 2c 20 65 6e 64 2d 69 6e 73 29 3b 0a 20  ns], end-ins);. 
30490 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
304a0 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20  a[ins], idx);.  
304b0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
304c0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
304d0 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65  t+3], pPage->nCe
304e0 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ll);.#ifndef SQL
304f0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
30500 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67  UUM.    if( pPag
30510 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  e->pBt->autoVacu
30520 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  um ){.      /* T
30530 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74  he cell may cont
30540 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ain a pointer to
30550 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
30560 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a  e. If so, write.
30570 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
30580 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ry for the overf
30590 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  low page into th
305a0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20  e pointer map.. 
305b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74       */.      pt
305c0 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
305d0 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43  Page, pCell, pRC
305e0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
305f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
30600 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73   a list of cells
30610 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65   to a page.  The
30620 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20   page should be 
30630 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e  initially empty.
30640 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72  .** The cells ar
30650 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
30660 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  fit on the page.
30670 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
30680 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20  assemblePage(.  
30690 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
306a0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f    /* The page to
306b0 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20 2a   be assemblied *
306c0 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20  /.  int nCell,  
306d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
306e0 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20  ber of cells to 
306f0 61 64 64 20 74 6f 20 74 68 69 73 20 70 61 67 65  add to this page
30700 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
30710 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  l,      /* Point
30720 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69  ers to cell bodi
30730 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69  es */.  u16 *aSi
30740 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  ze        /* Siz
30750 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  es of the cells 
30760 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
30770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
30780 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
30790 38 20 2a 70 43 65 6c 6c 70 74 72 3b 20 20 20 20  8 *pCellptr;    
307a0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e   /* Address of n
307b0 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  ext cell pointer
307c0 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f   */.  int cellbo
307d0 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65  dy;     /* Addre
307e0 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20  ss of next cell 
307f0 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 20 63  body */.  u8 * c
30800 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67  onst data = pPag
30810 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20  e->aData;       
30820 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
30830 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50 61   to data for pPa
30840 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  ge */.  const in
30850 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  t hdr = pPage->h
30860 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  drOffset;       
30870 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
30880 20 68 65 61 64 65 72 20 6f 6e 20 70 50 61 67 65   header on pPage
30890 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
308a0 6e 55 73 61 62 6c 65 20 3d 20 70 50 61 67 65 2d  nUsable = pPage-
308b0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
308c0 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65  ; /* Usable size
308d0 20 6f 66 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61   of page */..  a
308e0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
308f0 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
30900 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
30910 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
30920 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
30930 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
30940 3e 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d 28 69  >=0 && nCell<=(i
30950 6e 74 29 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  nt)MX_CELL(pPage
30960 2d 3e 70 42 74 29 0a 20 20 20 20 20 20 20 20 20  ->pBt).         
30970 20 20 20 26 26 20 28 69 6e 74 29 4d 58 5f 43 45     && (int)MX_CE
30980 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d  LL(pPage->pBt)<=
30990 31 30 39 32 31 29 3b 0a 20 20 61 73 73 65 72 74  10921);.  assert
309a0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
309b0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
309c0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
309d0 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
309e0 65 20 70 61 67 65 20 68 61 73 20 6a 75 73 74 20  e page has just 
309f0 62 65 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a  been zeroed by z
30a00 65 72 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20 61  eroPage() */.  a
30a10 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
30a20 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ell==0 );.  asse
30a30 72 74 28 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  rt( get2byteNotZ
30a40 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
30a50 29 3d 3d 6e 55 73 61 62 6c 65 20 29 3b 0a 0a 20  )==nUsable );.. 
30a60 20 70 43 65 6c 6c 70 74 72 20 3d 20 26 70 50 61   pCellptr = &pPa
30a70 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 43 65  ge->aCellIdx[nCe
30a80 6c 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64  ll*2];.  cellbod
30a90 79 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20 66  y = nUsable;.  f
30aa0 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e  or(i=nCell-1; i>
30ab0 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 75 31  =0; i--){.    u1
30ac0 36 20 73 7a 20 3d 20 61 53 69 7a 65 5b 69 5d 3b  6 sz = aSize[i];
30ad0 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2d 3d  .    pCellptr -=
30ae0 20 32 3b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79   2;.    cellbody
30af0 20 2d 3d 20 73 7a 3b 0a 20 20 20 20 70 75 74 32   -= sz;.    put2
30b00 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 63  byte(pCellptr, c
30b10 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65  ellbody);.    me
30b20 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62  mcpy(&data[cellb
30b30 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c  ody], apCell[i],
30b40 20 73 7a 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32   sz);.  }.  put2
30b50 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
30b60 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74  ], nCell);.  put
30b70 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
30b80 35 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20  5], cellbody);. 
30b90 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d   pPage->nFree -=
30ba0 20 28 6e 43 65 6c 6c 2a 32 20 2b 20 6e 55 73 61   (nCell*2 + nUsa
30bb0 62 6c 65 20 2d 20 63 65 6c 6c 62 6f 64 79 29 3b  ble - cellbody);
30bc0 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
30bd0 3d 20 28 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a  = (u16)nCell;.}.
30be0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
30bf0 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  wing parameters 
30c00 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61  determine how ma
30c10 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65  ny adjacent page
30c20 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a  s get involved.*
30c30 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67  * in a balancing
30c40 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20   operation.  NN 
30c50 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
30c60 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
30c70 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20  ther side.** of 
30c80 74 68 65 20 70 61 67 65 20 74 68 61 74 20 70 61  the page that pa
30c90 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65  rticipate in the
30ca0 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61   balancing opera
30cb0 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65  tion.  NB is the
30cc0 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  .** total number
30cd0 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 70   of pages that p
30ce0 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c  articipate, incl
30cf0 75 64 69 6e 67 20 74 68 65 20 74 61 72 67 65 74  uding the target
30d00 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20   page and.** NN 
30d10 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74  neighbors on eit
30d20 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20  her side..**.** 
30d30 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75  The minimum valu
30d40 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66  e of NN is 1 (of
30d50 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65   course).  Incre
30d60 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31  asing NN above 1
30d70 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20  .** (to 2 or 3) 
30d80 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69  gives a modest i
30d90 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45  mprovement in SE
30da0 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20  LECT and DELETE 
30db0 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69  performance.** i
30dc0 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61  n exchange for a
30dd0 20 6c 61 72 67 65 72 20 64 65 67 72 61 64 61 74   larger degradat
30de0 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e  ion in INSERT an
30df0 64 20 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d  d UPDATE perform
30e00 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c  ance..** The val
30e10 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73  ue of NN appears
30e20 20 74 6f 20 67 69 76 65 20 74 68 65 20 62 65 73   to give the bes
30e30 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c  t results overal
30e40 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e  l..*/.#define NN
30e50 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 2f   1             /
30e60 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67  * Number of neig
30e70 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
30e80 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f  side of pPage */
30e90 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a  .#define NB (NN*
30ea0 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74  2+1)      /* Tot
30eb0 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65  al pages involve
30ec0 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65  d in the balance
30ed0 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51   */...#ifndef SQ
30ee0 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
30ef0 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69  ALANCE./*.** Thi
30f00 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c  s version of bal
30f10 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74  ance() handles t
30f20 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61  he common specia
30f30 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20  l case where.** 
30f40 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62  a new entry is b
30f50 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e  eing inserted on
30f60 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67   the extreme rig
30f70 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  ht-end of the.**
30f80 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20   tree, in other 
30f90 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20  words, when the 
30fa0 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62  new entry will b
30fb0 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73  ecome the larges
30fc0 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68  t.** entry in th
30fd0 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e  e tree..**.** In
30fe0 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20  stead of trying 
30ff0 74 6f 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33  to balance the 3
31000 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
31010 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64   pages, just add
31020 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74  .** a new page t
31030 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  o the right-hand
31040 20 73 69 64 65 20 61 6e 64 20 70 75 74 20 74 68   side and put th
31050 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20  e one new entry 
31060 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e  in.** that page.
31070 20 20 54 68 69 73 20 6c 65 61 76 65 73 20 74 68    This leaves th
31080 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66 20  e right side of 
31090 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61  the tree somewha
310a0 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e  t.** unbalanced.
310b0 20 20 42 75 74 20 6f 64 64 73 20 61 72 65 20 74    But odds are t
310c0 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69  hat we will be i
310d0 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74  nserting new ent
310e0 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65  ries.** at the e
310f0 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72  nd soon afterwar
31100 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79  ds so the nearly
31110 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c   empty page will
31120 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c   quickly.** fill
31130 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65   up.  On average
31140 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73  ..**.** pPage is
31150 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 77   the leaf page w
31160 68 69 63 68 20 69 73 20 74 68 65 20 72 69 67 68  hich is the righ
31170 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74  t-most page in t
31180 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72  he tree..** pPar
31190 65 6e 74 20 69 73 20 69 74 73 20 70 61 72 65 6e  ent is its paren
311a0 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20 68  t.  pPage must h
311b0 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65  ave a single ove
311c0 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77  rflow entry.** w
311d0 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65  hich is also the
311e0 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
311f0 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  y on the page..*
31200 2a 0a 2a 2a 20 54 68 65 20 70 53 70 61 63 65 20  *.** The pSpace 
31210 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20 74  buffer is used t
31220 6f 20 73 74 6f 72 65 20 61 20 74 65 6d 70 6f 72  o store a tempor
31230 61 72 79 20 63 6f 70 79 20 6f 66 20 74 68 65 20  ary copy of the 
31240 64 69 76 69 64 65 72 0a 2a 2a 20 63 65 6c 6c 20  divider.** cell 
31250 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6e 73  that will be ins
31260 65 72 74 65 64 20 69 6e 74 6f 20 70 50 61 72 65  erted into pPare
31270 6e 74 2e 20 53 75 63 68 20 61 20 63 65 6c 6c 20  nt. Such a cell 
31280 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34 0a  consists of a 4.
31290 2a 2a 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d  ** byte page num
312a0 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  ber followed by 
312b0 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
312c0 68 20 69 6e 74 65 67 65 72 2e 20 49 6e 20 6f 74  h integer. In ot
312d0 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 74  her.** words, at
312e0 20 6d 6f 73 74 20 31 33 20 62 79 74 65 73 2e 20   most 13 bytes. 
312f0 48 65 6e 63 65 20 74 68 65 20 70 53 70 61 63 65  Hence the pSpace
31300 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20   buffer must be 
31310 61 74 0a 2a 2a 20 6c 65 61 73 74 20 31 33 20 62  at.** least 13 b
31320 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f  ytes in size..*/
31330 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
31340 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67  nce_quick(MemPag
31350 65 20 2a 70 50 61 72 65 6e 74 2c 20 4d 65 6d 50  e *pParent, MemP
31360 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
31370 70 53 70 61 63 65 29 7b 0a 20 20 42 74 53 68 61  pSpace){.  BtSha
31380 72 65 64 20 2a 63 6f 6e 73 74 20 70 42 74 20 3d  red *const pBt =
31390 20 70 50 61 67 65 2d 3e 70 42 74 3b 20 20 20 20   pPage->pBt;    
313a0 2f 2a 20 42 2d 54 72 65 65 20 44 61 74 61 62 61  /* B-Tree Databa
313b0 73 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  se */.  MemPage 
313c0 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
313d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
313e0 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  Newly allocated 
313f0 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  page */.  int rc
31400 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31420 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
31430 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b  .  Pgno pgnoNew;
31440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31450 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
31460 6e 75 6d 62 65 72 20 6f 66 20 70 4e 65 77 20 2a  number of pNew *
31470 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
31480 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
31490 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
314a0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
314b0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
314c0 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d  iteable(pParent-
314d0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
314e0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
314f0 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20  verflow==1 );.. 
31500 20 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20 63   /* This error c
31510 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 77 20  ondition is now 
31520 63 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f 20  caught prior to 
31530 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 66 75  reaching this fu
31540 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20  nction */.  if( 
31550 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
31560 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
31570 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20  CORRUPT_BKPT;.. 
31580 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e   /* Allocate a n
31590 65 77 20 70 61 67 65 2e 20 54 68 69 73 20 70 61  ew page. This pa
315a0 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ge will become t
315b0 68 65 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67  he right-sibling
315c0 20 6f 66 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e   of .  ** pPage.
315d0 20 4d 61 6b 65 20 74 68 65 20 70 61 72 65 6e 74   Make the parent
315e0 20 70 61 67 65 20 77 72 69 74 61 62 6c 65 2c 20   page writable, 
315f0 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  so that the new 
31600 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a  divider cell.  *
31610 2a 20 6d 61 79 20 62 65 20 69 6e 73 65 72 74 65  * may be inserte
31620 64 2e 20 49 66 20 62 6f 74 68 20 74 68 65 73 65  d. If both these
31630 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20   operations are 
31640 73 75 63 63 65 73 73 66 75 6c 2c 20 70 72 6f 63  successful, proc
31650 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  eed..  */.  rc =
31660 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
31670 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26  ge(pBt, &pNew, &
31680 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a  pgnoNew, 0, 0);.
31690 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
316a0 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20  E_OK ){..    u8 
316b0 2a 70 4f 75 74 20 3d 20 26 70 53 70 61 63 65 5b  *pOut = &pSpace[
316c0 34 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  4];.    u8 *pCel
316d0 6c 20 3d 20 70 50 61 67 65 2d 3e 61 70 4f 76 66  l = pPage->apOvf
316e0 6c 5b 30 5d 3b 0a 20 20 20 20 75 31 36 20 73 7a  l[0];.    u16 sz
316f0 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Cell = cellSizeP
31700 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
31710 3b 0a 20 20 20 20 75 38 20 2a 70 53 74 6f 70 3b  ;.    u8 *pStop;
31720 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ..    assert( sq
31730 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
31740 65 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50  eable(pNew->pDbP
31750 61 67 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65  age) );.    asse
31760 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
31770 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59  [0]==(PTF_INTKEY
31780 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54  |PTF_LEAFDATA|PT
31790 46 5f 4c 45 41 46 29 20 29 3b 0a 20 20 20 20 7a  F_LEAF) );.    z
317a0 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 50 54  eroPage(pNew, PT
317b0 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
317c0 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b  FDATA|PTF_LEAF);
317d0 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67  .    assemblePag
317e0 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c  e(pNew, 1, &pCel
317f0 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20  l, &szCell);..  
31800 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
31810 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
31820 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20  atabase, update 
31830 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a  the pointer map.
31840 20 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72      ** with entr
31850 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ies for the new 
31860 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f  page, and any po
31870 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a  inter from the .
31880 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74      ** cell on t
31890 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76  he page to an ov
318a0 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
318b0 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 0a  either of these.
318c0 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e      ** operation
318d0 73 20 66 61 69 6c 73 2c 20 74 68 65 20 72 65 74  s fails, the ret
318e0 75 72 6e 20 63 6f 64 65 20 69 73 20 73 65 74 2c  urn code is set,
318f0 20 62 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74   but the content
31900 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  s.    ** of the 
31910 70 61 72 65 6e 74 20 70 61 67 65 20 61 72 65 20  parent page are 
31920 73 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65  still manipulate
31930 64 20 62 79 20 74 68 68 20 63 6f 64 65 20 62 65  d by thh code be
31940 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74  low..    ** That
31950 20 69 73 20 4f 6b 2c 20 61 74 20 74 68 69 73 20   is Ok, at this 
31960 70 6f 69 6e 74 20 74 68 65 20 70 61 72 65 6e 74  point the parent
31970 20 70 61 67 65 20 69 73 20 67 75 61 72 61 6e 74   page is guarant
31980 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eed to.    ** be
31990 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
319a0 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  . Returning an e
319b0 72 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20 63  rror code will c
319c0 61 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f  ause a.    ** ro
319d0 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20  llback, undoing 
319e0 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65  any changes made
319f0 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70   to the parent p
31a00 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
31a10 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
31a20 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
31a30 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77  Put(pBt, pgnoNew
31a40 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
31a50 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26  pParent->pgno, &
31a60 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  rc);.      if( s
31a70 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c  zCell>pNew->minL
31a80 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ocal ){.        
31a90 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
31aa0 28 70 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26 72  (pNew, pCell, &r
31ab0 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
31ac0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61  }.  .    /* Crea
31ad0 74 65 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  te a divider cel
31ae0 6c 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  l to insert into
31af0 20 70 50 61 72 65 6e 74 2e 20 54 68 65 20 64 69   pParent. The di
31b00 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a  vider cell.    *
31b10 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  * consists of a 
31b20 34 2d 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4-byte page numb
31b30 65 72 20 28 74 68 65 20 70 61 67 65 20 6e 75 6d  er (the page num
31b40 62 65 72 20 6f 66 20 70 50 61 67 65 29 20 61 6e  ber of pPage) an
31b50 64 0a 20 20 20 20 2a 2a 20 61 20 76 61 72 69 61  d.    ** a varia
31b60 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 20 76  ble length key v
31b70 61 6c 75 65 20 28 77 68 69 63 68 20 6d 75 73 74  alue (which must
31b80 20 62 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c   be the same val
31b90 75 65 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a  ue as the.    **
31ba0 20 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20   largest key on 
31bb0 70 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20  pPage)..    **. 
31bc0 20 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68     ** To find th
31bd0 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61  e largest key va
31be0 6c 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69  lue on pPage, fi
31bf0 72 73 74 20 66 69 6e 64 20 74 68 65 20 72 69 67  rst find the rig
31c00 68 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20  ht-most .    ** 
31c10 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54  cell on pPage. T
31c20 68 65 20 66 69 72 73 74 20 74 77 6f 20 66 69 65  he first two fie
31c30 6c 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c  lds of this cell
31c40 20 61 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a   are the .    **
31c50 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28   record-length (
31c60 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
31c70 68 20 69 6e 74 65 67 65 72 20 61 74 20 6d 6f 73  h integer at mos
31c80 74 20 33 32 2d 62 69 74 73 20 69 6e 20 73 69 7a  t 32-bits in siz
31c90 65 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  e).    ** and th
31ca0 65 20 6b 65 79 20 76 61 6c 75 65 20 28 61 20 76  e key value (a v
31cb0 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69  ariable length i
31cc0 6e 74 65 67 65 72 2c 20 6d 61 79 20 68 61 76 65  nteger, may have
31cd0 20 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20 20   any value)..   
31ce0 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66   ** The first of
31cf0 20 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20   the while(...) 
31d00 6c 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69 70  loops below skip
31d10 73 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72  s over the recor
31d20 64 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20  d-length.    ** 
31d30 66 69 65 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e  field. The secon
31d40 64 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f  d while(...) loo
31d50 70 20 63 6f 70 69 65 73 20 74 68 65 20 6b 65 79  p copies the key
31d60 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a   value from the.
31d70 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70      ** cell on p
31d80 50 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 53  Page into the pS
31d90 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 20  pace buffer..   
31da0 20 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20   */.    pCell = 
31db0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
31dc0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b  pPage->nCell-1);
31dd0 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43  .    pStop = &pC
31de0 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c  ell[9];.    whil
31df0 65 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30  e( (*(pCell++)&0
31e00 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53  x80) && pCell<pS
31e10 74 6f 70 20 29 3b 0a 20 20 20 20 70 53 74 6f 70  top );.    pStop
31e20 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20   = &pCell[9];.  
31e30 20 20 77 68 69 6c 65 28 20 28 28 2a 28 70 4f 75    while( ((*(pOu
31e40 74 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b  t++) = *(pCell++
31e50 29 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c  ))&0x80) && pCel
31e60 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20  l<pStop );..    
31e70 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
31e80 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  w divider cell i
31e90 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a  nto pParent. */.
31ea0 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70      insertCell(p
31eb0 50 61 72 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d  Parent, pParent-
31ec0 3e 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20  >nCell, pSpace, 
31ed0 28 69 6e 74 29 28 70 4f 75 74 2d 70 53 70 61 63  (int)(pOut-pSpac
31ee0 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e),.            
31ef0 20 20 20 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e     0, pPage->pgn
31f00 6f 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a  o, &rc);..    /*
31f10 20 53 65 74 20 74 68 65 20 72 69 67 68 74 2d 63   Set the right-c
31f20 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20  hild pointer of 
31f30 70 50 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74  pParent to point
31f40 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65   to the new page
31f50 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74  . */.    put4byt
31f60 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
31f70 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
31f80 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77  fset+8], pgnoNew
31f90 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c  );.  .    /* Rel
31fa0 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e  ease the referen
31fb0 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  ce to the new pa
31fc0 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61  ge. */.    relea
31fd0 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20  sePage(pNew);.  
31fe0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
31ff0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
32000 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
32010 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f  ANCE */..#if 0./
32020 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
32030 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  on does not cont
32040 72 69 62 75 74 65 20 61 6e 79 74 68 69 6e 67 20  ribute anything 
32050 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  to the operation
32060 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69   of SQLite..** i
32070 74 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 61  t is sometimes a
32080 63 74 69 76 61 74 65 64 20 74 65 6d 70 6f 72 61  ctivated tempora
32090 72 69 6c 79 20 77 68 69 6c 65 20 64 65 62 75 67  rily while debug
320a0 67 69 6e 67 20 63 6f 64 65 20 72 65 73 70 6f 6e  ging code respon
320b0 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65  sible .** for se
320c0 74 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61  tting pointer-ma
320d0 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  p entries..*/.st
320e0 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 43  atic int ptrmapC
320f0 68 65 63 6b 50 61 67 65 73 28 4d 65 6d 50 61 67  heckPages(MemPag
32100 65 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74 20  e **apPage, int 
32110 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c  nPage){.  int i,
32120 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   j;.  for(i=0; i
32130 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  <nPage; i++){.  
32140 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38    Pgno n;.    u8
32150 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   e;.    MemPage 
32160 2a 70 50 61 67 65 20 3d 20 61 70 50 61 67 65 5b  *pPage = apPage[
32170 69 5d 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64  i];.    BtShared
32180 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
32190 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
321a0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
321b0 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ..    for(j=0; j
321c0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a  <pPage->nCell; j
321d0 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49  ++){.      CellI
321e0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
321f0 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20  u8 *z;.     .   
32200 20 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28     z = findCell(
32210 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20  pPage, j);.     
32220 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
32230 74 72 28 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e  tr(pPage, z, &in
32240 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  fo);.      if( i
32250 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b  nfo.iOverflow ){
32260 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6f 76  .        Pgno ov
32270 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 7a  fl = get4byte(&z
32280 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
32290 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  );.        ptrma
322a0 70 47 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20  pGet(pBt, ovfl, 
322b0 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20  &e, &n);.       
322c0 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67   assert( n==pPag
322d0 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54  e->pgno && e==PT
322e0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29  RMAP_OVERFLOW1 )
322f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
32300 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
32310 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
32320 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74   child = get4byt
32330 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 74  e(z);.        pt
32340 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69  rmapGet(pBt, chi
32350 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20  ld, &e, &n);.   
32360 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d       assert( n==
32370 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65  pPage->pgno && e
32380 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29  ==PTRMAP_BTREE )
32390 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
323a0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
323b0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67  leaf ){.      Pg
323c0 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62  no child = get4b
323d0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
323e0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
323f0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70 74  et+8]);.      pt
32400 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69  rmapGet(pBt, chi
32410 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20  ld, &e, &n);.   
32420 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50     assert( n==pP
32430 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d  age->pgno && e==
32440 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a  PTRMAP_BTREE );.
32450 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
32460 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
32470 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
32480 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63  ion is used to c
32490 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  opy the contents
324a0 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e   of the b-tree n
324b0 6f 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f  ode stored .** o
324c0 6e 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20  n page pFrom to 
324d0 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70 61 67  page pTo. If pag
324e0 65 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20  e pFrom was not 
324f0 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  a leaf page, the
32500 6e 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72  n.** the pointer
32510 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72  -map entries for
32520 20 65 61 63 68 20 63 68 69 6c 64 20 70 61 67 65   each child page
32530 20 61 72 65 20 75 70 64 61 74 65 64 20 73 6f 20   are updated so 
32540 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 72 65  that the.** pare
32550 6e 74 20 70 61 67 65 20 73 74 6f 72 65 64 20 69  nt page stored i
32560 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  n the pointer ma
32570 70 20 69 73 20 70 61 67 65 20 70 54 6f 2e 20 49  p is page pTo. I
32580 66 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65  f pFrom containe
32590 64 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77  d.** any cells w
325a0 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ith overflow pag
325b0 65 20 70 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e  e pointers, then
325c0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
325d0 6e 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61  ng pointer.** ma
325e0 70 20 65 6e 74 72 69 65 73 20 61 72 65 20 61 6c  p entries are al
325f0 73 6f 20 75 70 64 61 74 65 64 20 73 6f 20 74 68  so updated so th
32600 61 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  at the parent pa
32610 67 65 20 69 73 20 70 61 67 65 20 70 54 6f 2e 0a  ge is page pTo..
32620 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69  **.** If pFrom i
32630 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 72  s currently carr
32640 79 69 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f  ying any overflo
32650 77 20 63 65 6c 6c 73 20 28 65 6e 74 72 69 65 73  w cells (entries
32660 20 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61   in the.** MemPa
32670 67 65 2e 61 70 4f 76 66 6c 5b 5d 20 61 72 72 61  ge.apOvfl[] arra
32680 79 29 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74  y), they are not
32690 20 63 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e 20   copied to pTo. 
326a0 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
326b0 74 75 72 6e 69 6e 67 2c 20 70 61 67 65 20 70 54  turning, page pT
326c0 6f 20 69 73 20 72 65 69 6e 69 74 69 61 6c 69 7a  o is reinitializ
326d0 65 64 20 75 73 69 6e 67 20 62 74 72 65 65 49 6e  ed using btreeIn
326e0 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  itPage()..**.** 
326f0 54 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  The performance 
32700 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
32710 20 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61 6c   is not critical
32720 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65  . It is only use
32730 64 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c  d by .** the bal
32740 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29  ance_shallower()
32750 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65 65   and balance_dee
32760 70 65 72 28 29 20 70 72 6f 63 65 64 75 72 65 73  per() procedures
32770 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20  , neither of.** 
32780 77 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65 64  which are called
32790 20 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72   often under nor
327a0 6d 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65  mal circumstance
327b0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
327c0 64 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e  d copyNodeConten
327d0 74 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d  t(MemPage *pFrom
327e0 2c 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20  , MemPage *pTo, 
327f0 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28  int *pRC){.  if(
32800 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f   (*pRC)==SQLITE_
32810 4f 4b 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  OK ){.    BtShar
32820 65 64 20 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d  ed * const pBt =
32830 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20   pFrom->pBt;.   
32840 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f   u8 * const aFro
32850 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61  m = pFrom->aData
32860 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74  ;.    u8 * const
32870 20 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74   aTo = pTo->aDat
32880 61 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74  a;.    int const
32890 20 69 46 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f   iFromHdr = pFro
328a0 6d 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  m->hdrOffset;.  
328b0 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48    int const iToH
328c0 64 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f  dr = ((pTo->pgno
328d0 3d 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29 3b  ==1) ? 100 : 0);
328e0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
328f0 20 69 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a 20   int iData;.  . 
32900 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46   .    assert( pF
32910 72 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  rom->isInit );. 
32920 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
32930 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20  ->nFree>=iToHdr 
32940 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  );.    assert( g
32950 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69  et2byte(&aFrom[i
32960 46 72 6f 6d 48 64 72 2b 35 5d 29 20 3c 3d 20 28  FromHdr+5]) <= (
32970 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
32980 69 7a 65 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  ize );.  .    /*
32990 20 43 6f 70 79 20 74 68 65 20 62 2d 74 72 65 65   Copy the b-tree
329a0 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66 72   node content fr
329b0 6f 6d 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f  om page pFrom to
329c0 20 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20   page pTo. */.  
329d0 20 20 69 44 61 74 61 20 3d 20 67 65 74 32 62 79    iData = get2by
329e0 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48  te(&aFrom[iFromH
329f0 64 72 2b 35 5d 29 3b 0a 20 20 20 20 6d 65 6d 63  dr+5]);.    memc
32a00 70 79 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20  py(&aTo[iData], 
32a10 26 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70  &aFrom[iData], p
32a20 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69  Bt->usableSize-i
32a30 44 61 74 61 29 3b 0a 20 20 20 20 6d 65 6d 63 70  Data);.    memcp
32a40 79 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20  y(&aTo[iToHdr], 
32a50 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d  &aFrom[iFromHdr]
32a60 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66  , pFrom->cellOff
32a70 73 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e  set + 2*pFrom->n
32a80 43 65 6c 6c 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  Cell);.  .    /*
32a90 20 52 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61   Reinitialize pa
32aa0 67 65 20 70 54 6f 20 73 6f 20 74 68 61 74 20 74  ge pTo so that t
32ab0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
32ac0 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63  he MemPage struc
32ad0 74 75 72 65 0a 20 20 20 20 2a 2a 20 6d 61 74 63  ture.    ** matc
32ae0 68 20 74 68 65 20 6e 65 77 20 64 61 74 61 2e 20  h the new data. 
32af0 54 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  The initializati
32b00 6f 6e 20 6f 66 20 70 54 6f 20 63 61 6e 20 61 63  on of pTo can ac
32b10 74 75 61 6c 6c 79 20 66 61 69 6c 20 75 6e 64 65  tually fail unde
32b20 72 0a 20 20 20 20 2a 2a 20 66 61 69 72 6c 79 20  r.    ** fairly 
32b30 6f 62 73 63 75 72 65 20 63 69 72 63 75 6d 73 74  obscure circumst
32b40 61 6e 63 65 73 2c 20 65 76 65 6e 20 74 68 6f 75  ances, even thou
32b50 67 68 20 69 74 20 69 73 20 61 20 63 6f 70 79 20  gh it is a copy 
32b60 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 0a  of initialized .
32b70 20 20 20 20 2a 2a 20 70 61 67 65 20 70 46 72 6f      ** page pFro
32b80 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54  m..    */.    pT
32b90 6f 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  o->isInit = 0;. 
32ba0 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69     rc = btreeIni
32bb0 74 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 20 20  tPage(pTo);.    
32bc0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32bd0 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20  K ){.      *pRC 
32be0 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
32bf0 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  rn;.    }.  .   
32c00 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
32c10 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
32c20 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
32c30 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
32c40 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 66 6f  ntries.    ** fo
32c50 72 20 61 6e 79 20 62 2d 74 72 65 65 20 6f 72 20  r any b-tree or 
32c60 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74  overflow pages t
32c70 68 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74  hat pTo now cont
32c80 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
32c90 73 20 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  s to..    */.   
32ca0 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
32cb0 4d 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20  M ){.      *pRC 
32cc0 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
32cd0 73 28 70 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  s(pTo);.    }.  
32ce0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
32cf0 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69  routine redistri
32d00 62 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74  butes cells on t
32d10 68 65 20 69 50 61 72 65 6e 74 49 64 78 27 74 68  he iParentIdx'th
32d20 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e   child of pParen
32d30 74 0a 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20  t.** (hereafter 
32d40 22 74 68 65 20 70 61 67 65 22 29 20 61 6e 64 20  "the page") and 
32d50 75 70 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73  up to 2 siblings
32d60 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67   so that all pag
32d70 65 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68  es have about th
32d80 65 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74  e.** same amount
32d90 20 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 20   of free space. 
32da0 55 73 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65  Usually a single
32db0 20 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68   sibling on eith
32dc0 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a  er side of the.*
32dd0 2a 20 70 61 67 65 20 61 72 65 20 75 73 65 64 20  * page are used 
32de0 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
32df0 2c 20 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69  , though both si
32e00 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d  blings might com
32e10 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69  e from one.** si
32e20 64 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  de if the page i
32e30 73 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 6c  s the first or l
32e40 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73  ast child of its
32e50 20 70 61 72 65 6e 74 2e 20 49 66 20 74 68 65 20   parent. If the 
32e60 70 61 67 65 20 0a 2a 2a 20 68 61 73 20 66 65 77  page .** has few
32e70 65 72 20 74 68 61 6e 20 32 20 73 69 62 6c 69 6e  er than 2 siblin
32e80 67 73 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68  gs (something wh
32e90 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  ich can only hap
32ea0 70 65 6e 20 69 66 20 74 68 65 20 70 61 67 65 0a  pen if the page.
32eb0 2a 2a 20 69 73 20 61 20 72 6f 6f 74 20 70 61 67  ** is a root pag
32ec0 65 20 6f 72 20 61 20 63 68 69 6c 64 20 6f 66 20  e or a child of 
32ed0 61 20 72 6f 6f 74 20 70 61 67 65 29 20 74 68 65  a root page) the
32ee0 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20  n all available 
32ef0 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74  siblings.** part
32f00 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
32f10 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  alancing..**.** 
32f20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  The number of si
32f30 62 6c 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61  blings of the pa
32f40 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72  ge might be incr
32f50 65 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73  eased or decreas
32f60 65 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72  ed by .** one or
32f70 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72   two in an effor
32f80 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20  t to keep pages 
32f90 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20  nearly full but 
32fa0 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a  not over full. .
32fb0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
32fc0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
32fd0 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d  e is called, som
32fe0 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f  e of the cells o
32ff0 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69  n the page.** mi
33000 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ght not actually
33010 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65   be stored in Me
33020 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54  mPage.aData[]. T
33030 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a  his can happen.*
33040 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
33050 20 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20   overfull. This 
33060 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
33070 74 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61  that all cells a
33080 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74  llocated.** to t
33090 68 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20  he page and its 
330a0 73 69 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74  siblings fit int
330b0 6f 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b  o MemPage.aData[
330c0 5d 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  ] before returni
330d0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  ng..**.** In the
330e0 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e   course of balan
330f0 63 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 6e  cing the page an
33100 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73 2c 20  d its siblings, 
33110 63 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20  cells may be.** 
33120 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 6f 72  inserted into or
33130 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
33140 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 28 70  e parent page (p
33150 50 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73  Parent). Doing s
33160 6f 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65 20 74  o.** may cause t
33170 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 74  he parent page t
33180 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c  o become overful
33190 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20  l or underfull. 
331a0 49 66 20 74 68 69 73 0a 2a 2a 20 68 61 70 70 65  If this.** happe
331b0 6e 73 2c 20 69 74 20 69 73 20 74 68 65 20 72 65  ns, it is the re
331c0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
331d0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e  the caller to in
331e0 76 6f 6b 65 20 74 68 65 20 63 6f 72 72 65 63 74  voke the correct
331f0 0a 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f  .** balancing ro
33200 75 74 69 6e 65 20 74 6f 20 66 69 78 20 74 68 69  utine to fix thi
33210 73 20 70 72 6f 62 6c 65 6d 20 28 73 65 65 20 74  s problem (see t
33220 68 65 20 62 61 6c 61 6e 63 65 28 29 20 72 6f 75  he balance() rou
33230 74 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  tine). .**.** If
33240 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
33250 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73  ils for any reas
33260 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61  on, it might lea
33270 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ve the database.
33280 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65  ** in a corrupte
33290 64 20 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74  d state. So if t
332a0 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
332b0 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  s, the database 
332c0 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c  should.** be rol
332d0 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
332e0 54 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  The third argume
332f0 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
33300 69 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c  ion, aOvflSpace,
33310 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
33320 20 61 0a 2a 2a 20 62 75 66 66 65 72 20 62 69 67   a.** buffer big
33330 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
33340 6f 6e 65 20 70 61 67 65 2e 20 49 66 20 77 68 69  one page. If whi
33350 6c 65 20 69 6e 73 65 72 74 69 6e 67 20 63 65 6c  le inserting cel
33360 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ls into the pare
33370 6e 74 0a 2a 2a 20 70 61 67 65 20 28 70 50 61 72  nt.** page (pPar
33380 65 6e 74 29 20 74 68 65 20 70 61 72 65 6e 74 20  ent) the parent 
33390 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65  page becomes ove
333a0 72 66 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66  rfull, this buff
333b0 65 72 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  er is.** used to
333c0 20 73 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e   store the paren
333d0 74 27 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  t's overflow cel
333e0 6c 73 2e 20 42 65 63 61 75 73 65 20 74 68 69 73  ls. Because this
333f0 20 66 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74   function insert
33400 73 0a 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f  s.** a maximum o
33410 66 20 66 6f 75 72 20 64 69 76 69 64 65 72 20 63  f four divider c
33420 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61  ells into the pa
33430 72 65 6e 74 20 70 61 67 65 2c 20 61 6e 64 20 74  rent page, and t
33440 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69  he maximum.** si
33450 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f  ze of a cell sto
33460 72 65 64 20 77 69 74 68 69 6e 20 61 6e 20 69 6e  red within an in
33470 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61  ternal node is a
33480 6c 77 61 79 73 20 6c 65 73 73 20 74 68 61 6e 20  lways less than 
33490 31 2f 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  1/4.** of the pa
334a0 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f 76  ge-size, the aOv
334b0 66 6c 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72  flSpace[] buffer
334c0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
334d0 6f 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e  o be large.** en
334e0 6f 75 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65  ough for all ove
334f0 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a  rflow cells..**.
33500 2a 2a 20 49 66 20 61 4f 76 66 6c 53 70 61 63 65  ** If aOvflSpace
33510 20 69 73 20 73 65 74 20 74 6f 20 61 20 6e 75 6c   is set to a nul
33520 6c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20  l pointer, this 
33530 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
33540 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   .** SQLITE_NOME
33550 4d 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  M..*/.#if define
33560 64 28 5f 4d 53 43 5f 56 45 52 29 20 26 26 20 5f  d(_MSC_VER) && _
33570 4d 53 43 5f 56 45 52 20 3e 3d 20 31 37 30 30 20  MSC_VER >= 1700 
33580 26 26 20 64 65 66 69 6e 65 64 28 5f 4d 5f 41 52  && defined(_M_AR
33590 4d 29 0a 23 70 72 61 67 6d 61 20 6f 70 74 69 6d  M).#pragma optim
335a0 69 7a 65 28 22 22 2c 20 6f 66 66 29 0a 23 65 6e  ize("", off).#en
335b0 64 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20 62  dif.static int b
335c0 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a  alance_nonroot(.
335d0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
335e0 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nt,             
335f0 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65    /* Parent page
33600 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 62 65 69   of siblings bei
33610 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  ng balanced */. 
33620 20 69 6e 74 20 69 50 61 72 65 6e 74 49 64 78 2c   int iParentIdx,
33630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33640 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22 74 68   /* Index of "th
33650 65 20 70 61 67 65 22 20 69 6e 20 70 50 61 72 65  e page" in pPare
33660 6e 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76 66  nt */.  u8 *aOvf
33670 6c 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20  lSpace,         
33680 20 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65 2d          /* page-
33690 73 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70  size bytes of sp
336a0 61 63 65 20 66 6f 72 20 70 61 72 65 6e 74 20 6f  ace for parent o
336b0 76 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52  vfl */.  int isR
336c0 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  oot,            
336d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
336e0 20 69 66 20 70 50 61 72 65 6e 74 20 69 73 20 61   if pParent is a
336f0 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20   root-page */.  
33700 69 6e 74 20 62 42 75 6c 6b 20 20 20 20 20 20 20  int bBulk       
33710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33720 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
33730 63 61 6c 6c 20 69 73 20 70 61 72 74 20 6f 66 20  call is part of 
33740 61 20 62 75 6c 6b 20 6c 6f 61 64 20 2a 2f 0a 29  a bulk load */.)
33750 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
33760 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
33770 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61   /* The whole da
33780 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
33790 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20  nCell = 0;      
337a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
337b0 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61  er of cells in a
337c0 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74  pCell[] */.  int
337d0 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20   nMaxCells = 0; 
337e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
337f0 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61  ocated size of a
33800 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61  pCell, szCell, a
33810 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e  From. */.  int n
33820 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20  New = 0;        
33830 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
33840 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70  r of pages in ap
33850 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  New[] */.  int n
33860 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  Old;            
33870 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
33880 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70  r of pages in ap
33890 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  Old[] */.  int i
338a0 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20  , j, k;         
338b0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
338c0 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
338d0 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20  t nxDiv;        
338e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
338f0 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20  xt divider slot 
33900 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c  in pParent->aCel
33910 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  l[] */.  int rc 
33920 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
33930 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
33940 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31  urn code */.  u1
33950 36 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  6 leafCorrection
33960 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20  ;          /* 4 
33970 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
33980 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f  af.  0 if not */
33990 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b  .  int leafData;
339a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
339b0 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 67 65  /* True if pPage
339c0 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20   is a leaf of a 
339d0 4c 45 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f  LEAFDATA tree */
339e0 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61  .  int usableSpa
339f0 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
33a00 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61 67  /* Bytes in pPag
33a10 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61  e beyond the hea
33a20 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  der */.  int pag
33a30 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  eFlags;         
33a40 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
33a50 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  f pPage->aData[0
33a60 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f  ] */.  int subto
33a70 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  tal;            
33a80 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20      /* Subtotal 
33a90 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c  of bytes in cell
33aa0 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f  s on one page */
33ab0 0a 20 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d  .  int iSpace1 =
33ac0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
33ad0 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20  /* First unused 
33ae0 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b  byte of aSpace1[
33af0 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c  ] */.  int iOvfl
33b00 53 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20  Space = 0;      
33b10 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75      /* First unu
33b20 73 65 64 20 62 79 74 65 20 6f 66 20 61 4f 76 66  sed byte of aOvf
33b30 6c 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e  lSpace[] */.  in
33b40 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20  t szScratch;    
33b50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
33b60 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65  ze of scratch me
33b70 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64 20 2a  mory requested *
33b80 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f  /.  MemPage *apO
33b90 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  ld[NB];         
33ba0 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70   /* pPage and up
33bb0 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73   to two siblings
33bc0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
33bd0 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20  pCopy[NB];      
33be0 20 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f     /* Private co
33bf0 70 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20  pies of apOld[] 
33c00 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  pages */.  MemPa
33c10 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b  ge *apNew[NB+2];
33c20 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65          /* pPage
33c30 20 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69   and up to NB si
33c40 62 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c  blings after bal
33c50 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a  ancing */.  u8 *
33c60 70 52 69 67 68 74 3b 20 20 20 20 20 20 20 20 20  pRight;         
33c70 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
33c80 74 69 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f  tion in parent o
33c90 66 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20  f right-sibling 
33ca0 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  pointer */.  u8 
33cb0 2a 61 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20  *apDiv[NB-1];   
33cc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76            /* Div
33cd0 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50  ider cells in pP
33ce0 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63  arent */.  int c
33cf0 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  ntNew[NB+2];    
33d00 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
33d10 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63   in aCell[] of c
33d20 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70  ell after i-th p
33d30 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e  age */.  int szN
33d40 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
33d50 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65        /* Combine
33d60 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20  d size of cells 
33d70 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61  place on i-th pa
33d80 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
33d90 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ell = 0;        
33da0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c       /* All cell
33db0 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64  s begin balanced
33dc0 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c   */.  u16 *szCel
33dd0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
33de0 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65     /* Local size
33df0 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e   of all cells in
33e00 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75   apCell[] */.  u
33e10 38 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20  8 *aSpace1;     
33e20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
33e30 70 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73 20  pace for copies 
33e40 6f 66 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c  of dividers cell
33e50 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  s */.  Pgno pgno
33e60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33e70 20 20 20 20 2f 2a 20 54 65 6d 70 20 76 61 72 20      /* Temp var 
33e80 74 6f 20 73 74 6f 72 65 20 61 20 70 61 67 65 20  to store a page 
33e90 6e 75 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20  number in */..  
33ea0 70 42 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  pBt = pParent->p
33eb0 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
33ec0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
33ed0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
33ee0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
33ef0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
33f00 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
33f10 67 65 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20  ge) );..#if 0.  
33f20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
33f30 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20 63   begin page %d c
33f40 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  hild of %d\n", p
33f50 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72  Page->pgno, pPar
33f60 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e  ent->pgno));.#en
33f70 64 69 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69  dif..  /* At thi
33f80 73 20 70 6f 69 6e 74 20 70 50 61 72 65 6e 74 20  s point pParent 
33f90 6d 61 79 20 68 61 76 65 20 61 74 20 6d 6f 73 74  may have at most
33fa0 20 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   one overflow ce
33fb0 6c 6c 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20  ll. And if.  ** 
33fc0 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 63 65  this overflow ce
33fd0 6c 6c 20 69 73 20 70 72 65 73 65 6e 74 2c 20 69  ll is present, i
33fe0 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 63 65  t must be the ce
33ff0 6c 6c 20 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e  ll with .  ** in
34000 64 65 78 20 69 50 61 72 65 6e 74 49 64 78 2e 20  dex iParentIdx. 
34010 54 68 69 73 20 73 63 65 6e 61 72 69 6f 20 63 6f  This scenario co
34020 6d 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20 74  mes about when t
34030 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  his function.  *
34040 2a 20 69 73 20 63 61 6c 6c 65 64 20 28 69 6e 64  * is called (ind
34050 69 72 65 63 74 6c 79 29 20 66 72 6f 6d 20 73 71  irectly) from sq
34060 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
34070 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ()..  */.  asser
34080 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  t( pParent->nOve
34090 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72  rflow==0 || pPar
340a0 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  ent->nOverflow==
340b0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
340c0 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
340d0 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d  w==0 || pParent-
340e0 3e 61 69 4f 76 66 6c 5b 30 5d 3d 3d 69 50 61 72  >aiOvfl[0]==iPar
340f0 65 6e 74 49 64 78 20 29 3b 0a 0a 20 20 69 66 28  entIdx );..  if(
34100 20 21 61 4f 76 66 6c 53 70 61 63 65 20 29 7b 0a   !aOvflSpace ){.
34110 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
34120 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
34130 2f 2a 20 46 69 6e 64 20 74 68 65 20 73 69 62 6c  /* Find the sibl
34140 69 6e 67 20 70 61 67 65 73 20 74 6f 20 62 61 6c  ing pages to bal
34150 61 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61 74  ance. Also locat
34160 65 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70  e the cells in p
34170 50 61 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68 61  Parent .  ** tha
34180 74 20 64 69 76 69 64 65 20 74 68 65 20 73 69 62  t divide the sib
34190 6c 69 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d 70  lings. An attemp
341a0 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e  t is made to fin
341b0 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e  d NN siblings on
341c0 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 73 69   .  ** either si
341d0 64 65 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f 72  de of pPage. Mor
341e0 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74  e siblings are t
341f0 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69  aken from one si
34200 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20 20  de, however, .  
34210 2a 2a 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ** if there are 
34220 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69  fewer than NN si
34230 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74  blings on the ot
34240 68 65 72 20 73 69 64 65 2e 20 49 66 20 70 50 61  her side. If pPa
34250 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42  rent.  ** has NB
34260 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64 72   or fewer childr
34270 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c  en then all chil
34280 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20  dren of pParent 
34290 61 72 65 20 74 61 6b 65 6e 2e 20 20 0a 20 20 2a  are taken.  .  *
342a0 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70  *.  ** This loop
342b0 20 61 6c 73 6f 20 64 72 6f 70 73 20 74 68 65 20   also drops the 
342c0 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72  divider cells fr
342d0 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  om the parent pa
342e0 67 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 77 61  ge. This.  ** wa
342f0 79 2c 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72  y, the remainder
34300 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
34310 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
34320 6f 20 64 65 61 6c 20 77 69 74 68 20 61 6e 79 0a  o deal with any.
34330 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 63 65    ** overflow ce
34340 6c 6c 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e  lls in the paren
34350 74 20 70 61 67 65 2c 20 73 69 6e 63 65 20 69 66  t page, since if
34360 20 61 6e 79 20 65 78 69 73 74 65 64 20 74 68 65   any existed the
34370 79 20 77 69 6c 6c 0a 20 20 2a 2a 20 68 61 76 65  y will.  ** have
34380 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65   already been re
34390 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 20  moved..  */.  i 
343a0 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  = pParent->nOver
343b0 66 6c 6f 77 20 2b 20 70 50 61 72 65 6e 74 2d 3e  flow + pParent->
343c0 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20 69 3c 32  nCell;.  if( i<2
343d0 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20   ){.    nxDiv = 
343e0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
343f0 61 73 73 65 72 74 28 20 62 42 75 6c 6b 3d 3d 30  assert( bBulk==0
34400 20 7c 7c 20 62 42 75 6c 6b 3d 3d 31 20 29 3b 0a   || bBulk==1 );.
34410 20 20 20 20 69 66 28 20 69 50 61 72 65 6e 74 49      if( iParentI
34420 64 78 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20  dx==0 ){        
34430 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
34440 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 20 20 7d  nxDiv = 0;.    }
34450 65 6c 73 65 20 69 66 28 20 69 50 61 72 65 6e 74  else if( iParent
34460 49 64 78 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20  Idx==i ){.      
34470 6e 78 44 69 76 20 3d 20 69 2d 32 2b 62 42 75 6c  nxDiv = i-2+bBul
34480 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
34490 20 20 20 20 61 73 73 65 72 74 28 20 62 42 75 6c      assert( bBul
344a0 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 78  k==0 );.      nx
344b0 44 69 76 20 3d 20 69 50 61 72 65 6e 74 49 64 78  Div = iParentIdx
344c0 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20  -1;.    }.    i 
344d0 3d 20 32 2d 62 42 75 6c 6b 3b 0a 20 20 7d 0a 20  = 2-bBulk;.  }. 
344e0 20 6e 4f 6c 64 20 3d 20 69 2b 31 3b 0a 20 20 69   nOld = i+1;.  i
344f0 66 28 20 28 69 2b 6e 78 44 69 76 2d 70 50 61 72  f( (i+nxDiv-pPar
34500 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3d  ent->nOverflow)=
34510 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
34520 29 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20  ){.    pRight = 
34530 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
34540 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
34550 65 74 2b 38 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  et+8];.  }else{.
34560 20 20 20 20 70 52 69 67 68 74 20 3d 20 66 69 6e      pRight = fin
34570 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
34580 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e  +nxDiv-pParent->
34590 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 7d 0a  nOverflow);.  }.
345a0 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
345b0 65 28 70 52 69 67 68 74 29 3b 0a 20 20 77 68 69  e(pRight);.  whi
345c0 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 72 63 20  le( 1 ){.    rc 
345d0 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
345e0 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 61 70 4f  (pBt, pgno, &apO
345f0 6c 64 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20 69  ld[i], 0);.    i
34600 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 6d  f( rc ){.      m
34610 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20  emset(apOld, 0, 
34620 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d  (i+1)*sizeof(Mem
34630 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20 67  Page*));.      g
34640 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
34650 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  nup;.    }.    n
34660 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70  MaxCells += 1+ap
34670 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70  Old[i]->nCell+ap
34680 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f  Old[i]->nOverflo
34690 77 3b 0a 20 20 20 20 69 66 28 20 28 69 2d 2d 29  w;.    if( (i--)
346a0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  ==0 ) break;..  
346b0 20 20 69 66 28 20 69 2b 6e 78 44 69 76 3d 3d 70    if( i+nxDiv==p
346c0 50 61 72 65 6e 74 2d 3e 61 69 4f 76 66 6c 5b 30  Parent->aiOvfl[0
346d0 5d 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 4f  ] && pParent->nO
346e0 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
346f0 20 61 70 44 69 76 5b 69 5d 20 3d 20 70 50 61 72   apDiv[i] = pPar
34700 65 6e 74 2d 3e 61 70 4f 76 66 6c 5b 30 5d 3b 0a  ent->apOvfl[0];.
34710 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74        pgno = get
34720 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b  4byte(apDiv[i]);
34730 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20  .      szNew[i] 
34740 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
34750 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29  arent, apDiv[i])
34760 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
34770 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
34780 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34790 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64   apDiv[i] = find
347a0 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b  Cell(pParent, i+
347b0 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e  nxDiv-pParent->n
347c0 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20  Overflow);.     
347d0 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
347e0 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20  (apDiv[i]);.    
347f0 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c    szNew[i] = cel
34800 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74  lSizePtr(pParent
34810 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 0a 20 20  , apDiv[i]);..  
34820 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
34830 63 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20 70 61  cell from the pa
34840 72 65 6e 74 20 70 61 67 65 2e 20 61 70 44 69 76  rent page. apDiv
34850 5b 69 5d 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73  [i] still points
34860 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   to.      ** the
34870 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 74 68 65   cell within the
34880 20 70 61 72 65 6e 74 2c 20 65 76 65 6e 20 74 68   parent, even th
34890 6f 75 67 68 20 69 74 20 68 61 73 20 62 65 65 6e  ough it has been
348a0 20 64 72 6f 70 70 65 64 2e 0a 20 20 20 20 20 20   dropped..      
348b0 2a 2a 20 54 68 69 73 20 69 73 20 73 61 66 65 20  ** This is safe 
348c0 62 65 63 61 75 73 65 20 64 72 6f 70 70 69 6e 67  because dropping
348d0 20 61 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65   a cell only ove
348e0 72 77 72 69 74 65 73 20 74 68 65 20 66 69 72 73  rwrites the firs
348f0 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20  t.      ** four 
34900 62 79 74 65 73 20 6f 66 20 69 74 2c 20 61 6e 64  bytes of it, and
34910 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   this function d
34920 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 68 65  oes not need the
34930 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20   first.      ** 
34940 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 74 68  four bytes of th
34950 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20  e divider cell. 
34960 53 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69  So the pointer i
34970 73 20 73 61 66 65 20 74 6f 20 75 73 65 0a 20 20  s safe to use.  
34980 20 20 20 20 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e      ** later on.
34990 20 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20    .      **.    
349a0 20 20 2a 2a 20 42 75 74 20 6e 6f 74 20 69 66 20    ** But not if 
349b0 77 65 20 61 72 65 20 69 6e 20 73 65 63 75 72 65  we are in secure
349c0 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49 6e  -delete mode. In
349d0 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d   secure-delete m
349e0 6f 64 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ode,.      ** th
349f0 65 20 64 72 6f 70 43 65 6c 6c 28 29 20 72 6f 75  e dropCell() rou
34a00 74 69 6e 65 20 77 69 6c 6c 20 6f 76 65 72 77 72  tine will overwr
34a10 69 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 63  ite the entire c
34a20 65 6c 6c 20 77 69 74 68 20 7a 65 72 6f 65 73 2e  ell with zeroes.
34a30 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  .      ** In thi
34a40 73 20 63 61 73 65 2c 20 74 65 6d 70 6f 72 61 72  s case, temporar
34a50 69 6c 79 20 63 6f 70 79 20 74 68 65 20 63 65 6c  ily copy the cel
34a60 6c 20 69 6e 74 6f 20 74 68 65 20 61 4f 76 66 6c  l into the aOvfl
34a70 53 70 61 63 65 5b 5d 0a 20 20 20 20 20 20 2a 2a  Space[].      **
34a80 20 62 75 66 66 65 72 2e 20 49 74 20 77 69 6c 6c   buffer. It will
34a90 20 62 65 20 63 6f 70 69 65 64 20 6f 75 74 20 61   be copied out a
34aa0 67 61 69 6e 20 61 73 20 73 6f 6f 6e 20 61 73 20  gain as soon as 
34ab0 74 68 65 20 61 53 70 61 63 65 5b 5d 20 62 75 66  the aSpace[] buf
34ac0 66 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  fer.      ** is 
34ad0 61 6c 6c 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 20  allocated.  */. 
34ae0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62 74       if( pBt->bt
34af0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
34b00 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  URE_DELETE ){.  
34b10 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a        int iOff;.
34b20 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d 20  .        iOff = 
34b30 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
34b40 54 28 61 70 44 69 76 5b 69 5d 29 20 2d 20 53 51  T(apDiv[i]) - SQ
34b50 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
34b60 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b  pParent->aData);
34b70 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 69 4f  .        if( (iO
34b80 66 66 2b 73 7a 4e 65 77 5b 69 5d 29 3e 28 69 6e  ff+szNew[i])>(in
34b90 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  t)pBt->usableSiz
34ba0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
34bb0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
34bc0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
34bd0 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c     memset(apOld,
34be0 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66   0, (i+1)*sizeof
34bf0 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20  (MemPage*));.   
34c00 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
34c10 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
34c20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
34c30 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 4f        memcpy(&aO
34c40 76 66 6c 53 70 61 63 65 5b 69 4f 66 66 5d 2c 20  vflSpace[iOff], 
34c50 61 70 44 69 76 5b 69 5d 2c 20 73 7a 4e 65 77 5b  apDiv[i], szNew[
34c60 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  i]);.          a
34c70 70 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76 66 6c  pDiv[i] = &aOvfl
34c80 53 70 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d 70  Space[apDiv[i]-p
34c90 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d 3b 0a  Parent->aData];.
34ca0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34cb0 7d 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c  }.      dropCell
34cc0 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69  (pParent, i+nxDi
34cd0 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  v-pParent->nOver
34ce0 66 6c 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d 2c 20  flow, szNew[i], 
34cf0 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
34d00 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43  .  /* Make nMaxC
34d10 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20  ells a multiple 
34d20 6f 66 20 34 20 69 6e 20 6f 72 64 65 72 20 74 6f  of 4 in order to
34d30 20 70 72 65 73 65 72 76 65 20 38 2d 62 79 74 65   preserve 8-byte
34d40 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20  .  ** alignment 
34d50 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d  */.  nMaxCells =
34d60 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29   (nMaxCells + 3)
34d70 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  &~3;..  /*.  ** 
34d80 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
34d90 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  or memory struct
34da0 75 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20  ures.  */.  k = 
34db0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  pBt->pageSize + 
34dc0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65  ROUND8(sizeof(Me
34dd0 6d 50 61 67 65 29 29 3b 0a 20 20 73 7a 53 63 72  mPage));.  szScr
34de0 61 74 63 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d  atch =.       nM
34df0 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75  axCells*sizeof(u
34e00 38 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  8*)             
34e10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43            /* apC
34e20 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d  ell */.     + nM
34e30 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75  axCells*sizeof(u
34e40 31 36 29 20 20 20 20 20 20 20 20 20 20 20 20 20  16)             
34e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43            /* szC
34e60 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42  ell */.     + pB
34e70 74 2d 3e 70 61 67 65 53 69 7a 65 20 20 20 20 20  t->pageSize     
34e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34e90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70            /* aSp
34ea0 61 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20 6b  ace1 */.     + k
34eb0 2a 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20  *nOld;          
34ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34ed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
34ee0 67 65 20 63 6f 70 69 65 73 20 28 61 70 43 6f 70  ge copies (apCop
34ef0 79 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d  y) */.  apCell =
34f00 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d   sqlite3ScratchM
34f10 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74 63 68  alloc( szScratch
34f20 20 29 3b 20 0a 20 20 69 66 28 20 61 70 43 65 6c   ); .  if( apCel
34f30 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
34f40 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
34f50 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
34f60 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73  cleanup;.  }.  s
34f70 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61  zCell = (u16*)&a
34f80 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d  pCell[nMaxCells]
34f90 3b 0a 20 20 61 53 70 61 63 65 31 20 3d 20 28 75  ;.  aSpace1 = (u
34fa0 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43  8*)&szCell[nMaxC
34fb0 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28  ells];.  assert(
34fc0 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
34fd0 4e 4d 45 4e 54 28 61 53 70 61 63 65 31 29 20 29  NMENT(aSpace1) )
34fe0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61  ;..  /*.  ** Loa
34ff0 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c  d pointers to al
35000 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69  l cells on sibli
35010 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74 68 65  ng pages and the
35020 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20   divider cells. 
35030 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63   ** into the loc
35040 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61  al apCell[] arra
35050 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20  y.  Make copies 
35060 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63  of the divider c
35070 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73  ells.  ** into s
35080 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72  pace obtained fr
35090 6f 6d 20 61 53 70 61 63 65 31 5b 5d 20 61 6e 64  om aSpace1[] and
350a0 20 72 65 6d 6f 76 65 20 74 68 65 20 64 69 76 69   remove the divi
350b0 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 66  der cells.  ** f
350c0 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a  rom pParent..  *
350d0 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69  *.  ** If the si
350e0 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65  blings are on le
350f0 61 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74  af pages, then t
35100 68 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  he child pointer
35110 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69  s of the.  ** di
35120 76 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20  vider cells are 
35130 73 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68  stripped from th
35140 65 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74  e cells before t
35150 68 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20  hey are copied. 
35160 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31   ** into aSpace1
35170 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79  [].  In this way
35180 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  , all cells in a
35190 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68  pCell[] are with
351a0 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70  out.  ** child p
351b0 6f 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62  ointers.  If sib
351c0 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65  lings are not le
351d0 61 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63  aves, then all c
351e0 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65  ell in.  ** apCe
351f0 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69  ll[] include chi
35200 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69  ld pointers.  Ei
35210 74 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65  ther way, all ce
35220 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a  lls in apCell[].
35230 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a    ** are alike..
35240 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f    **.  ** leafCo
35250 72 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20  rrection:  4 if 
35260 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e  pPage is a leaf.
35270 20 20 30 20 69 66 20 70 50 61 67 65 20 69 73 20    0 if pPage is 
35280 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a  not a leaf..  **
35290 20 20 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a         leafData:
352a0 20 20 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c    1 if pPage hol
352b0 64 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20  ds key+data and 
352c0 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e  pParent holds on
352d0 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20  ly keys..  */.  
352e0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d  leafCorrection =
352f0 20 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65 61 66 2a   apOld[0]->leaf*
35300 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d 20  4;.  leafData = 
35310 61 70 4f 6c 64 5b 30 5d 2d 3e 68 61 73 44 61 74  apOld[0]->hasDat
35320 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  a;.  for(i=0; i<
35330 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nOld; i++){.    
35340 69 6e 74 20 6c 69 6d 69 74 3b 0a 20 20 20 20 0a  int limit;.    .
35350 20 20 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f      /* Before do
35360 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73  ing anything els
35370 65 2c 20 74 61 6b 65 20 61 20 63 6f 70 79 20 6f  e, take a copy o
35380 66 20 74 68 65 20 69 27 74 68 20 6f 72 69 67 69  f the i'th origi
35390 6e 61 6c 20 73 69 62 6c 69 6e 67 0a 20 20 20 20  nal sibling.    
353a0 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20 74  ** The rest of t
353b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
353c0 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d 20  l use data from 
353d0 74 68 65 20 63 6f 70 69 65 73 20 72 61 74 68 65  the copies rathe
353e0 72 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68  r.    ** that th
353f0 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  e original pages
35400 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69   since the origi
35410 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62  nal pages will b
35420 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  e in the.    ** 
35430 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67  process of being
35440 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a   overwritten.  *
35450 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
35460 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20  Old = apCopy[i] 
35470 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26 61 53 70  = (MemPage*)&aSp
35480 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65 53 69  ace1[pBt->pageSi
35490 7a 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20 20 20 6d  ze + k*i];.    m
354a0 65 6d 63 70 79 28 70 4f 6c 64 2c 20 61 70 4f 6c  emcpy(pOld, apOl
354b0 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d  d[i], sizeof(Mem
354c0 50 61 67 65 29 29 3b 0a 20 20 20 20 70 4f 6c 64  Page));.    pOld
354d0 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f 69 64 2a  ->aData = (void*
354e0 29 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20 20 20 6d  )&pOld[1];.    m
354f0 65 6d 63 70 79 28 70 4f 6c 64 2d 3e 61 44 61 74  emcpy(pOld->aDat
35500 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61  a, apOld[i]->aDa
35510 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  ta, pBt->pageSiz
35520 65 29 3b 0a 0a 20 20 20 20 6c 69 6d 69 74 20 3d  e);..    limit =
35530 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c   pOld->nCell+pOl
35540 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  d->nOverflow;.  
35550 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76 65    if( pOld->nOve
35560 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20  rflow>0 ){.     
35570 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69   for(j=0; j<limi
35580 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t; j++){.       
35590 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e   assert( nCell<n
355a0 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
355b0 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c      apCell[nCell
355c0 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77  ] = findOverflow
355d0 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20  Cell(pOld, j);. 
355e0 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
355f0 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  ell] = cellSizeP
35600 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b  tr(pOld, apCell[
35610 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 20  nCell]);.       
35620 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20   nCell++;.      
35630 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
35640 20 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20 70     u8 *aData = p
35650 4f 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  Old->aData;.    
35660 20 20 75 31 36 20 6d 61 73 6b 50 61 67 65 20 3d    u16 maskPage =
35670 20 70 4f 6c 64 2d 3e 6d 61 73 6b 50 61 67 65 3b   pOld->maskPage;
35680 0a 20 20 20 20 20 20 75 31 36 20 63 65 6c 6c 4f  .      u16 cellO
35690 66 66 73 65 74 20 3d 20 70 4f 6c 64 2d 3e 63 65  ffset = pOld->ce
356a0 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  llOffset;.      
356b0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74  for(j=0; j<limit
356c0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
356d0 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d  assert( nCell<nM
356e0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
356f0 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     apCell[nCell]
35700 20 3d 20 66 69 6e 64 43 65 6c 6c 76 32 28 61 44   = findCellv2(aD
35710 61 74 61 2c 20 6d 61 73 6b 50 61 67 65 2c 20 63  ata, maskPage, c
35720 65 6c 6c 4f 66 66 73 65 74 2c 20 6a 29 3b 0a 20  ellOffset, j);. 
35730 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
35740 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  ell] = cellSizeP
35750 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b  tr(pOld, apCell[
35760 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 20  nCell]);.       
35770 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20   nCell++;.      
35780 7d 0a 20 20 20 20 7d 20 20 20 20 20 20 20 0a 20  }.    }       . 
35790 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20     if( i<nOld-1 
357a0 26 26 20 21 6c 65 61 66 44 61 74 61 29 7b 0a 20  && !leafData){. 
357b0 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20 28 75       u16 sz = (u
357c0 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20 20  16)szNew[i];.   
357d0 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20     u8 *pTemp;.  
357e0 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
357f0 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
35800 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
35810 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 70  l] = sz;.      p
35820 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 31 5b  Temp = &aSpace1[
35830 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20 20 20  iSpace1];.      
35840 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20  iSpace1 += sz;. 
35850 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c       assert( sz<
35860 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 32  =pBt->maxLocal+2
35870 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  3 );.      asser
35880 74 28 20 69 53 70 61 63 65 31 20 3c 3d 20 28 69  t( iSpace1 <= (i
35890 6e 74 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  nt)pBt->pageSize
358a0 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
358b0 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d  (pTemp, apDiv[i]
358c0 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 61 70 43  , sz);.      apC
358d0 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65  ell[nCell] = pTe
358e0 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  mp+leafCorrectio
358f0 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  n;.      assert(
35900 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
35910 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72 65 63  =0 || leafCorrec
35920 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20  tion==4 );.     
35930 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
35940 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d   szCell[nCell] -
35950 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
35960 0a 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c 64  .      if( !pOld
35970 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
35980 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f    assert( leafCo
35990 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20  rrection==0 );. 
359a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
359b0 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d  Old->hdrOffset==
359c0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 );.        /* 
359d0 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74 65  The right pointe
359e0 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
359f0 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73  age pOld becomes
35a00 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20 20   the left.      
35a10 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20    ** pointer of 
35a20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
35a30 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   */.        memc
35a40 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  py(apCell[nCell]
35a50 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 38  , &pOld->aData[8
35a60 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ], 4);.      }el
35a70 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
35a80 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
35a90 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20  on==4 );.       
35aa0 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c   if( szCell[nCel
35ab0 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20  l]<4 ){.        
35ac0 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f    /* Do not allo
35ad0 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c  w any cells smal
35ae0 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74 65 73  ler than 4 bytes
35af0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  . */.          s
35b00 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34  zCell[nCell] = 4
35b10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
35b20 20 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b    }.      nCell+
35b30 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  +;.    }.  }..  
35b40 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20 6f  /*.  ** Figure o
35b50 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ut the number of
35b60 20 70 61 67 65 73 20 6e 65 65 64 65 64 20 74 6f   pages needed to
35b70 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20   hold all nCell 
35b80 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72  cells..  ** Stor
35b90 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69 6e  e this number in
35ba0 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70   "k".  Also comp
35bb0 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63  ute szNew[] whic
35bc0 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a 20  h is the total. 
35bd0 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20   ** size of all 
35be0 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74  cells on the i-t
35bf0 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e 65  h page and cntNe
35c00 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65  w[] which is the
35c10 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61   index.  ** in a
35c20 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63  pCell[] of the c
35c30 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65 73  ell that divides
35c40 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61 67   page i from pag
35c50 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e  e i+1.  .  ** cn
35c60 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65  tNew[k] should e
35c70 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a  qual nCell..  **
35c80 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d  .  ** Values com
35c90 70 75 74 65 64 20 62 79 20 74 68 69 73 20 62 6c  puted by this bl
35ca0 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ock:.  **.  **  
35cb0 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65 20           k: The 
35cc0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
35cd0 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20 20  sibling pages.  
35ce0 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20  **    szNew[i]: 
35cf0 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20 74  Spaced used on t
35d00 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20  he i-th sibling 
35d10 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74  page..  **   cnt
35d20 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e  New[i]: Index in
35d30 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a   apCell[] and sz
35d40 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66  Cell[] for the f
35d50 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a  irst cell to.  *
35d60 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
35d70 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20  he right of the 
35d80 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67  i-th sibling pag
35d90 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53 70  e..  ** usableSp
35da0 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62  ace: Number of b
35db0 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 76  ytes of space av
35dc0 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68 20  ailable on each 
35dd0 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20  sibling..  ** . 
35de0 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61 63   */.  usableSpac
35df0 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
35e00 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66 43  ize - 12 + leafC
35e10 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72  orrection;.  for
35e20 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b  (subtotal=k=i=0;
35e30 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
35e40 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4d      assert( i<nM
35e50 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73  axCells );.    s
35e60 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c  ubtotal += szCel
35e70 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66  l[i] + 2;.    if
35e80 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73 61  ( subtotal > usa
35e90 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20 20  bleSpace ){.    
35ea0 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62    szNew[k] = sub
35eb0 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69  total - szCell[i
35ec0 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b  ];.      cntNew[
35ed0 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66  k] = i;.      if
35ee0 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69 2d  ( leafData ){ i-
35ef0 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74 6f  -; }.      subto
35f00 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b  tal = 0;.      k
35f10 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3e  ++;.      if( k>
35f20 4e 42 2b 31 20 29 7b 20 72 63 20 3d 20 53 51 4c  NB+1 ){ rc = SQL
35f30 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
35f40 3b 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ; goto balance_c
35f50 6c 65 61 6e 75 70 3b 20 7d 0a 20 20 20 20 7d 0a  leanup; }.    }.
35f60 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d    }.  szNew[k] =
35f70 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74   subtotal;.  cnt
35f80 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a  New[k] = nCell;.
35f90 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a    k++;..  /*.  *
35fa0 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f  * The packing co
35fb0 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 70 72  mputed by the pr
35fc0 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20  evious block is 
35fd0 62 69 61 73 65 64 20 74 6f 77 61 72 64 20 74 68  biased toward th
35fe0 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20  e siblings.  ** 
35ff0 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64 65  on the left side
36000 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c  .  The left sibl
36010 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73 20  ings are always 
36020 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69  nearly full, whi
36030 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68  le the.  ** righ
36040 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d  t-most sibling m
36050 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65  ight be nearly e
36060 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63  mpty.  This bloc
36070 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70  k of code attemp
36080 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73  ts.  ** to adjus
36090 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66  t the packing of
360a0 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74   siblings to get
360b0 20 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63   a better balanc
360c0 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
360d0 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20  s adjustment is 
360e0 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74  more than an opt
360f0 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20  imization.  The 
36100 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69  packing above mi
36110 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f  ght.  ** be so o
36120 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73  ut of balance as
36130 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20   to be illegal. 
36140 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   For example, th
36150 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
36160 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20  * sibling might 
36170 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d  be completely em
36180 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73  pty.  This adjus
36190 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74  tment is not opt
361a0 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ional..  */.  fo
361b0 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d  r(i=k-1; i>0; i-
361c0 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69  -){.    int szRi
361d0 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20  ght = szNew[i]; 
361e0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c   /* Size of sibl
361f0 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ing on the right
36200 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65   */.    int szLe
36210 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b  ft = szNew[i-1];
36220 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c   /* Size of sibl
36230 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  ing on the left 
36240 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20  */.    int r;   
36250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
36260 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73  dex of right-mos
36270 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73  t cell in left s
36280 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e  ibling */.    in
36290 74 20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  t d;            
362a0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69    /* Index of fi
362b0 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20  rst cell to the 
362c0 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20 73 69  left of right si
362d0 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20  bling */..    r 
362e0 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20  = cntNew[i-1] - 
362f0 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31  1;.    d = r + 1
36300 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20   - leafData;.   
36310 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43   assert( d<nMaxC
36320 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65  ells );.    asse
36330 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( r<nMaxCells 
36340 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a  );.    while( sz
36350 52 69 67 68 74 3d 3d 30 20 0a 20 20 20 20 20 20  Right==0 .      
36360 20 7c 7c 20 28 21 62 42 75 6c 6b 20 26 26 20 73   || (!bBulk && s
36370 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d  zRight+szCell[d]
36380 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65  +2<=szLeft-(szCe
36390 6c 6c 5b 72 5d 2b 32 29 29 20 0a 20 20 20 20 29  ll[r]+2)) .    )
363a0 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74 20  {.      szRight 
363b0 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32  += szCell[d] + 2
363c0 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d  ;.      szLeft -
363d0 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b  = szCell[r] + 2;
363e0 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d  .      cntNew[i-
363f0 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20  1]--;.      r = 
36400 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b  cntNew[i-1] - 1;
36410 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31  .      d = r + 1
36420 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20   - leafData;.   
36430 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20   }.    szNew[i] 
36440 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73  = szRight;.    s
36450 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65  zNew[i-1] = szLe
36460 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69  ft;.  }..  /* Ei
36470 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e  ther we found on
36480 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20  e or more cells 
36490 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f  (cntnew[0])>0) o
364a0 72 20 70 50 61 67 65 20 69 73 0a 20 20 2a 2a 20  r pPage is.  ** 
364b0 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  a virtual root p
364c0 61 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20  age.  A virtual 
364d0 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68 65  root page is whe
364e0 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a  n the real root.
364f0 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67    ** page is pag
36500 65 20 31 20 61 6e 64 20 77 65 20 61 72 65 20 74  e 1 and we are t
36510 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66  he only child of
36520 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2a   that page..  **
36530 0a 20 20 2a 2a 20 55 50 44 41 54 45 3a 20 20 54  .  ** UPDATE:  T
36540 68 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f  he assert() belo
36550 77 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  w is not necessa
36560 72 69 6c 79 20 74 72 75 65 20 69 66 20 74 68 65  rily true if the
36570 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 66   database.  ** f
36580 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2e 20  ile is corrupt. 
36590 20 54 68 65 20 63 6f 72 72 75 70 74 69 6f 6e 20   The corruption 
365a0 77 69 6c 6c 20 62 65 20 64 65 74 65 63 74 65 64  will be detected
365b0 20 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c 61   and reported la
365c0 74 65 72 0a 20 20 2a 2a 20 69 6e 20 74 68 69 73  ter.  ** in this
365d0 20 70 72 6f 63 65 64 75 72 65 20 73 6f 20 74 68   procedure so th
365e0 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
365f0 6f 20 61 63 74 20 75 70 6f 6e 20 69 74 20 6e 6f  o act upon it no
36600 77 2e 0a 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20  w..  */.#if 0.  
36610 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30  assert( cntNew[0
36620 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d  ]>0 || (pParent-
36630 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72  >pgno==1 && pPar
36640 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29  ent->nCell==0) )
36650 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 54 52 41 43  ;.#endif..  TRAC
36660 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64  E(("BALANCE: old
36670 3a 20 25 64 20 25 64 20 25 64 20 20 22 2c 0a 20  : %d %d %d  ",. 
36680 20 20 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e     apOld[0]->pgn
36690 6f 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20  o, .    nOld>=2 
366a0 3f 20 61 70 4f 6c 64 5b 31 5d 2d 3e 70 67 6e 6f  ? apOld[1]->pgno
366b0 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d   : 0,.    nOld>=
366c0 33 20 3f 20 61 70 4f 6c 64 5b 32 5d 2d 3e 70 67  3 ? apOld[2]->pg
366d0 6e 6f 20 3a 20 30 0a 20 20 29 29 3b 0a 0a 20 20  no : 0.  ));..  
366e0 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  /*.  ** Allocate
366f0 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52   k new pages.  R
36700 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77  euse old pages w
36710 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20  here possible.. 
36720 20 2a 2f 0a 20 20 69 66 28 20 61 70 4f 6c 64 5b   */.  if( apOld[
36730 30 5d 2d 3e 70 67 6e 6f 3c 3d 31 20 29 7b 0a 20  0]->pgno<=1 ){. 
36740 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
36750 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
36760 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
36770 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 70 61 67  eanup;.  }.  pag
36780 65 46 6c 61 67 73 20 3d 20 61 70 4f 6c 64 5b 30  eFlags = apOld[0
36790 5d 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66  ]->aData[0];.  f
367a0 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b  or(i=0; i<k; i++
367b0 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
367c0 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c  pNew;.    if( i<
367d0 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e  nOld ){.      pN
367e0 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20  ew = apNew[i] = 
367f0 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20  apOld[i];.      
36800 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20  apOld[i] = 0;.  
36810 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36820 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 2d  PagerWrite(pNew-
36830 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
36840 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69   nNew++;.      i
36850 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
36860 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
36870 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
36880 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20  ssert( i>0 );.  
36890 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
368a0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
368b0 26 70 4e 65 77 2c 20 26 70 67 6e 6f 2c 20 28 62  &pNew, &pgno, (b
368c0 42 75 6c 6b 20 3f 20 31 20 3a 20 70 67 6e 6f 29  Bulk ? 1 : pgno)
368d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
368e0 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
368f0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
36900 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77   apNew[i] = pNew
36910 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a  ;.      nNew++;.
36920 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68  .      /* Set th
36930 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
36940 74 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77 20  try for the new 
36950 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f  sibling page. */
36960 0a 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54  .      if( ISAUT
36970 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
36980 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
36990 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54  , pNew->pgno, PT
369a0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72  RMAP_BTREE, pPar
369b0 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b  ent->pgno, &rc);
369c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
369d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
369e0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c          goto bal
369f0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
36a00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
36a10 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
36a20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67  Free any old pag
36a30 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74  es that were not
36a40 20 72 65 75 73 65 64 20 61 73 20 6e 65 77 20 70   reused as new p
36a50 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  ages..  */.  whi
36a60 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20  le( i<nOld ){.  
36a70 20 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64    freePage(apOld
36a80 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  [i], &rc);.    i
36a90 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
36aa0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
36ab0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
36ac0 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f  Old[i]);.    apO
36ad0 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69  ld[i] = 0;.    i
36ae0 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ++;.  }..  /*.  
36af0 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20 70  ** Put the new p
36b00 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e  ages in accendin
36b10 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68  g order.  This h
36b20 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65  elps to.  ** kee
36b30 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  p entries in the
36b40 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72   disk file in or
36b50 64 65 72 20 73 6f 20 74 68 61 74 20 61 20 73 63  der so that a sc
36b60 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74  an.  ** of the t
36b70 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72  able is a linear
36b80 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68   scan through th
36b90 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20  e file.  That.  
36ba0 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73  ** in turn helps
36bb0 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
36bc0 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72  ystem to deliver
36bd0 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d   pages.  ** from
36be0 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72   the disk more r
36bf0 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a  apidly..  **.  *
36c00 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65  * An O(n^2) inse
36c10 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72  rtion sort algor
36c20 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75  ithm is used, bu
36c30 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69  t since.  ** n i
36c40 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61  s never more tha
36c50 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f  n NB (a small co
36c60 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68  nstant), that sh
36c70 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65  ould.  ** not be
36c80 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a   a problem..  **
36c90 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33  .  ** When NB==3
36ca0 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d  , this one optim
36cb0 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68  ization makes th
36cc0 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
36cd0 61 62 6f 75 74 20 32 35 25 20 66 61 73 74 65 72  about 25% faster
36ce0 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72   for large inser
36cf0 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69  tions and deleti
36d00 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ons..  */.  for(
36d10 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29  i=0; i<k-1; i++)
36d20 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d  {.    int minV =
36d30 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b   apNew[i]->pgno;
36d40 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20  .    int minI = 
36d50 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31  i;.    for(j=i+1
36d60 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<k; j++){.   
36d70 20 20 20 69 66 28 20 61 70 4e 65 77 5b 6a 5d 2d     if( apNew[j]-
36d80 3e 70 67 6e 6f 3c 28 75 6e 73 69 67 6e 65 64 29  >pgno<(unsigned)
36d90 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20  minV ){.        
36da0 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20  minI = j;.      
36db0 20 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 6a    minV = apNew[j
36dc0 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d  ]->pgno;.      }
36dd0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d  .    }.    if( m
36de0 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 4d  inI>i ){.      M
36df0 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20  emPage *pT;.    
36e00 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b    pT = apNew[i];
36e10 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20  .      apNew[i] 
36e20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20  = apNew[minI];. 
36e30 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d       apNew[minI]
36e40 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d   = pT;.    }.  }
36e50 0a 20 20 54 52 41 43 45 28 28 22 6e 65 77 3a 20  .  TRACE(("new: 
36e60 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64  %d(%d) %d(%d) %d
36e70 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
36e80 64 29 5c 6e 22 2c 0a 20 20 20 20 61 70 4e 65 77  d)\n",.    apNew
36e90 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e 65 77  [0]->pgno, szNew
36ea0 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32  [0],.    nNew>=2
36eb0 20 3f 20 61 70 4e 65 77 5b 31 5d 2d 3e 70 67 6e   ? apNew[1]->pgn
36ec0 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f  o : 0, nNew>=2 ?
36ed0 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20   szNew[1] : 0,. 
36ee0 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 61 70 4e     nNew>=3 ? apN
36ef0 65 77 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c  ew[2]->pgno : 0,
36f00 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77   nNew>=3 ? szNew
36f10 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [2] : 0,.    nNe
36f20 77 3e 3d 34 20 3f 20 61 70 4e 65 77 5b 33 5d 2d  w>=4 ? apNew[3]-
36f30 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e  >pgno : 0, nNew>
36f40 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20  =4 ? szNew[3] : 
36f50 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f  0,.    nNew>=5 ?
36f60 20 61 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e 6f 20   apNew[4]->pgno 
36f70 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73  : 0, nNew>=5 ? s
36f80 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a  zNew[4] : 0));..
36f90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
36fa0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
36fb0 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
36fc0 67 65 29 20 29 3b 0a 20 20 70 75 74 34 62 79 74  ge) );.  put4byt
36fd0 65 28 70 52 69 67 68 74 2c 20 61 70 4e 65 77 5b  e(pRight, apNew[
36fe0 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a  nNew-1]->pgno);.
36ff0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c  .  /*.  ** Evenl
37000 79 20 64 69 73 74 72 69 62 75 74 65 20 74 68 65  y distribute the
37010 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b   data in apCell[
37020 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77  ] across the new
37030 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73   pages..  ** Ins
37040 65 72 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c  ert divider cell
37050 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61  s into pParent a
37060 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  s necessary..  *
37070 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72  /.  j = 0;.  for
37080 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b  (i=0; i<nNew; i+
37090 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d  +){.    /* Assem
370a0 62 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c  ble the new sibl
370b0 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ing page. */.   
370c0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d   MemPage *pNew =
370d0 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61   apNew[i];.    a
370e0 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c  ssert( j<nMaxCel
370f0 6c 73 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61  ls );.    zeroPa
37100 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61  ge(pNew, pageFla
37110 67 73 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c  gs);.    assembl
37120 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e  ePage(pNew, cntN
37130 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c  ew[i]-j, &apCell
37140 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29  [j], &szCell[j])
37150 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
37160 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28  ew->nCell>0 || (
37170 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65  nNew==1 && cntNe
37180 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20  w[0]==0) );.    
37190 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f  assert( pNew->nO
371a0 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20  verflow==0 );.. 
371b0 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d     j = cntNew[i]
371c0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
371d0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73   sibling page as
371e0 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61  sembled above wa
371f0 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d  s not the right-
37200 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20  most sibling,.  
37210 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69    ** insert a di
37220 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20  vider cell into 
37230 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
37240 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
37250 72 74 28 20 69 3c 6e 4e 65 77 2d 31 20 7c 7c 20  rt( i<nNew-1 || 
37260 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  j==nCell );.    
37270 69 66 28 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20  if( j<nCell ){. 
37280 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a       u8 *pCell;.
37290 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b        u8 *pTemp;
372a0 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a  .      int sz;..
372b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
372c0 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
372d0 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c     pCell = apCel
372e0 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d  l[j];.      sz =
372f0 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61   szCell[j] + lea
37300 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20  fCorrection;.   
37310 20 20 20 70 54 65 6d 70 20 3d 20 26 61 4f 76 66     pTemp = &aOvf
37320 6c 53 70 61 63 65 5b 69 4f 76 66 6c 53 70 61 63  lSpace[iOvflSpac
37330 65 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  e];.      if( !p
37340 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  New->leaf ){.   
37350 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
37360 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43 65  w->aData[8], pCe
37370 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65  ll, 4);.      }e
37380 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61 74 61  lse if( leafData
37390 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
373a0 66 20 74 68 65 20 74 72 65 65 20 69 73 20 61 20  f the tree is a 
373b0 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 20  leaf-data tree, 
373c0 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73  and the siblings
373d0 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a 20 20   are leaves, .  
373e0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
373f0 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69 64 65  ere is no divide
37400 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c  r cell in apCell
37410 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65  []. Instead, the
37420 20 64 69 76 69 64 65 72 20 0a 20 20 20 20 20 20   divider .      
37430 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73    ** cell consis
37440 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ts of the intege
37450 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72 69  r key for the ri
37460 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66  ght-most cell of
37470 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
37480 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20 61 73   sibling-page as
37490 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e  sembled above on
374a0 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ly..        */. 
374b0 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20         CellInfo 
374c0 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d  info;.        j-
374d0 2d 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65 65  -;.        btree
374e0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e 65  ParseCellPtr(pNe
374f0 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69  w, apCell[j], &i
37500 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 43  nfo);.        pC
37510 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20  ell = pTemp;.   
37520 20 20 20 20 20 73 7a 20 3d 20 34 20 2b 20 70 75       sz = 4 + pu
37530 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34  tVarint(&pCell[4
37540 5d 2c 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 20  ], info.nKey);. 
37550 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30         pTemp = 0
37560 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
37570 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20         pCell -= 
37580 34 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 62  4;.        /* Ob
37590 73 63 75 72 65 20 63 61 73 65 20 66 6f 72 20 6e  scure case for n
375a0 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74 72 65  on-leaf-data tre
375b0 65 73 3a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  es: If the cell 
375c0 61 74 20 70 43 65 6c 6c 20 77 61 73 0a 20 20 20  at pCell was.   
375d0 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73       ** previous
375e0 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c  ly stored on a l
375f0 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74  eaf node, and it
37600 73 20 72 65 70 6f 72 74 65 64 20 73 69 7a 65 20  s reported size 
37610 77 61 73 20 34 0a 20 20 20 20 20 20 20 20 2a 2a  was 4.        **
37620 20 62 79 74 65 73 2c 20 74 68 65 6e 20 69 74 20   bytes, then it 
37630 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62 65 20  may actually be 
37640 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69  smaller than thi
37650 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 73  s .        ** (s
37660 65 65 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ee btreeParseCel
37670 6c 50 74 72 28 29 2c 20 34 20 62 79 74 65 73 20  lPtr(), 4 bytes 
37680 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73  is the minimum s
37690 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  ize of.        *
376a0 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74  * any cell). But
376b0 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
376c0 20 74 6f 20 70 61 73 73 20 74 68 65 20 63 6f 72   to pass the cor
376d0 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a 20 20  rect size to .  
376e0 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 43        ** insertC
376f0 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61 72 73  ell(), so repars
37700 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a  e the cell now..
37710 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
37720 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
37730 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72 20 68  this can never h
37740 61 70 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69  appen in an SQLi
37750 74 65 20 64 61 74 61 20 66 69 6c 65 2c 20 61 73  te data file, as
37760 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20   all.        ** 
37770 63 65 6c 6c 73 20 61 72 65 20 61 74 20 6c 65 61  cells are at lea
37780 73 74 20 34 20 62 79 74 65 73 2e 20 49 74 20 6f  st 4 bytes. It o
37790 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 6e 20 62  nly happens in b
377a0 2d 74 72 65 65 73 20 75 73 65 64 0a 20 20 20 20  -trees used.    
377b0 20 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61      ** to evalua
377c0 74 65 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e  te "IN (SELECT .
377d0 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c 61 72  ..)" and similar
377e0 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20 20   clauses..      
377f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
37800 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b   szCell[j]==4 ){
37810 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
37820 74 28 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  t(leafCorrection
37830 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ==4);.          
37840 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  sz = cellSizePtr
37850 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29  (pParent, pCell)
37860 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
37870 20 20 7d 0a 20 20 20 20 20 20 69 4f 76 66 6c 53    }.      iOvflS
37880 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20  pace += sz;.    
37890 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42    assert( sz<=pB
378a0 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33 20 29  t->maxLocal+23 )
378b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
378c0 69 4f 76 66 6c 53 70 61 63 65 20 3c 3d 20 28 69  iOvflSpace <= (i
378d0 6e 74 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  nt)pBt->pageSize
378e0 20 29 3b 0a 20 20 20 20 20 20 69 6e 73 65 72 74   );.      insert
378f0 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Cell(pParent, nx
37900 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20  Div, pCell, sz, 
37910 70 54 65 6d 70 2c 20 70 4e 65 77 2d 3e 70 67 6e  pTemp, pNew->pgn
37920 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69  o, &rc);.      i
37930 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
37940 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
37950 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61  cleanup;.      a
37960 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
37970 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
37980 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
37990 20 29 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a   );..      j++;.
379a0 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20        nxDiv++;. 
379b0 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
379c0 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20  t( j==nCell );. 
379d0 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20   assert( nOld>0 
379e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65  );.  assert( nNe
379f0 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61  w>0 );.  if( (pa
37a00 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45  geFlags & PTF_LE
37a10 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38  AF)==0 ){.    u8
37a20 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70 43 6f   *zChild = &apCo
37a30 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74  py[nOld-1]->aDat
37a40 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  a[8];.    memcpy
37a50 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d  (&apNew[nNew-1]-
37a60 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c  >aData[8], zChil
37a70 64 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  d, 4);.  }..  if
37a80 28 20 69 73 52 6f 6f 74 20 26 26 20 70 50 61 72  ( isRoot && pPar
37a90 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26  ent->nCell==0 &&
37aa0 20 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66   pParent->hdrOff
37ab0 73 65 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e 6e  set<=apNew[0]->n
37ac0 46 72 65 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  Free ){.    /* T
37ad0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
37ae0 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 77 20 63  the b-tree now c
37af0 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73  ontains no cells
37b00 2e 20 54 68 65 20 6f 6e 6c 79 20 73 69 62 6c 69  . The only sibli
37b10 6e 67 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 69  ng.    ** page i
37b20 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  s the right-chil
37b30 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 2e  d of the parent.
37b40 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e   Copy the conten
37b50 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ts of the.    **
37b60 20 63 68 69 6c 64 20 70 61 67 65 20 69 6e 74 6f   child page into
37b70 20 74 68 65 20 70 61 72 65 6e 74 2c 20 64 65 63   the parent, dec
37b80 72 65 61 73 69 6e 67 20 74 68 65 20 6f 76 65 72  reasing the over
37b90 61 6c 6c 20 68 65 69 67 68 74 20 6f 66 20 74 68  all height of th
37ba0 65 0a 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20  e.    ** b-tree 
37bb0 73 74 72 75 63 74 75 72 65 20 62 79 20 6f 6e 65  structure by one
37bc0 2e 20 54 68 69 73 20 69 73 20 64 65 73 63 72 69  . This is descri
37bd0 62 65 64 20 61 73 20 74 68 65 20 22 62 61 6c 61  bed as the "bala
37be0 6e 63 65 2d 73 68 61 6c 6c 6f 77 65 72 22 0a 20  nce-shallower". 
37bf0 20 20 20 2a 2a 20 73 75 62 2d 61 6c 67 6f 72 69     ** sub-algori
37c00 74 68 6d 20 69 6e 20 73 6f 6d 65 20 64 6f 63 75  thm in some docu
37c10 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  mentation..    *
37c20 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73  *.    ** If this
37c30 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
37c40 75 6d 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  um database, the
37c50 20 63 61 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f 64   call to copyNod
37c60 65 43 6f 6e 74 65 6e 74 28 29 20 0a 20 20 20 20  eContent() .    
37c70 2a 2a 20 73 65 74 73 20 61 6c 6c 20 70 6f 69 6e  ** sets all poin
37c80 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
37c90 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
37ca0 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
37cb0 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 66 6f  pages .    ** fo
37cc0 72 20 77 68 69 63 68 20 74 68 65 20 70 6f 69 6e  r which the poin
37cd0 74 65 72 20 69 73 20 73 74 6f 72 65 64 20 77 69  ter is stored wi
37ce0 74 68 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  thin the content
37cf0 20 62 65 69 6e 67 20 63 6f 70 69 65 64 2e 0a 20   being copied.. 
37d00 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
37d10 20 73 65 63 6f 6e 64 20 61 73 73 65 72 74 20 62   second assert b
37d20 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68  elow verifies th
37d30 61 74 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  at the child pag
37d40 65 20 69 73 20 64 65 66 72 61 67 6d 65 6e 74 65  e is defragmente
37d50 64 0a 20 20 20 20 2a 2a 20 28 69 74 20 6d 75 73  d.    ** (it mus
37d60 74 20 62 65 2c 20 61 73 20 69 74 20 77 61 73 20  t be, as it was 
37d70 6a 75 73 74 20 72 65 63 6f 6e 73 74 72 75 63 74  just reconstruct
37d80 65 64 20 75 73 69 6e 67 20 61 73 73 65 6d 62 6c  ed using assembl
37d90 65 50 61 67 65 28 29 29 2e 20 54 68 69 73 0a 20  ePage()). This. 
37da0 20 20 20 2a 2a 20 69 73 20 69 6d 70 6f 72 74 61     ** is importa
37db0 6e 74 20 69 66 20 74 68 65 20 70 61 72 65 6e 74  nt if the parent
37dc0 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f   page happens to
37dd0 20 62 65 20 70 61 67 65 20 31 20 6f 66 20 74 68   be page 1 of th
37de0 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
37df0 2a 20 69 6d 61 67 65 2e 20 20 2a 2f 0a 20 20 20  * image.  */.   
37e00 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3d 3d 31   assert( nNew==1
37e10 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
37e20 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20  apNew[0]->nFree 
37e30 3d 3d 20 0a 20 20 20 20 20 20 20 20 28 67 65 74  == .        (get
37e40 32 62 79 74 65 28 26 61 70 4e 65 77 5b 30 5d 2d  2byte(&apNew[0]-
37e50 3e 61 44 61 74 61 5b 35 5d 29 2d 61 70 4e 65 77  >aData[5])-apNew
37e60 5b 30 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2d  [0]->cellOffset-
37e70 61 70 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a  apNew[0]->nCell*
37e80 32 29 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 63  2) .    );.    c
37e90 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 61  opyNodeContent(a
37ea0 70 4e 65 77 5b 30 5d 2c 20 70 50 61 72 65 6e 74  pNew[0], pParent
37eb0 2c 20 26 72 63 29 3b 0a 20 20 20 20 66 72 65 65  , &rc);.    free
37ec0 50 61 67 65 28 61 70 4e 65 77 5b 30 5d 2c 20 26  Page(apNew[0], &
37ed0 72 63 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  rc);.  }else if(
37ee0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
37ef0 0a 20 20 20 20 2f 2a 20 46 69 78 20 74 68 65 20  .    /* Fix the 
37f00 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
37f10 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 20  ies for all the 
37f20 63 65 6c 6c 73 20 74 68 61 74 20 77 65 72 65 20  cells that were 
37f30 73 68 69 66 74 65 64 20 61 72 6f 75 6e 64 2e 20  shifted around. 
37f40 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72  .    ** There ar
37f50 65 20 73 65 76 65 72 61 6c 20 64 69 66 66 65 72  e several differ
37f60 65 6e 74 20 74 79 70 65 73 20 6f 66 20 70 6f 69  ent types of poi
37f70 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
37f80 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 20 20   that need to.  
37f90 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69    ** be dealt wi
37fa0 74 68 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  th by this routi
37fb0 6e 65 2e 20 53 6f 6d 65 20 6f 66 20 74 68 65 73  ne. Some of thes
37fc0 65 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 20  e have been set 
37fd0 61 6c 72 65 61 64 79 2c 20 62 75 74 0a 20 20 20  already, but.   
37fe0 20 2a 2a 20 6d 61 6e 79 20 68 61 76 65 20 6e 6f   ** many have no
37ff0 74 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  t. The following
38000 20 69 73 20 61 20 73 75 6d 6d 61 72 79 3a 0a 20   is a summary:. 
38010 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 31     **.    **   1
38020 29 20 54 68 65 20 65 6e 74 72 69 65 73 20 61 73  ) The entries as
38030 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6e 65  sociated with ne
38040 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  w sibling pages 
38050 74 68 61 74 20 77 65 72 65 20 6e 6f 74 0a 20 20  that were not.  
38060 20 20 2a 2a 20 20 20 20 20 20 73 69 62 6c 69 6e    **      siblin
38070 67 73 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  gs when this fun
38080 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
38090 2e 20 54 68 65 73 65 20 68 61 76 65 20 61 6c 72  . These have alr
380a0 65 61 64 79 0a 20 20 20 20 2a 2a 20 20 20 20 20  eady.    **     
380b0 20 62 65 65 6e 20 73 65 74 2e 20 57 65 20 64 6f   been set. We do
380c0 6e 27 74 20 6e 65 65 64 20 74 6f 20 77 6f 72 72  n't need to worr
380d0 79 20 61 62 6f 75 74 20 6f 6c 64 20 73 69 62 6c  y about old sibl
380e0 69 6e 67 73 20 74 68 61 74 20 77 65 72 65 0a 20  ings that were. 
380f0 20 20 20 2a 2a 20 20 20 20 20 20 6d 6f 76 65 64     **      moved
38100 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
38110 74 20 2d 20 74 68 65 20 66 72 65 65 50 61 67 65  t - the freePage
38120 28 29 20 63 6f 64 65 20 68 61 73 20 74 61 6b 65  () code has take
38130 6e 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 20 20  n care.    **   
38140 20 20 20 6f 66 20 74 68 6f 73 65 2e 0a 20 20 20     of those..   
38150 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 32 29 20   **.    **   2) 
38160 54 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  The pointer-map 
38170 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74  entries associat
38180 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ed with the firs
38190 74 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a  t overflow.    *
381a0 2a 20 20 20 20 20 20 70 61 67 65 20 69 6e 20 61  *      page in a
381b0 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  ny overflow chai
381c0 6e 73 20 75 73 65 64 20 62 79 20 6e 65 77 20 64  ns used by new d
381d0 69 76 69 64 65 72 20 63 65 6c 6c 73 2e 20 54 68  ivider cells. Th
381e0 65 73 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  ese .    **     
381f0 20 68 61 76 65 20 61 6c 73 6f 20 61 6c 72 65 61   have also alrea
38200 64 79 20 62 65 65 6e 20 74 61 6b 65 6e 20 63 61  dy been taken ca
38210 72 65 20 6f 66 20 62 79 20 74 68 65 20 69 6e 73  re of by the ins
38220 65 72 74 43 65 6c 6c 28 29 20 63 6f 64 65 2e 0a  ertCell() code..
38230 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
38240 33 29 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  3) If the siblin
38250 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20  g pages are not 
38260 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65  leaves, then the
38270 20 63 68 69 6c 64 20 70 61 67 65 73 20 6f 66 0a   child pages of.
38280 20 20 20 20 2a 2a 20 20 20 20 20 20 63 65 6c 6c      **      cell
38290 73 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20  s stored on the 
382a0 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 6d 61  sibling pages ma
382b0 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64  y need to be upd
382c0 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ated..    **.   
382d0 20 2a 2a 20 20 20 34 29 20 49 66 20 74 68 65 20   **   4) If the 
382e0 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72  sibling pages ar
382f0 65 20 6e 6f 74 20 69 6e 74 65 72 6e 61 6c 20 69  e not internal i
38300 6e 74 6b 65 79 20 6e 6f 64 65 73 2c 20 74 68 65  ntkey nodes, the
38310 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 20 20 20  n any.    **    
38320 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73    overflow pages
38330 20 75 73 65 64 20 62 79 20 74 68 65 73 65 20 63   used by these c
38340 65 6c 6c 73 20 6d 61 79 20 6e 65 65 64 20 74 6f  ells may need to
38350 20 62 65 20 75 70 64 61 74 65 64 0a 20 20 20 20   be updated.    
38360 2a 2a 20 20 20 20 20 20 28 69 6e 74 65 72 6e 61  **      (interna
38370 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73 20 6e  l intkey nodes n
38380 65 76 65 72 20 63 6f 6e 74 61 69 6e 20 70 6f 69  ever contain poi
38390 6e 74 65 72 73 20 74 6f 20 6f 76 65 72 66 6c 6f  nters to overflo
383a0 77 20 70 61 67 65 73 29 2e 0a 20 20 20 20 2a 2a  w pages)..    **
383b0 0a 20 20 20 20 2a 2a 20 20 20 35 29 20 49 66 20  .    **   5) If 
383c0 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
383d0 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73  s are not leaves
383e0 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 69 6e 74  , then the point
383f0 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 20 20  er-map.    **   
38400 20 20 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74     entries for t
38410 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70  he right-child p
38420 61 67 65 73 20 6f 66 20 65 61 63 68 20 73 69 62  ages of each sib
38430 6c 69 6e 67 20 6d 61 79 20 6e 65 65 64 0a 20 20  ling may need.  
38440 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 62 65 20    **      to be 
38450 75 70 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a  updated..    **.
38460 20 20 20 20 2a 2a 20 43 61 73 65 73 20 31 20 61      ** Cases 1 a
38470 6e 64 20 32 20 61 72 65 20