/ Hex Artifact Content
Login

Artifact 34ea83e16ece6d666214c7d0c3a39ce92fe292fd:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a  xffff)+1)../*.**
05c0: 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20 61   Values passed a
05d0: 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d 65  s the 5th argume
05e0: 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42 74  nt to allocateBt
05f0: 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64 65  reePage().*/.#de
0600: 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  fine BTALLOC_ANY
0610: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 2f     0           /
0620: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20 70  * Allocate any p
0630: 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 42  age */.#define B
0640: 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20 20  TALLOC_EXACT 1  
0650: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
0660: 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65 20  cate exact page 
0670: 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 23  if possible */.#
0680: 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 4c  define BTALLOC_L
0690: 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20  E    2          
06a0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79   /* Allocate any
06b0: 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61 72   page <= the par
06c0: 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ameter */../*.**
06d0: 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69 74   Macro IfNotOmit
06e0: 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28 78  AV(x) returns (x
06f0: 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ) if SQLITE_OMIT
0700: 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 6e  _AUTOVACUUM is n
0710: 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c 20  ot .** defined, 
0720: 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20 46  or 0 if it is. F
0730: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
0740: 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d 20  *   bIncrVacuum 
0750: 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  = IfNotOmitAV(pB
0760: 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61 63  tShared->incrVac
0770: 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65 66  uum);.*/.#ifndef
0780: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
0790: 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65 20  OVACUUM.#define 
07a0: 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70 72  IfNotOmitAV(expr
07b0: 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a 23  ) (expr).#else.#
07c0: 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69 74  define IfNotOmit
07d0: 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64 69  AV(expr) 0.#endi
07e0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
07f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0800: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74  CHE./*.** A list
0810: 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62 6a   of BtShared obj
0820: 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6c  ects that are el
0830: 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74 69  igible for parti
0840: 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 73  cipation.** in s
0850: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68  hared cache.  Th
0860: 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73 20  is variable has 
0870: 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69 6e  file scope durin
0880: 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2c  g normal builds,
0890: 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73 74  .** but the test
08a0: 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20 74   harness needs t
08b0: 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20 77  o access it so w
08c0: 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61 6c  e make it global
08d0: 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62 75   for .** test bu
08e0: 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63 65  ilds..**.** Acce
08f0: 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69 61  ss to this varia
0900: 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65 64  ble is protected
0910: 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45 58   by SQLITE_MUTEX
0920: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e 0a  _STATIC_MASTER..
0930: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
0940: 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20 2a  _TEST.BtShared *
0950: 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74  SQLITE_WSD sqlit
0960: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
0970: 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61  t = 0;.#else.sta
0980: 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53 51  tic BtShared *SQ
0990: 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65 33  LITE_WSD sqlite3
09a0: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20  SharedCacheList 
09b0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64  = 0;.#endif.#end
09c0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
09d0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
09e0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
09f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0a00: 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  CHE./*.** Enable
0a10: 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
0a20: 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e 64  shared pager and
0a30: 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65 73   schema features
0a40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
0a50: 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66 65  tine has no effe
0a60: 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20 64  ct on existing d
0a70: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
0a80: 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72  ons..** The shar
0a90: 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e 67  ed cache setting
0aa0: 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66 75   effects only fu
0ab0: 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  ture calls to.**
0ac0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2c   sqlite3_open(),
0ad0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
0ae0: 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70  ), or sqlite3_op
0af0: 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74 20  en_v2()..*/.int 
0b00: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
0b10: 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74 20  hared_cache(int 
0b20: 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69 74  enable){.  sqlit
0b30: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
0b40: 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
0b50: 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72 65  d = enable;.  re
0b60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
0b70: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66 64  }.#endif....#ifd
0b80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
0b90: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
0ba0: 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  .  ** The functi
0bb0: 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64 43  ons querySharedC
0bc0: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 2c  acheTableLock(),
0bd0: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
0be0: 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a 2a  ableLock(),.  **
0bf0: 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68 61   and clearAllSha
0c00: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c10: 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75  ks().  ** manipu
0c20: 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  late entries in 
0c30: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
0c40: 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75  ck linked list u
0c50: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a  sed to store.  *
0c60: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
0c70: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73  able level locks
0c80: 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79  . If the library
0c90: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
0ca0: 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65  h the.  ** share
0cb0: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
0cc0: 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
0cd0: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
0ce0: 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20  r one user.  ** 
0cf0: 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64  of each BtShared
0d00: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73   structure and s
0d10: 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69  o this locking i
0d20: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
0d30: 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65   .  ** So define
0d40: 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65   the lock relate
0d50: 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e  d functions as n
0d60: 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64  o-ops..  */.  #d
0d70: 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72 65  efine queryShare
0d80: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0d90: 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b  a,b,c) SQLITE_OK
0da0: 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53 68  .  #define setSh
0db0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0dc0: 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45  ck(a,b,c) SQLITE
0dd0: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63 6c  _OK.  #define cl
0de0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0df0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e00: 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72 61   #define downgra
0e10: 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
0e20: 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20 20  TableLocks(a).  
0e30: 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72 65  #define hasShare
0e40: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0e50: 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64 65  a,b,c,d) 1.  #de
0e60: 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e 66  fine hasReadConf
0e70: 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23 65  licts(a, b) 0.#e
0e80: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0e90: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0ea0: 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20 53  _CACHE..#ifdef S
0eb0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
0ec0: 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  *** This functio
0ed0: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
0ee0: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73  s part of an ass
0ef0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2e  ert() statement.
0f00: 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b   ***.**.** Check
0f10: 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72 65   to see if pBtre
0f20: 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71 75  e holds the requ
0f30: 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72 65  ired locks to re
0f40: 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74  ad or write to t
0f50: 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69 74  he .** table wit
0f60: 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f  h root page iRoo
0f70: 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69 66  t.   Return 1 if
0f80: 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20 69   it does and 0 i
0f90: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  f not..**.** For
0fa0: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 77   example, when w
0fb0: 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c  riting to a tabl
0fc0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
0fd0: 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20 42   iRoot via .** B
0fe0: 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  tree connection 
0ff0: 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  pBtree:.**.**   
1000: 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
1010: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1020: 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c 20  (pBtree, iRoot, 
1030: 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 29  0, WRITE_LOCK) )
1040: 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72 69  ;.**.** When wri
1050: 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78  ting to an index
1060: 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69 6e   that resides in
1070: 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74 61   a sharable data
1080: 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63 61  base, the .** ca
1090: 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65  ller should have
10a0: 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64 20   first obtained 
10b0: 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69 6e  a lock specifyin
10c0: 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  g the root page 
10d0: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73  of.** the corres
10e0: 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20 54  ponding table. T
10f0: 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67 73  his makes things
1100: 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d 70   a bit more comp
1110: 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20 74  licated,.** as t
1120: 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61 74  his module treat
1130: 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73 20  s each table as 
1140: 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75 63  a separate struc
1150: 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d 69  ture. To determi
1160: 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  ne.** the table 
1170: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
1180: 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
1190: 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a 2a   written, this.*
11a0: 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74  * function has t
11b0: 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67 68  o search through
11c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
11d0: 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  hema..**.** Inst
11e0: 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f 6e  ead of a lock on
11f0: 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
1200: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1210: 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c 65  iRoot, the calle
1220: 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61 20  r may.** hold a 
1230: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
1240: 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20 28  e schema table (
1250: 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54 68  root page 1). Th
1260: 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61 63  is is also.** ac
1270: 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ceptable..*/.sta
1280: 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72 65  tic int hasShare
1290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
12a0: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
12b0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e  ,         /* Han
12c0: 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68 6f  dle that must ho
12d0: 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67 6e  ld lock */.  Pgn
12e0: 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20  o iRoot,        
12f0: 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
1300: 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20   of b-tree */.  
1310: 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20 20  int isIndex,    
1320: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1330: 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20 72  f iRoot is the r
1340: 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  oot of an index 
1350: 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  b-tree */.  int 
1360: 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20 20  eLockType       
1370: 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6c     /* Required l
1380: 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f 4c  ock type (READ_L
1390: 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43  OCK or WRITE_LOC
13a0: 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65 6d  K) */.){.  Schem
13b0: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53 63  a *pSchema = (Sc
13c0: 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e 70  hema *)pBtree->p
13d0: 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 50  Bt->pSchema;.  P
13e0: 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20 20  gno iTab = 0;.  
13f0: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a  BtLock *pLock;..
1400: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
1410: 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68 61  abase is not sha
1420: 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74 68  reable, or if th
1430: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1440: 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61 73  ing.  ** and has
1450: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
1460: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20  itted flag set, 
1470: 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73 20  then no lock is 
1480: 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a 20  required. .  ** 
1490: 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d 65  Return true imme
14a0: 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  diately..  */.  
14b0: 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68 61  if( (pBtree->sha
14c0: 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c 20  rable==0).   || 
14d0: 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41 44  (eLockType==READ
14e0: 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65 65  _LOCK && (pBtree
14f0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1500: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1510: 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20 20  tted)).  ){.    
1520: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
1530: 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65 6e   /* If the clien
1540: 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f 72  t is reading  or
1550: 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64 65   writing an inde
1560: 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61  x and the schema
1570: 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f 61   is.  ** not loa
1580: 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ded, then it is 
1590: 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74 6f  too difficult to
15a0: 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b 20   actually check 
15b0: 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20 74  to see if.  ** t
15c0: 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 73  he correct locks
15d0: 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20 64   are held.  So d
15e0: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20 6a  o not bother - j
15f0: 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e  ust return true.
1600: 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65 20  .  ** This case 
1610: 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75 70  does not come up
1620: 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79 68   very often anyh
1630: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ow..  */.  if( i
1640: 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63 68  sIndex && (!pSch
1650: 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61 2d  ema || (pSchema-
1660: 3e 66 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61  >flags&DB_Schema
1670: 4c 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20  Loaded)==0) ){. 
1680: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1690: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
16a0: 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  t the root-page 
16b0: 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68  that the lock sh
16c0: 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e  ould be held on.
16d0: 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20   For table.  ** 
16e0: 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73  b-trees, this is
16f0: 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70   just the root p
1700: 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
1710: 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a  e being read or.
1720: 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f    ** written. Fo
1730: 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c  r index b-trees,
1740: 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
1750: 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f  page of the asso
1760: 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c  ciated.  ** tabl
1770: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49  e.  */.  if( isI
1780: 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68  ndex ){.    Hash
1790: 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72  Elem *p;.    for
17a0: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
17b0: 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78  st(&pSchema->idx
17c0: 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69  Hash); p; p=sqli
17d0: 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a  teHashNext(p)){.
17e0: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
17f0: 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c  x = (Index *)sql
1800: 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a  iteHashData(p);.
1810: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
1820: 74 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74  tnum==(int)iRoot
1830: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 61 62   ){.        iTab
1840: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
1850: 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  >tnum;.      }. 
1860: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1870: 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a    iTab = iRoot;.
1880: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68    }..  /* Search
1890: 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65   for the require
18a0: 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61  d lock. Either a
18b0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72   write-lock on r
18c0: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61  oot-page iTab, a
18d0: 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63   .  ** write-loc
18e0: 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20  k on the schema 
18f0: 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68  table, or (if th
1900: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
1910: 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64  ing) a.  ** read
1920: 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69  -lock on iTab wi
1930: 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75  ll suffice. Retu
1940: 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74  rn 1 if any of t
1950: 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20  hese are found. 
1960: 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d   */.  for(pLock=
1970: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f  pBtree->pBt->pLo
1980: 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  ck; pLock; pLock
1990: 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a  =pLock->pNext){.
19a0: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70      if( pLock->p
19b0: 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20  Btree==pBtree . 
19c0: 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69      && (pLock->i
19d0: 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28  Table==iTab || (
19e0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pLock->eLock==WR
19f0: 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63  ITE_LOCK && pLoc
1a00: 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20  k->iTable==1)). 
1a10: 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c      && pLock->eL
1a20: 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a  ock>=eLockType .
1a30: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1a40: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1a50: 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f  ..  /* Failed to
1a60: 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72   find the requir
1a70: 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65  ed lock. */.  re
1a80: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1a90: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
1aa0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
1ab0: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a  TE_DEBUG./*.****
1ac0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
1ad0: 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61  ay be used as pa
1ae0: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  rt of assert() s
1af0: 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20  tatements only. 
1b00: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ****.**.** Retur
1b10: 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75  n true if it wou
1b20: 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f  ld be illegal fo
1b30: 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74  r pBtree to writ
1b40: 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61  e into the.** ta
1b50: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f  ble or index roo
1b60: 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63  ted at iRoot bec
1b70: 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65  ause other share
1b80: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  d connections ar
1b90: 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75  e.** simultaneou
1ba0: 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74  sly reading that
1bb0: 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69   same table or i
1bc0: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ndex..**.** It i
1bd0: 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42  s illegal for pB
1be0: 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66  tree to write if
1bf0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65   some other Btre
1c00: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  e object that.**
1c10: 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65   shares the same
1c20: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
1c30: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65   is currently re
1c40: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1c50: 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61  .** the iRoot ta
1c60: 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66  ble.  Except, if
1c70: 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65   the other Btree
1c80: 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a   object has the.
1c90: 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  ** read-uncommit
1ca0: 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68  ted flag set, th
1cb0: 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20  en it is OK for 
1cc0: 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74  the other object
1cd0: 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65   to.** have a re
1ce0: 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  ad cursor..**.**
1cf0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65   For example, be
1d00: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
1d10: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1d20: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a  table or index.*
1d30: 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  * rooted at page
1d40: 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75   iRoot, one shou
1d50: 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20  ld call:.**.**  
1d60: 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65    assert( !hasRe
1d70: 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72  adConflicts(pBtr
1d80: 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f  ee, iRoot) );.*/
1d90: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52  .static int hasR
1da0: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72  eadConflicts(Btr
1db0: 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f  ee *pBtree, Pgno
1dc0: 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72   iRoot){.  BtCur
1dd0: 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  sor *p;.  for(p=
1de0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
1df0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
1e00: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  ext){.    if( p-
1e10: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
1e20: 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74   .     && p->pBt
1e30: 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20  ree!=pBtree.    
1e40: 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65   && 0==(p->pBtre
1e50: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1e60: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1e70: 69 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20  itted).    ){.  
1e80: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1e90: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1ea0: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20   0;.}.#endif    
1eb0: 2f 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  /* #ifdef SQLITE
1ec0: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
1ed0: 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66   Query to see if
1ee0: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20   Btree handle p 
1ef0: 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63  may obtain a loc
1f00: 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20  k of type eLock 
1f10: 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f  .** (READ_LOCK o
1f20: 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e  r WRITE_LOCK) on
1f30: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
1f40: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20  root-page iTab. 
1f50: 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  Return.** SQLITE
1f60: 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  _OK if the lock 
1f70: 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20  may be obtained 
1f80: 28 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  (by calling.** s
1f90: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
1fa0: 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51  leLock()), or SQ
1fb0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e  LITE_LOCKED if n
1fc0: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
1fd0: 74 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  t querySharedCac
1fe0: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65  heTableLock(Btre
1ff0: 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c  e *p, Pgno iTab,
2000: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2010: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2020: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2030: 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  pIter;..  assert
2040: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2050: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2060: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
2070: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  READ_LOCK || eLo
2080: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  ck==WRITE_LOCK )
2090: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
20a0: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
20b0: 28 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  ( !(p->db->flags
20c0: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
20d0: 6d 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d  mmitted)||eLock=
20e0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61  =WRITE_LOCK||iTa
20f0: 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  b==1 );.  .  /* 
2100: 49 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  If requesting a 
2110: 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e  write-lock, then
2120: 20 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20   the Btree must 
2130: 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
2140: 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  te.  ** transact
2150: 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ion on this file
2160: 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79  . And, obviously
2170: 2c 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65  , for this to be
2180: 20 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20   so there .  ** 
2190: 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20  must be an open 
21a0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
21b0: 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74  n on the file it
21c0: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  self..  */.  ass
21d0: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
21e0: 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74  _LOCK || (p==pBt
21f0: 2d 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e  ->pWriter && p->
2200: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
2210: 52 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72  RITE) );.  asser
2220: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2230: 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  OCK || pBt->inTr
2240: 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
2250: 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f  _WRITE );.  .  /
2260: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2270: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
2280: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73   shared-cache is
2290: 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   not enabled */.
22a0: 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
22b0: 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  le ){.    return
22c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
22d0: 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74  .  /* If some ot
22e0: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  her connection i
22f0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63  s holding an exc
2300: 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65  lusive lock, the
2310: 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20  .  ** requested 
2320: 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20  lock may not be 
2330: 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20  obtained..  */. 
2340: 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65   if( pBt->pWrite
2350: 72 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74  r!=p && (pBt->bt
2360: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43  sFlags & BTS_EXC
2370: 4c 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20  LUSIVE)!=0 ){.  
2380: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2390: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
23a0: 2c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  , pBt->pWriter->
23b0: 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  db);.    return 
23c0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
23d0: 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a  AREDCACHE;.  }..
23e0: 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
23f0: 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
2400: 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
2410: 74 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  t){.    /* The c
2420: 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d  ondition (pIter-
2430: 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69  >eLock!=eLock) i
2440: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
2450: 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20  if(...) .    ** 
2460: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73  statement is a s
2470: 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66  implification of
2480: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
2490: 20 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f    (eLock==WRITE_
24a0: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
24b0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
24c0: 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
24d0: 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68  since we know th
24e0: 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49  at if eLock==WRI
24f0: 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f  TE_LOCK, then no
2500: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
2510: 6e 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c  n.    ** may hol
2520: 64 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f  d a WRITE_LOCK o
2530: 6e 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74  n any table in t
2540: 68 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20  his file (since 
2550: 74 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a  there can.    **
2560: 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c   only be a singl
2570: 65 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a  e writer)..    *
2580: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  /.    assert( pI
2590: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44  ter->eLock==READ
25a0: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  _LOCK || pIter->
25b0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
25c0: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
25d0: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
25e0: 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72  K || pIter->pBtr
25f0: 65 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e  ee==p || pIter->
2600: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2610: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
2620: 2d 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70  ->pBtree!=p && p
2630: 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Iter->iTable==iT
2640: 61 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f  ab && pIter->eLo
2650: 63 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck!=eLock ){.   
2660: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
2670: 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
2680: 62 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  b, pIter->pBtree
2690: 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ->db);.      if(
26a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
26b0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  CK ){.        as
26c0: 73 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57  sert( p==pBt->pW
26d0: 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20  riter );.       
26e0: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
26f0: 3d 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20  = BTS_PENDING;. 
2700: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
2710: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
2720: 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
2730: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2740: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
2750: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
2760: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2770: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
2780: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
2790: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64  D_CACHE./*.** Ad
27a0: 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  d a lock on the 
27b0: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
27c0: 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74  page iTable to t
27d0: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  he shared-btree 
27e0: 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65  used.** by Btree
27f0: 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d   handle p. Param
2800: 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20  eter eLock must 
2810: 62 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c  be either READ_L
2820: 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45  OCK or .** WRITE
2830: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  _LOCK..**.** Thi
2840: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
2850: 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
2860: 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68  :.**.**   (a) Th
2870: 65 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65  e specified Btre
2880: 65 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f  e object p is co
2890: 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61  nnected to a sha
28a0: 72 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64  rable.**       d
28b0: 61 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74  atabase (one wit
28c0: 68 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73  h the BtShared.s
28d0: 68 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74  harable flag set
28e0: 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28  ), and.**.**   (
28f0: 62 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65  b) No other Btre
2900: 65 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61  e objects hold a
2910: 20 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c   lock that confl
2920: 69 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69  icts.**       wi
2930: 74 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64  th the requested
2940: 20 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72   lock (i.e. quer
2950: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
2960: 65 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20  eLock() has.**  
2970: 20 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65       already bee
2980: 6e 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74  n called and ret
2990: 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29  urned SQLITE_OK)
29a0: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
29b0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
29c0: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64   the lock is add
29d0: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
29e0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a   SQLITE_NOMEM .*
29f0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
2a00: 20 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70   a malloc attemp
2a10: 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  t fails..*/.stat
2a20: 69 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64  ic int setShared
2a30: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42  CacheTableLock(B
2a40: 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54  tree *p, Pgno iT
2a50: 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b  able, u8 eLock){
2a60: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2a70: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
2a80: 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a  ock *pLock = 0;.
2a90: 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
2aa0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2ab0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
2ac0: 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
2ad0: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2ae0: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  OCK || eLock==WR
2af0: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ITE_LOCK );.  as
2b00: 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29  sert( p->db!=0 )
2b10: 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63  ;..  /* A connec
2b20: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65  tion with the re
2b30: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
2b40: 6c 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76  lag set will nev
2b50: 65 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f  er try to.  ** o
2b60: 62 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63  btain a read-loc
2b70: 6b 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e  k using this fun
2b80: 63 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20  ction. The only 
2b90: 72 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e  read-lock obtain
2ba0: 65 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e  ed.  ** by a con
2bb0: 6e 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d  nection in read-
2bc0: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65  uncommitted mode
2bd0: 20 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74   is on the sqlit
2be0: 65 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74  e_master .  ** t
2bf0: 61 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c  able, and that l
2c00: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
2c10: 69 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61  in BtreeBeginTra
2c20: 6e 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ns().  */.  asse
2c30: 72 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66  rt( 0==(p->db->f
2c40: 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64  lags&SQLITE_Read
2c50: 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20  Uncommitted) || 
2c60: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
2c70: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  K );..  /* This 
2c80: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
2c90: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f  only be called o
2ca0: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74  n a sharable b-t
2cb0: 72 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20  ree after it .  
2cc0: 2a 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65  ** has been dete
2cd0: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f  rmined that no o
2ce0: 74 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64  ther b-tree hold
2cf0: 73 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20  s a conflicting 
2d00: 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65  lock.  */.  asse
2d10: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
2d20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
2d30: 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61  ITE_OK==querySha
2d40: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2d50: 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f  k(p, iTable, eLo
2d60: 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72  ck) );..  /* Fir
2d70: 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69  st search the li
2d80: 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  st for an existi
2d90: 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20  ng lock on this 
2da0: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28  table. */.  for(
2db0: 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
2dc0: 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
2dd0: 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
2de0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61    if( pIter->iTa
2df0: 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
2e00: 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Iter->pBtree==p 
2e10: 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d  ){.      pLock =
2e20: 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72   pIter;.      br
2e30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
2e40: 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76    /* If the abov
2e50: 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74  e search did not
2e60: 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73   find a BtLock s
2e70: 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e  truct associatin
2e80: 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77  g Btree p.  ** w
2e90: 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65  ith table iTable
2ea0: 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61  , allocate one a
2eb0: 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20  nd link it into 
2ec0: 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  the list..  */. 
2ed0: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
2ee0: 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f     pLock = (BtLo
2ef0: 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  ck *)sqlite3Mall
2f00: 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
2f10: 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20  Lock));.    if( 
2f20: 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  !pLock ){.      
2f30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2f40: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
2f50: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Lock->iTable = i
2f60: 54 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b  Table;.    pLock
2f70: 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
2f80: 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d    pLock->pNext =
2f90: 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
2fa0: 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c   pBt->pLock = pL
2fb0: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ock;.  }..  /* S
2fc0: 65 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c  et the BtLock.eL
2fd0: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
2fe0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74  the maximum of t
2ff0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a  he current lock.
3000: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71    ** and the req
3010: 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69  uested lock. Thi
3020: 73 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69  s means if a wri
3030: 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65  te-lock was alre
3040: 61 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e  ady held.  ** an
3050: 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65  d a read-lock re
3060: 71 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27  quested, we don'
3070: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f  t incorrectly do
3080: 77 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b  wngrade the lock
3090: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
30a0: 20 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44   WRITE_LOCK>READ
30b0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65  _LOCK );.  if( e
30c0: 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  Lock>pLock->eLoc
30d0: 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  k ){.    pLock->
30e0: 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20  eLock = eLock;. 
30f0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
3100: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
3110: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
3120: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
3130: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3140: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3150: 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  HE./*.** Release
3160: 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c   all the table l
3170: 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61  ocks (locks obta
3180: 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74  ined via calls t
3190: 6f 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72  o.** the setShar
31a0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
31b0: 28 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65  () procedure) he
31c0: 6c 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65  ld by Btree obje
31d0: 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ct p..**.** This
31e0: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
31f0: 73 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68  s that Btree p h
3200: 61 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20  as an open read 
3210: 6f 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61  or write .** tra
3220: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20  nsaction. If it 
3230: 64 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74  does not, then t
3240: 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66  he BTS_PENDING f
3250: 6c 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e  lag.** may be in
3260: 63 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65  correctly cleare
3270: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
3280: 64 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64  d clearAllShared
3290: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
32a0: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
32b0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
32c0: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a  pBt;.  BtLock **
32d0: 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70  ppIter = &pBt->p
32e0: 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lock;..  assert(
32f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
3300: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
3310: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
3320: 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ble || 0==*ppIte
3330: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
3340: 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a  ->inTrans>0 );..
3350: 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72    while( *ppIter
3360: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
3370: 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b  pLock = *ppIter;
3380: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
3390: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
33a0: 53 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20  S_EXCLUSIVE)==0 
33b0: 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d  || pBt->pWriter=
33c0: 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29  =pLock->pBtree )
33d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
33e0: 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54  ock->pBtree->inT
33f0: 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f  rans>=pLock->eLo
3400: 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ck );.    if( pL
3410: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ock->pBtree==p )
3420: 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20  {.      *ppIter 
3430: 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLock->pNext;.
3440: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
3450: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c  ock->iTable!=1 |
3460: 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63  | pLock==&p->loc
3470: 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  k );.      if( p
3480: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20  Lock->iTable!=1 
3490: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
34a0: 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  e3_free(pLock);.
34b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
34c0: 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20  e{.      ppIter 
34d0: 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b  = &pLock->pNext;
34e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
34f0: 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46  sert( (pBt->btsF
3500: 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49  lags & BTS_PENDI
3510: 4e 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  NG)==0 || pBt->p
3520: 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20  Writer );.  if( 
3530: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20  pBt->pWriter==p 
3540: 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69  ){.    pBt->pWri
3550: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ter = 0;.    pBt
3560: 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28  ->btsFlags &= ~(
3570: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54  BTS_EXCLUSIVE|BT
3580: 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65  S_PENDING);.  }e
3590: 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72  lse if( pBt->nTr
35a0: 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a  ansaction==2 ){.
35b0: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
35c0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
35d0: 68 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63  hen Btree p is c
35e0: 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20  oncluding its . 
35f0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
3600: 6e 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72  n. If there curr
3610: 65 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77  ently exists a w
3620: 72 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20  riter, and p is 
3630: 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  not.    ** that 
3640: 77 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65  writer, then the
3650: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   number of locks
3660: 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
3670: 69 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a  ions other.    *
3680: 2a 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65  * than the write
3690: 72 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20  r must be about 
36a0: 74 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e  to drop to zero.
36b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20   In this case.  
36c0: 20 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53    ** set the BTS
36d0: 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f  _PENDING flag to
36e0: 20 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   0..    **.    *
36f0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
3700: 74 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72  t currently a wr
3710: 69 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50  iter, then BTS_P
3720: 45 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20  ENDING must.    
3730: 2a 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61  ** be zero alrea
3740: 64 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74  dy. So this next
3750: 20 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73   line is harmles
3760: 73 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a  s in that case..
3770: 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e      */.    pBt->
3780: 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
3790: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a  _PENDING;.  }.}.
37a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
37b0: 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c  tion changes all
37c0: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c   write-locks hel
37d0: 64 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74  d by Btree p int
37e0: 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f  o read-locks..*/
37f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77  .static void dow
3800: 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
3810: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3820: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
3830: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
3840: 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  Bt;.  if( pBt->p
3850: 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20  Writer==p ){.   
3860: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
3870: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3880: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3890: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
38a0: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
38b0: 45 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72  ENDING);.    for
38c0: 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63  (pLock=pBt->pLoc
38d0: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
38e0: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
38f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3900: 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  ck->eLock==READ_
3910: 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70  LOCK || pLock->p
3920: 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20  Btree==p );.    
3930: 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d    pLock->eLock =
3940: 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20   READ_LOCK;.    
3950: 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20  }.  }.}..#endif 
3960: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
3970: 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a  HARED_CACHE */..
3980: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
3990: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
39a0: 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72  *pPage);  /* For
39b0: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
39c0: 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73  /../*.***** This
39d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
39e0: 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72   inside of asser
39f0: 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a  t() only ****.**
3a00: 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  .** Verify that 
3a10: 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73  the cursor holds
3a20: 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74   the mutex on it
3a30: 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69  s BtShared.*/.#i
3a40: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
3a50: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72  G.static int cur
3a60: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74  sorHoldsMutex(Bt
3a70: 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65  Cursor *p){.  re
3a80: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
3a90: 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
3aa0: 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66  mutex);.}.#endif
3ab0: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
3ac0: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
3ad0: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
3ae0: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
3af0: 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f  ge-list cache fo
3b00: 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20 69  r cursor pCur, i
3b10: 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  f any..*/.static
3b20: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3b30: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74  OverflowCache(Bt
3b40: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
3b50: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
3b60: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
3b70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3b80: 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
3b90: 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76 65  w);.  pCur->aOve
3ba0: 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  rflow = 0;.}../*
3bb0: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
3bc0: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
3bd0: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
3be0: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
3bf0: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
3c00: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
3c10: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
3c20: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
3c30: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
3c40: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
3c50: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
3c60: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
3c70: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3c80: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
3c90: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
3ca0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
3cb0: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
3cc0: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3cd0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
3ce0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
3cf0: 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
3d00: 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f  modifying the co
3d10: 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62 6c  ntents of a tabl
3d20: 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61  e.** to invalida
3d30: 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20  te any incrblob 
3d40: 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  cursors that are
3d50: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20   open on the.** 
3d60: 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  row or one of th
3d70: 65 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64  e rows being mod
3d80: 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ified..**.** If 
3d90: 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72  argument isClear
3da0: 54 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20 74  Table is true, t
3db0: 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20 63  hen the entire c
3dc0: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
3dd0: 2a 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75 74  * table is about
3de0: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20   to be deleted. 
3df0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3e00: 61 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63 72  alidate all incr
3e10: 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20  blob.** cursors 
3e20: 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20  open on any row 
3e30: 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65  within the table
3e40: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
3e50: 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20  pgnoRoot..**.** 
3e60: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 72  Otherwise, if ar
3e70: 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61  gument isClearTa
3e80: 62 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74 68  ble is false, th
3e90: 65 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 0a  en the row with.
3ea0: 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69 73  ** rowid iRow is
3eb0: 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20   being replaced 
3ec0: 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74  or deleted. In t
3ed0: 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64  his case invalid
3ee0: 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73  ate.** only thos
3ef0: 65 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f  e incrblob curso
3f00: 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20  rs open on that 
3f10: 73 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f  specific row..*/
3f20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76  .static void inv
3f30: 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
3f40: 75 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65 20  ursors(.  Btree 
3f50: 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20  *pBtree,        
3f60: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
3f70: 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20  e file to check 
3f80: 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20  */.  i64 iRow,  
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3fa0: 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d  The rowid that m
3fb0: 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67  ight be changing
3fc0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61   */.  int isClea
3fd0: 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a  rTable        /*
3fe0: 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77   True if all row
3ff0: 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65  s are being dele
4000: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75  ted */.){.  BtCu
4010: 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61  rsor *p;.  BtSha
4020: 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65  red *pBt = pBtre
4030: 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  e->pBt;.  assert
4040: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
4050: 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29  ldsMutex(pBtree)
4060: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
4070: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
4080: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
4090: 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  ( p->isIncrblobH
40a0: 61 6e 64 6c 65 20 26 26 20 28 69 73 43 6c 65 61  andle && (isClea
40b0: 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66  rTable || p->inf
40c0: 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29 7b  o.nKey==iRow) ){
40d0: 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65  .      p->eState
40e0: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
40f0: 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  D;.    }.  }.}..
4100: 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62 20  #else.  /* Stub 
4110: 66 75 6e 63 74 69 6f 6e 73 20 77 68 65 6e 20 49  functions when I
4120: 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74 74  NCRBLOB is omitt
4130: 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  ed */.  #define 
4140: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
4150: 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64 65  owCache(x).  #de
4160: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 41  fine invalidateA
4170: 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
4180: 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76  x).  #define inv
4190: 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
41a0: 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23 65  ursors(x,y,z).#e
41b0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
41c0: 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a  MIT_INCRBLOB */.
41d0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70  ./*.** Set bit p
41e0: 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61  gno of the BtSha
41f0: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4200: 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20  bitvec. This is 
4210: 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20  called .** when 
4220: 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76  a page that prev
4230: 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64  iously contained
4240: 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20   data becomes a 
4250: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a  free-list leaf .
4260: 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ** page..**.** T
4270: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
4280: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65  Content bitvec e
4290: 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72  xists to work ar
42a0: 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a  ound an obscure.
42b0: 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79  ** bug caused by
42c0: 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e   the interaction
42d0: 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49   of two useful I
42e0: 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  O optimizations 
42f0: 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66  surrounding.** f
4300: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
4310: 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  ges:.**.**   1) 
4320: 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73  When all data is
4330: 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20   deleted from a 
4340: 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67  page and the pag
4350: 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20  e becomes.**    
4360: 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65    a free-list le
4370: 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67  af page, the pag
4380: 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e  e is not written
4390: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
43a0: 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65  .**      (as fre
43b0: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
43c0: 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61  s contain no mea
43d0: 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53  ningful data). S
43e0: 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20  ometimes.**     
43f0: 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20   such a page is 
4400: 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c  not even journal
4410: 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20  led (as it will 
4420: 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c  not be modified,
4430: 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74  .**      why bot
4440: 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20  her journalling 
4450: 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  it?)..**.**   2)
4460: 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   When a free-lis
4470: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4480: 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65  eused, its conte
4490: 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a  nt is not read.*
44a0: 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20  *      from the 
44b0: 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74  database or writ
44c0: 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
44d0: 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f  al file (why sho
44e0: 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62  uld it.**      b
44f0: 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e, if it is not 
4500: 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75  at all meaningfu
4510: 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68  l?)..**.** By th
4520: 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20  emselves, these 
4530: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f  optimizations wo
4540: 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76  rk fine and prov
4550: 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70  ide a handy.** p
4560: 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74  erformance boost
4570: 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20   to bulk delete 
4580: 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74  or insert operat
4590: 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69  ions. However, i
45a0: 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d  f.** a page is m
45b0: 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
45c0: 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72  -list and then r
45d0: 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65  eused within the
45e0: 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63   same.** transac
45f0: 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20  tion, a problem 
4600: 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65  comes up. If the
4610: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75   page is not jou
4620: 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20  rnalled when.** 
4630: 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74  it is moved to t
4640: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4650: 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20   it is also not 
4660: 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20  journalled when 
4670: 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74  it.** is extract
4680: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
4690: 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64  -list and reused
46a0: 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69  , then the origi
46b0: 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20  nal data.** may 
46c0: 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20  be lost. In the 
46d0: 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62  event of a rollb
46e0: 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20  ack, it may not 
46f0: 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74  be possible.** t
4700: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
4710: 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
4720: 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61  iginal configura
4730: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
4740: 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20  solution is the 
4750: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4760: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65  tent bitvec. Whe
4770: 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20  never a page is 
4780: 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63  .** moved to bec
4790: 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20  ome a free-list 
47a0: 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63  leaf page, the c
47b0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
47c0: 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68   is.** set in th
47d0: 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76  e bitvec. Whenev
47e0: 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69  er a leaf page i
47f0: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
4800: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a   the free-list,.
4810: 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ** optimization 
4820: 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74  2 above is omitt
4830: 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73  ed if the corres
4840: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61  ponding bit is a
4850: 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e  lready.** set in
4860: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4870: 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65  ntent. The conte
4880: 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65  nts of the bitve
4890: 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a  c are cleared.**
48a0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
48b0: 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  very transaction
48c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
48d0: 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
48e0: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
48f0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
4900: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4910: 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  OK;.  if( !pBt->
4920: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
4930: 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c     assert( pgno<
4940: 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20  =pBt->nPage );. 
4950: 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74     pBt->pHasCont
4960: 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74  ent = sqlite3Bit
4970: 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e  vecCreate(pBt->n
4980: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Page);.    if( !
4990: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
49a0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
49b0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
49c0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
49d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67  =SQLITE_OK && pg
49e0: 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76 65  no<=sqlite3Bitve
49f0: 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73 43  cSize(pBt->pHasC
4a00: 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20 72  ontent) ){.    r
4a10: 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
4a20: 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43 6f  cSet(pBt->pHasCo
4a30: 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  ntent, pgno);.  
4a40: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4a50: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68  ../*.** Query th
4a60: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4a70: 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a  ontent vector..*
4a80: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
4a90: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
4aa0: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
4ab0: 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f 76  af page is remov
4ac0: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66  ed from the.** f
4ad0: 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65 75  ree-list for reu
4ae0: 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 66  se. It returns f
4af0: 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 61  alse if it is sa
4b00: 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  fe to retrieve t
4b10: 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20  he.** page from 
4b20: 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
4b30: 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e  with the 'no-con
4b40: 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20  tent' flag set. 
4b50: 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  True otherwise..
4b60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
4b70: 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
4b80: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
4b90: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69  Pgno pgno){.  Bi
4ba0: 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70  tvec *p = pBt->p
4bb0: 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65  HasContent;.  re
4bc0: 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e 6f  turn (p && (pgno
4bd0: 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69  >sqlite3BitvecSi
4be0: 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65 33  ze(p) || sqlite3
4bf0: 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70 67  BitvecTest(p, pg
4c00: 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  no)));.}../*.** 
4c10: 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29 20  Clear (destroy) 
4c20: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4c30: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4c40: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 0a   This should be.
4c50: 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  ** invoked at th
4c60: 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
4c70: 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e 73  each write-trans
4c80: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
4c90: 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65 61  c void btreeClea
4ca0: 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  rHasContent(BtSh
4cb0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
4cc0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
4cd0: 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  oy(pBt->pHasCont
4ce0: 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61  ent);.  pBt->pHa
4cf0: 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a  sContent = 0;.}.
4d00: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
4d10: 6c 6c 20 6f 66 20 74 68 65 20 61 70 50 61 67 65  ll of the apPage
4d20: 5b 5d 20 70 61 67 65 73 20 66 6f 72 20 61 20 63  [] pages for a c
4d30: 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ursor..*/.static
4d40: 20 76 6f 69 64 20 62 74 72 65 65 52 65 6c 65 61   void btreeRelea
4d50: 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73  seAllCursorPages
4d60: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
4d70: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
4d80: 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=0; i<=pCur->i
4d90: 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
4da0: 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
4db0: 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
4dc0: 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69    pCur->apPage[i
4dd0: 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 43 75  ] = 0;.  }.  pCu
4de0: 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 7d  r->iPage = -1;.}
4df0: 0a 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68  .../*.** Save th
4e00: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
4e10: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65   position in the
4e20: 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72   variables BtCur
4e30: 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64  sor.nKey .** and
4e40: 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20   BtCursor.pKey. 
4e50: 54 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61  The cursor's sta
4e60: 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  te is set to CUR
4e70: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e  SOR_REQUIRESEEK.
4e80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
4e90: 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
4ea0: 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
4eb0: 20 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61   valid (has eSta
4ec0: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
4ed0: 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61  ).** prior to ca
4ee0: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
4ef0: 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ne.  .*/.static 
4f00: 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f  int saveCursorPo
4f10: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
4f20: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
4f30: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  ;..  assert( CUR
4f40: 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
4f50: 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73  >eState );.  ass
4f60: 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b  ert( 0==pCur->pK
4f70: 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ey );.  assert( 
4f80: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
4f90: 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20  (pCur) );..  rc 
4fa0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
4fb0: 79 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75  ySize(pCur, &pCu
4fc0: 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20 61 73 73 65  r->nKey);.  asse
4fd0: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
4fe0: 4b 20 29 3b 20 20 2f 2a 20 4b 65 79 53 69 7a 65  K );  /* KeySize
4ff0: 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a  () cannot fail *
5000: 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  /..  /* If this 
5010: 69 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62  is an intKey tab
5020: 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f  le, then the abo
5030: 76 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65  ve call to Btree
5040: 4b 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73  KeySize().  ** s
5050: 74 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67 65  tores the intege
5060: 72 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e  r key in pCur->n
5070: 4b 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73  Key. In this cas
5080: 65 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a  e this value is.
5090: 20 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73    ** all that is
50a0: 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72   required. Other
50b0: 77 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73  wise, if pCur is
50c0: 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20   not open on an 
50d0: 69 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c  intKey.  ** tabl
50e0: 65 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73  e, then malloc s
50f0: 70 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f  pace for and sto
5100: 72 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65  re the pCur->nKe
5110: 79 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a  y bytes of key .
5120: 20 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a    ** data..  */.
5130: 20 20 69 66 28 20 30 3d 3d 70 43 75 72 2d 3e 61    if( 0==pCur->a
5140: 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
5150: 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b   ){.    void *pK
5160: 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ey = sqlite3Mall
5170: 6f 63 28 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e  oc( (int)pCur->n
5180: 4b 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Key );.    if( p
5190: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Key ){.      rc 
51a0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
51b0: 79 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29  y(pCur, 0, (int)
51c0: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79  pCur->nKey, pKey
51d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
51e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
51f0: 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79        pCur->pKey
5200: 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d   = pKey;.      }
5210: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
5220: 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29  lite3_free(pKey)
5230: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
5240: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
5250: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
5260: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
5270: 28 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ( !pCur->apPage[
5280: 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70  0]->intKey || !p
5290: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20  Cur->pKey );..  
52a0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
52b0: 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65  K ){.    btreeRe
52c0: 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61  leaseAllCursorPa
52d0: 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70  ges(pCur);.    p
52e0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
52f0: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5300: 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64  ;.  }..  invalid
5310: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
5320: 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
5330: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61   rc;.}../*.** Sa
5340: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
5350: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
5360: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
5370: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
5380: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 20  n.** the table  
5390: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69  with root-page i
53a0: 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20 74  Root. Usually, t
53b0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6a 75  his is called ju
53c0: 73 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72  st before cursor
53d0: 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73 20 75  .** pExcept is u
53e0: 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  sed to modify th
53f0: 65 20 74 61 62 6c 65 20 28 42 74 72 65 65 44 65  e table (BtreeDe
5400: 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65 49  lete() or BtreeI
5410: 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74 61  nsert())..*/.sta
5420: 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43  tic int saveAllC
5430: 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20  ursors(BtShared 
5440: 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74  *pBt, Pgno iRoot
5450: 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63  , BtCursor *pExc
5460: 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  ept){.  BtCursor
5470: 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73   *p;.  assert( s
5480: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
5490: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
54a0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 63 65  .  assert( pExce
54b0: 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70 74  pt==0 || pExcept
54c0: 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20  ->pBt==pBt );.  
54d0: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
54e0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
54f0: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70  t){.    if( p!=p
5500: 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52  Except && (0==iR
5510: 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f  oot || p->pgnoRo
5520: 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a 20 20  ot==iRoot) ){.  
5530: 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74      if( p->eStat
5540: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
5550: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
5560: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
5570: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
5580: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
5590: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
55a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
55b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
55c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
55d0: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 30  case( p->iPage>0
55e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65   );.        btre
55f0: 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
5600: 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20 20  rPages(p);.     
5610: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
5620: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5630: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
5640: 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
5650: 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a  or position..*/.
5660: 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
5670: 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43  eClearCursor(BtC
5680: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5690: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
56a0: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
56b0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
56c0: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
56d0: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
56e0: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
56f0: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
5700: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69  .}../*.** In thi
5710: 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72  s version of Btr
5720: 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69  eeMoveto, pKey i
5730: 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78  s a packed index
5740: 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20   record.** such 
5750: 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  as is generated 
5760: 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  by the OP_MakeRe
5770: 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e  cord opcode.  Un
5780: 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f  pack the.** reco
5790: 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c  rd and then call
57a0: 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61   BtreeMovetoUnpa
57b0: 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65  cked() to do the
57c0: 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   work..*/.static
57d0: 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f   int btreeMoveto
57e0: 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
57f0: 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  ur,     /* Curso
5800: 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74  r open on the bt
5810: 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63 68  ree to be search
5820: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ed */.  const vo
5830: 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50  id *pKey,   /* P
5840: 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65  acked key if the
5850: 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64   btree is an ind
5860: 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79  ex */.  i64 nKey
5870: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
5880: 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74  nteger key for t
5890: 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20  ables.  Size of 
58a0: 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73  pKey for indices
58b0: 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20   */.  int bias, 
58c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61            /* Bia
58d0: 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  s search to the 
58e0: 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
58f0: 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
5900: 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63    /* Write searc
5910: 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  h results here *
5920: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
5930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5940: 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65    /* Status code
5950: 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
5960: 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20  cord *pIdxKey;  
5970: 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
5980: 65 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72  ex key */.  char
5990: 20 61 53 70 61 63 65 5b 31 35 30 5d 3b 20 20 20   aSpace[150];   
59a0: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
59b0: 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65 79  pace for pIdxKey
59c0: 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 61   - to avoid a ma
59d0: 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lloc */.  char *
59e0: 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66  pFree = 0;..  if
59f0: 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73  ( pKey ){.    as
5a00: 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34  sert( nKey==(i64
5a10: 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20  )(int)nKey );.  
5a20: 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69    pIdxKey = sqli
5a30: 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61  te3VdbeAllocUnpa
5a40: 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 20 20  ckedRecord(.    
5a50: 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e      pCur->pKeyIn
5a60: 66 6f 2c 20 61 53 70 61 63 65 2c 20 73 69 7a 65  fo, aSpace, size
5a70: 6f 66 28 61 53 70 61 63 65 29 2c 20 26 70 46 72  of(aSpace), &pFr
5a80: 65 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  ee.    );.    if
5a90: 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72  ( pIdxKey==0 ) r
5aa0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
5ab0: 45 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  EM;.    sqlite3V
5ac0: 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
5ad0: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  pCur->pKeyInfo, 
5ae0: 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c  (int)nKey, pKey,
5af0: 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d 65 6c   pIdxKey);.  }el
5b00: 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20  se{.    pIdxKey 
5b10: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  = 0;.  }.  rc = 
5b20: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
5b30: 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c  toUnpacked(pCur,
5b40: 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20   pIdxKey, nKey, 
5b50: 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69  bias, pRes);.  i
5b60: 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20  f( pFree ){.    
5b70: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43  sqlite3DbFree(pC
5b80: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  ur->pKeyInfo->db
5b90: 2c 20 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20  , pFree);.  }.  
5ba0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5bb0: 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20  .** Restore the 
5bc0: 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f  cursor to the po
5bd0: 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e  sition it was in
5be0: 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f   (or as close to
5bf0: 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a   as possible).**
5c00: 20 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72   when saveCursor
5c10: 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63  Position() was c
5c20: 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74  alled. Note that
5c30: 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74   this call delet
5c40: 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64  es the .** saved
5c50: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73   position info s
5c60: 74 6f 72 65 64 20 62 79 20 73 61 76 65 43 75 72  tored by saveCur
5c70: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73  sorPosition(), s
5c80: 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  o there can be.*
5c90: 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66  * at most one ef
5ca0: 66 65 63 74 69 76 65 20 72 65 73 74 6f 72 65 43  fective restoreC
5cb0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
5cc0: 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20  call after each 
5cd0: 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f  .** saveCursorPo
5ce0: 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61  sition()..*/.sta
5cf0: 74 69 63 20 69 6e 74 20 62 74 72 65 65 52 65 73  tic int btreeRes
5d00: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5d10: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
5d20: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
5d30: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
5d40: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
5d50: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
5d60: 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
5d70: 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
5d80: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
5d90: 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
5da0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
5db0: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20  Cur->skipNext;. 
5dc0: 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74   }.  pCur->eStat
5dd0: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
5de0: 49 44 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  ID;.  rc = btree
5df0: 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75  Moveto(pCur, pCu
5e00: 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e  r->pKey, pCur->n
5e10: 4b 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73  Key, 0, &pCur->s
5e20: 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20  kipNext);.  if( 
5e30: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5e40: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
5e50: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
5e60: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
5e70: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
5e80: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
5e90: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
5ea0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
5eb0: 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 7d  R_INVALID );.  }
5ec0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5ed0: 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72 65  .#define restore
5ee0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
5ef0: 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74 65  ) \.  (p->eState
5f00: 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
5f10: 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20  SEEK ? \.       
5f20: 20 20 62 74 72 65 65 52 65 73 74 6f 72 65 43 75    btreeRestoreCu
5f30: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20  rsorPosition(p) 
5f40: 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c  : \.         SQL
5f50: 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44  ITE_OK)../*.** D
5f60: 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
5f70: 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f 72   or not a cursor
5f80: 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20   has moved from 
5f90: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 0a  the position it.
5fa0: 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63  ** was last plac
5fb0: 65 64 20 61 74 2e 20 20 43 75 72 73 6f 72 73 20  ed at.  Cursors 
5fc0: 63 61 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68  can move when th
5fd0: 65 20 72 6f 77 20 74 68 65 79 20 61 72 65 20 70  e row they are p
5fe0: 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61 74 20 69 73  ointing.** at is
5ff0: 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
6000: 6d 20 75 6e 64 65 72 20 74 68 65 6d 2e 0a 2a 2a  m under them..**
6010: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6020: 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
6030: 72 20 63 6f 64 65 20 69 66 20 73 6f 6d 65 74 68  r code if someth
6040: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 20  ing goes wrong. 
6050: 20 54 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20   The.** integer 
6060: 2a 70 48 61 73 4d 6f 76 65 64 20 69 73 20 73 65  *pHasMoved is se
6070: 74 20 74 6f 20 6f 6e 65 20 69 66 20 74 68 65 20  t to one if the 
6080: 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64  cursor has moved
6090: 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a   and 0 if not..*
60a0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
60b0: 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
60c0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
60d0: 20 69 6e 74 20 2a 70 48 61 73 4d 6f 76 65 64 29   int *pHasMoved)
60e0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72  {.  int rc;..  r
60f0: 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
6100: 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
6110: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
6120: 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b   *pHasMoved = 1;
6130: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
6140: 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
6150: 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
6160: 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 73 6b  ALID || pCur->sk
6170: 69 70 4e 65 78 74 21 3d 30 20 29 7b 0a 20 20 20  ipNext!=0 ){.   
6180: 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b   *pHasMoved = 1;
6190: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
61a0: 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20  HasMoved = 0;.  
61b0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
61c0: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
61d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
61e0: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69  OVACUUM./*.** Gi
61f0: 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ven a page numbe
6200: 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64  r of a regular d
6210: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65  atabase page, re
6220: 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  turn the page.**
6230: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
6240: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
6250: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
6260: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
6270: 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e  .** input page n
6280: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  umber..**.** Ret
6290: 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c  urn 0 (not a val
62a0: 69 64 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e  id page) for pgn
62b0: 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65  o==1 since there
62c0: 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65   is.** no pointe
62d0: 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64  r map associated
62e0: 20 77 69 74 68 20 70 61 67 65 20 31 2e 20 20 54   with page 1.  T
62f0: 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  he integrity_che
6300: 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75  ck logic.** requ
6310: 69 72 65 73 20 74 68 61 74 20 70 74 72 6d 61 70  ires that ptrmap
6320: 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a  Pageno(*,1)!=1..
6330: 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70  */.static Pgno p
6340: 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68  trmapPageno(BtSh
6350: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
6360: 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61  pgno){.  int nPa
6370: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
6380: 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72   Pgno iPtrMap, r
6390: 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  et;.  assert( sq
63a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
63b0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
63c0: 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72    if( pgno<2 ) r
63d0: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65  eturn 0;.  nPage
63e0: 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70  sPerMapPage = (p
63f0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
6400: 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d  )+1;.  iPtrMap =
6410: 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73   (pgno-2)/nPages
6420: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65  PerMapPage;.  re
6430: 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61  t = (iPtrMap*nPa
6440: 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b  gesPerMapPage) +
6450: 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d   2; .  if( ret==
6460: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
6470: 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65  E(pBt) ){.    re
6480: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  t++;.  }.  retur
6490: 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
64a0: 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  Write an entry i
64b0: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20  nto the pointer 
64c0: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
64d0: 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20  routine updates 
64e0: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
64f0: 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e  entry for page n
6500: 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73  umber 'key'.** s
6510: 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74  o that it maps t
6520: 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61  o type 'eType' a
6530: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
6540: 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a  umber 'pgno'..**
6550: 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69  .** If *pRC is i
6560: 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72  nitially non-zer
6570: 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b  o (non-SQLITE_OK
6580: 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  ) then this rout
6590: 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f  ine is.** a no-o
65a0: 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  p.  If an error 
65b0: 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70 70 72  occurs, the appr
65c0: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
65d0: 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  de is written.**
65e0: 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73   into *pRC..*/.s
65f0: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
6600: 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a 70  pPut(BtShared *p
6610: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
6620: 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72   eType, Pgno par
6630: 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  ent, int *pRC){.
6640: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
6650: 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  e;  /* The point
6660: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
6670: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
6680: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
6690: 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20  r map data */.  
66a0: 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20  Pgno iPtrmap;   
66b0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
66c0: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
66d0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
66e0: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  ;       /* Offse
66f0: 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  t in pointer map
6700: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72   page */.  int r
6710: 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c;           /* 
6720: 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
6730: 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
6740: 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
6750: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
6760: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
6770: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
6780: 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73   );.  /* The mas
6790: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter-journal page
67a0: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76   number must nev
67b0: 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61 20  er be used as a 
67c0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
67d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
67e0: 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  =PTRMAP_ISPAGE(p
67f0: 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  Bt, PENDING_BYTE
6800: 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a  _PAGE(pBt)) );..
6810: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
6820: 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69  utoVacuum );.  i
6830: 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  f( key==0 ){.   
6840: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
6850: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
6860: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
6870: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
6880: 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29  PAGENO(pBt, key)
6890: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
68a0: 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
68b0: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26  ager, iPtrmap, &
68c0: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
68d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
68e0: 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a  .    *pRC = rc;.
68f0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
6900: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
6910: 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72  P_PTROFFSET(iPtr
6920: 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28  map, key);.  if(
6930: 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20   offset<0 ){.   
6940: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
6950: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
6960: 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69   goto ptrmap_exi
6970: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
6980: 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29   offset <= (int)
6990: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
69a0: 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d  5 );.  pPtrmap =
69b0: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
69c0: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
69d0: 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  ge);..  if( eTyp
69e0: 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e!=pPtrmap[offse
69f0: 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26  t] || get4byte(&
6a00: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
6a10: 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20  ])!=parent ){.  
6a20: 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50    TRACE(("PTRMAP
6a30: 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64  _UPDATE: %d->(%d
6a40: 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54  ,%d)\n", key, eT
6a50: 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20  ype, parent));. 
6a60: 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71     *pRC= rc = sq
6a70: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
6a80: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
6a90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6aa0: 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70  ){.      pPtrmap
6ab0: 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65  [offset] = eType
6ac0: 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
6ad0: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
6ae0: 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20  +1], parent);.  
6af0: 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f    }.  }..ptrmap_
6b00: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50  exit:.  sqlite3P
6b10: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
6b20: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  e);.}../*.** Rea
6b30: 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20  d an entry from 
6b40: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
6b50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
6b60: 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68  ine retrieves th
6b70: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
6b80: 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65  try for page 'ke
6b90: 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  y', writing.** t
6ba0: 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65  he type and pare
6bb0: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  nt page number t
6bc0: 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70  o *pEType and *p
6bd0: 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c  Pgno respectivel
6be0: 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  y..** An error c
6bf0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
6c00: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
6c10: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
6c20: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
6c30: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
6c40: 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a  apGet(BtShared *
6c50: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
6c60: 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20  8 *pEType, Pgno 
6c70: 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  *pPgno){.  DbPag
6c80: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a  e *pDbPage;   /*
6c90: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
6ca0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
6cb0: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
6cc0: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
6cd0: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20  e index */.  u8 
6ce0: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20  *pPtrmap;       
6cf0: 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  /* Pointer map p
6d00: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  age data */.  in
6d10: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
6d20: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e   /* Offset of en
6d30: 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  try in pointer m
6d40: 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ap */.  int rc;.
6d50: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
6d60: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
6d70: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
6d80: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
6d90: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
6da0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
6db0: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
6dc0: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
6dd0: 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  &pDbPage);.  if(
6de0: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65   rc!=0 ){.    re
6df0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
6e00: 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73  Ptrmap = (u8 *)s
6e10: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
6e20: 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20  ta(pDbPage);..  
6e30: 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f  offset = PTRMAP_
6e40: 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61  PTROFFSET(iPtrma
6e50: 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f  p, key);.  if( o
6e60: 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73  ffset<0 ){.    s
6e70: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
6e80: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72  (pDbPage);.    r
6e90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
6ea0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
6eb0: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20   assert( offset 
6ec0: 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61  <= (int)pBt->usa
6ed0: 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61  bleSize-5 );.  a
6ee0: 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30  ssert( pEType!=0
6ef0: 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20   );.  *pEType = 
6f00: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b  pPtrmap[offset];
6f10: 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a  .  if( pPgno ) *
6f20: 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  pPgno = get4byte
6f30: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
6f40: 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  +1]);..  sqlite3
6f50: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
6f60: 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79  ge);.  if( *pETy
6f70: 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e  pe<1 || *pEType>
6f80: 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  5 ) return SQLIT
6f90: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6fa0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6fb0: 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  OK;.}..#else /* 
6fc0: 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54  if defined SQLIT
6fd0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
6fe0: 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70  M */.  #define p
6ff0: 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a  trmapPut(w,x,y,z
7000: 2c 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70  ,rc).  #define p
7010: 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a  trmapGet(w,x,y,z
7020: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
7030: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f  efine ptrmapPutO
7040: 76 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29  vflPtr(x, y, rc)
7050: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
7060: 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67  iven a btree pag
7070: 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64  e and a cell ind
7080: 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20  ex (0 means the 
7090: 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a  first cell on.**
70a0: 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61   the page, 1 mea
70b0: 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65  ns the second ce
70c0: 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  ll, and so forth
70d0: 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  ) return a point
70e0: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c  er.** to the cel
70f0: 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a  l content..**.**
7100: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
7110: 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67  rks only for pag
7120: 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63  es that do not c
7130: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
7140: 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cells..*/.#defin
7150: 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20  e findCell(P,I) 
7160: 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20  \.  ((P)->aData 
7170: 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65  + ((P)->maskPage
7180: 20 26 20 67 65 74 32 62 79 74 65 28 26 28 50 29   & get2byte(&(P)
7190: 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29  ->aCellIdx[2*(I)
71a0: 5d 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e  ]))).#define fin
71b0: 64 43 65 6c 6c 76 32 28 44 2c 4d 2c 4f 2c 49 29  dCellv2(D,M,O,I)
71c0: 20 28 44 2b 28 4d 26 67 65 74 32 62 79 74 65 28   (D+(M&get2byte(
71d0: 44 2b 28 4f 2b 32 2a 28 49 29 29 29 29 29 0a 0a  D+(O+2*(I)))))..
71e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f  ./*.** This a mo
71f0: 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73 69  re complex versi
7200: 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28 29  on of findCell()
7210: 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a   that works for.
7220: 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 64 6f  ** pages that do
7230: 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f   contain overflo
7240: 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74  w cells..*/.stat
7250: 69 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66  ic u8 *findOverf
7260: 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  lowCell(MemPage 
7270: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
7280: 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  l){.  int i;.  a
7290: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
72a0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
72b0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
72c0: 20 20 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e    for(i=pPage->n
72d0: 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30  Overflow-1; i>=0
72e0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; i--){.    int 
72f0: 6b 3b 0a 20 20 20 20 6b 20 3d 20 70 50 61 67 65  k;.    k = pPage
7300: 2d 3e 61 69 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20  ->aiOvfl[i];.   
7310: 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b   if( k<=iCell ){
7320: 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43  .      if( k==iC
7330: 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ell ){.        r
7340: 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 61 70 4f  eturn pPage->apO
7350: 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  vfl[i];.      }.
7360: 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20        iCell--;. 
7370: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
7380: 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  n findCell(pPage
7390: 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  , iCell);.}../*.
73a0: 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20  ** Parse a cell 
73b0: 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e  content block an
73c0: 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65  d fill in the Ce
73d0: 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  llInfo structure
73e0: 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20  .  There.** are 
73f0: 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  two versions of 
7400: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20  this function.  
7410: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
7420: 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c   takes a .** cel
7430: 6c 20 69 6e 64 65 78 20 61 73 20 74 68 65 20 73  l index as the s
7440: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61  econd argument a
7450: 6e 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  nd btreeParseCel
7460: 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73  lPtr() .** takes
7470: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
7480: 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 63 65  e body of the ce
7490: 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f 6e 64  ll as its second
74a0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
74b0: 20 57 69 74 68 69 6e 20 74 68 69 73 20 66 69 6c   Within this fil
74c0: 65 2c 20 74 68 65 20 70 61 72 73 65 43 65 6c 6c  e, the parseCell
74d0: 28 29 20 6d 61 63 72 6f 20 63 61 6e 20 62 65 20  () macro can be 
74e0: 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 20 6f  called instead o
74f0: 66 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  f.** btreeParseC
7500: 65 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e 67 20  ellPtr(). Using 
7510: 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20  some compilers, 
7520: 74 68 69 73 20 77 69 6c 6c 20 62 65 20 66 61 73  this will be fas
7530: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
7540: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
7550: 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65  llPtr(.  MemPage
7560: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
7570: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
7580: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
7590: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
75a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
75b0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
75c0: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
75d0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
75e0: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
75f0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
7600: 0a 29 7b 0a 20 20 75 31 36 20 6e 3b 20 20 20 20  .){.  u16 n;    
7610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7620: 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20 69 6e   Number bytes in
7630: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65   cell content he
7640: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50  ader */.  u32 nP
7650: 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20  ayload;         
7660: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
7670: 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79  ytes of cell pay
7680: 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  load */..  asser
7690: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
76a0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
76b0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70  ->mutex) );..  p
76c0: 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43  Info->pCell = pC
76d0: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ell;.  assert( p
76e0: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c  Page->leaf==0 ||
76f0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20   pPage->leaf==1 
7700: 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e  );.  n = pPage->
7710: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
7720: 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70  assert( n==4-4*p
7730: 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
7740: 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
7750: 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  y ){.    if( pPa
7760: 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20  ge->hasData ){. 
7770: 20 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72       n += getVar
7780: 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c  int32(&pCell[n],
7790: 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20   nPayload);.    
77a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61  }else{.      nPa
77b0: 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d  yload = 0;.    }
77c0: 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72  .    n += getVar
77d0: 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28  int(&pCell[n], (
77e0: 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65  u64*)&pInfo->nKe
77f0: 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  y);.    pInfo->n
7800: 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  Data = nPayload;
7810: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
7820: 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 30 3b 0a  nfo->nData = 0;.
7830: 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69      n += getVari
7840: 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20  nt32(&pCell[n], 
7850: 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70  nPayload);.    p
7860: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61  Info->nKey = nPa
7870: 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e  yload;.  }.  pIn
7880: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
7890: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
78a0: 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20  ->nHeader = n;. 
78b0: 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c   testcase( nPayl
78c0: 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad==pPage->maxL
78d0: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
78e0: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
78f0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
7900: 29 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c 79 28  );.  if( likely(
7910: 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
7920: 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a 20 20  >maxLocal) ){.  
7930: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
7940: 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63   (easy) common c
7950: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e  ase where the en
7960: 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74  tire payload fit
7970: 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  s.    ** on the 
7980: 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20  local page.  No 
7990: 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75  overflow is requ
79a0: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
79b0: 20 69 66 28 20 28 70 49 6e 66 6f 2d 3e 6e 53 69   if( (pInfo->nSi
79c0: 7a 65 20 3d 20 28 75 31 36 29 28 6e 2b 6e 50 61  ze = (u16)(n+nPa
79d0: 79 6c 6f 61 64 29 29 3c 34 20 29 20 70 49 6e 66  yload))<4 ) pInf
79e0: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20  o->nSize = 4;.  
79f0: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
7a00: 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b  = (u16)nPayload;
7a10: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  .    pInfo->iOve
7a20: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c  rflow = 0;.  }el
7a30: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
7a40: 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e  e payload will n
7a50: 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c  ot fit completel
7a60: 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  y on the local p
7a70: 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20  age, we have.   
7a80: 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f   ** to decide ho
7a90: 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20  w much to store 
7aa0: 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20  locally and how 
7ab0: 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e  much to spill on
7ac0: 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  to.    ** overfl
7ad0: 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20 73  ow pages.  The s
7ae0: 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69  trategy is to mi
7af0: 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e  nimize the amoun
7b00: 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20  t of unused.    
7b10: 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72  ** space on over
7b20: 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65  flow pages while
7b30: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f   keeping the amo
7b40: 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f  unt of local sto
7b50: 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62  rage.    ** in b
7b60: 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20  etween minLocal 
7b70: 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20  and maxLocal..  
7b80: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e    **.    ** Warn
7b90: 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74  ing:  changing t
7ba0: 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20  he way overflow 
7bb0: 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72  payload is distr
7bc0: 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20  ibuted in any.  
7bd0: 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65    ** way will re
7be0: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  sult in an incom
7bf0: 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72  patible file for
7c00: 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mat..    */.    
7c10: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f  int minLocal;  /
7c20: 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Minimum amount
7c30: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
7c40: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
7c50: 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f  int maxLocal;  /
7c60: 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Maximum amount
7c70: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
7c80: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
7c90: 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f  int surplus;   /
7ca0: 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  * Overflow paylo
7cb0: 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ad available for
7cc0: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a   local storage *
7cd0: 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20  /..    minLocal 
7ce0: 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
7cf0: 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20  l;.    maxLocal 
7d00: 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  = pPage->maxLoca
7d10: 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d  l;.    surplus =
7d20: 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61   minLocal + (nPa
7d30: 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c  yload - minLocal
7d40: 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  )%(pPage->pBt->u
7d50: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
7d60: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 75      testcase( su
7d70: 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20  rplus==maxLocal 
7d80: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
7d90: 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63   surplus==maxLoc
7da0: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
7db0: 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f  surplus <= maxLo
7dc0: 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  cal ){.      pIn
7dd0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
7de0: 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d  6)surplus;.    }
7df0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66  else{.      pInf
7e00: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
7e10: 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d  )minLocal;.    }
7e20: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  .    pInfo->iOve
7e30: 72 66 6c 6f 77 20 3d 20 28 75 31 36 29 28 70 49  rflow = (u16)(pI
7e40: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 29  nfo->nLocal + n)
7e50: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  ;.    pInfo->nSi
7e60: 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  ze = pInfo->iOve
7e70: 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d  rflow + 4;.  }.}
7e80: 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65 43 65  .#define parseCe
7e90: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c  ll(pPage, iCell,
7ea0: 20 70 49 6e 66 6f 29 20 5c 0a 20 20 62 74 72 65   pInfo) \.  btre
7eb0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 28 70  eParseCellPtr((p
7ec0: 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28  Page), findCell(
7ed0: 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c 6c 29  (pPage), (iCell)
7ee0: 29 2c 20 28 70 49 6e 66 6f 29 29 0a 73 74 61 74  ), (pInfo)).stat
7ef0: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
7f00: 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  seCell(.  MemPag
7f10: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
7f20: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
7f30: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
7f40: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20  .  int iCell,   
7f50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7f60: 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46  e cell index.  F
7f70: 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a  irst cell is 0 *
7f80: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
7f90: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
7fa0: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
7fb0: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61  cture */.){.  pa
7fc0: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  rseCell(pPage, i
7fd0: 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a  Cell, pInfo);.}.
7fe0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
7ff0: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
8000: 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20  of bytes that a 
8010: 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68  Cell needs in th
8020: 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61  e cell.** data a
8030: 72 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65  rea of the btree
8040: 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75  -page.  The retu
8050: 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64  rn number includ
8060: 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64  es the cell.** d
8070: 61 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74  ata header and t
8080: 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64  he local payload
8090: 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76  , but not any ov
80a0: 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a  erflow page or.*
80b0: 2a 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64  * the space used
80c0: 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69   by the cell poi
80d0: 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nter..*/.static 
80e0: 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  u16 cellSizePtr(
80f0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8100: 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38  u8 *pCell){.  u8
8110: 20 2a 70 49 74 65 72 20 3d 20 26 70 43 65 6c 6c   *pIter = &pCell
8120: 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  [pPage->childPtr
8130: 53 69 7a 65 5d 3b 0a 20 20 75 33 32 20 6e 53 69  Size];.  u32 nSi
8140: 7a 65 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ze;..#ifdef SQLI
8150: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68  TE_DEBUG.  /* Th
8160: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
8170: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
8180: 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  n should always 
8190: 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20  be the same as. 
81a0: 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66   ** the (CellInf
81b0: 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66  o.nSize) value f
81c0: 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20  ound by doing a 
81d0: 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68  full parse of th
81e0: 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20  e.  ** cell. If 
81f0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20  SQLITE_DEBUG is 
8200: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
8210: 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74  rt() at the bott
8220: 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  om of.  ** this 
8230: 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65  function verifie
8240: 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61  s that this inva
8250: 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f  riant is not vio
8260: 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c  lated. */.  Cell
8270: 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a  Info debuginfo;.
8280: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
8290: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
82a0: 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23  , &debuginfo);.#
82b0: 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61  endif..  if( pPa
82c0: 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
82d0: 20 20 75 38 20 2a 70 45 6e 64 3b 0a 20 20 20 20    u8 *pEnd;.    
82e0: 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
82f0: 74 61 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  ta ){.      pIte
8300: 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  r += getVarint32
8310: 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a  (pIter, nSize);.
8320: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8330: 20 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20   nSize = 0;.    
8340: 7d 0a 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20  }..    /* pIter 
8350: 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68  now points at th
8360: 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  e 64-bit integer
8370: 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61   key value, a va
8380: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20  riable length . 
8390: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54     ** integer. T
83a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
83b0: 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74  ck moves pIter t
83c0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66  o point at the f
83d0: 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a  irst byte.    **
83e0: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
83f0: 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
8400: 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70  */.    pEnd = &p
8410: 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Iter[9];.    whi
8420: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
8430: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
8440: 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d );.  }else{.  
8450: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
8460: 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53  rint32(pIter, nS
8470: 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 74 65 73  ize);.  }..  tes
8480: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
8490: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
84a0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
84b0: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
84c0: 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e  cal+1 );.  if( n
84d0: 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c  Size>pPage->maxL
84e0: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
84f0: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
8500: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
8510: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
8520: 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c   + (nSize - minL
8530: 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e  ocal) % (pPage->
8540: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
8550: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
8560: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
8570: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
8580: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
8590: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
85a0: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
85b0: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
85c0: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e  Local ){.      n
85d0: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  Size = minLocal;
85e0: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65  .    }.    nSize
85f0: 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 6e 53 69   += 4;.  }.  nSi
8600: 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65  ze += (u32)(pIte
8610: 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 0a 20 20 2f  r - pCell);..  /
8620: 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69  * The minimum si
8630: 7a 65 20 6f 66 20 61 6e 79 20 63 65 6c 6c 20 69  ze of any cell i
8640: 73 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20  s 4 bytes. */.  
8650: 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b 0a 20  if( nSize<4 ){. 
8660: 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20     nSize = 4;.  
8670: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69  }..  assert( nSi
8680: 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53  ze==debuginfo.nS
8690: 69 7a 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ize );.  return 
86a0: 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23  (u16)nSize;.}..#
86b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
86c0: 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61  UG./* This varia
86d0: 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65  tion on cellSize
86e0: 50 74 72 28 29 20 69 73 20 75 73 65 64 20 69 6e  Ptr() is used in
86f0: 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29  side of assert()
8700: 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f   statements.** o
8710: 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75  nly. */.static u
8720: 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50  16 cellSize(MemP
8730: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
8740: 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e  iCell){.  return
8750: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
8760: 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ge, findCell(pPa
8770: 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23  ge, iCell));.}.#
8780: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
8790: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
87a0: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ACUUM./*.** If t
87b0: 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70  he cell pCell, p
87c0: 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61 67  art of page pPag
87d0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
87e0: 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76  nter.** to an ov
87f0: 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73  erflow page, ins
8800: 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ert an entry int
8810: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
8820: 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65  p.** for the ove
8830: 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73  rflow page..*/.s
8840: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61  tatic void ptrma
8850: 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50  pPutOvflPtr(MemP
8860: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
8870: 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29  pCell, int *pRC)
8880: 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  {.  CellInfo inf
8890: 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  o;.  if( *pRC ) 
88a0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
88b0: 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20  ( pCell!=0 );.  
88c0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
88d0: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
88e0: 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  &info);.  assert
88f0: 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70  ( (info.nData+(p
8900: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69  Page->intKey?0:i
8910: 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f  nfo.nKey))==info
8920: 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 69  .nPayload );.  i
8930: 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
8940: 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76  w ){.    Pgno ov
8950: 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
8960: 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
8970: 6c 6f 77 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61  low]);.    ptrma
8980: 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
8990: 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56   ovfl, PTRMAP_OV
89a0: 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
89b0: 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a  pgno, pRC);.  }.
89c0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
89d0: 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20   Defragment the 
89e0: 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c  page given.  All
89f0: 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64   Cells are moved
8a00: 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
8a10: 66 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61  f the page and a
8a20: 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73  ll free space is
8a30: 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20   collected into 
8a40: 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42  one.** big FreeB
8a50: 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  lk that occurs i
8a60: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65  n between the he
8a70: 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a  ader and cell.**
8a80: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61   pointer array a
8a90: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
8aa0: 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61  ent area..*/.sta
8ab0: 74 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65  tic int defragme
8ac0: 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  ntPage(MemPage *
8ad0: 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
8ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8af0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
8b00: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63  nter */.  int pc
8b10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8b20: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
8b30: 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a  of a i-th cell *
8b40: 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8b60: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
8b70: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
8b80: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
8b90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8ba0: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
8bb0: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
8bc0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
8bd0: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c   Number of usabl
8be0: 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67  e bytes on a pag
8bf0: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  e */.  int cellO
8c00: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
8c10: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
8c20: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
8c30: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63  array */.  int c
8c40: 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  brk;            
8c50: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
8c60: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
8c70: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
8c80: 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
8c90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
8ca0: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
8cb0: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  he page */.  uns
8cc0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
8cd0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
8ce0: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e  age data */.  un
8cf0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
8d00: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  p;       /* Temp
8d10: 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63   area for cell c
8d20: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  ontent */.  int 
8d30: 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20  iCellFirst;     
8d40: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
8d50: 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69  allowable cell i
8d60: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ndex */.  int iC
8d70: 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20  ellLast;        
8d80: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73       /* Last pos
8d90: 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  sible cell index
8da0: 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28 20   */...  assert( 
8db0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
8dc0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
8dd0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
8de0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
8df0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
8e00: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
8e10: 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45  leSize <= SQLITE
8e20: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29  _MAX_PAGE_SIZE )
8e30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
8e40: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
8e50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
8e60: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
8e70: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
8e80: 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73  x) );.  temp = s
8e90: 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
8ea0: 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d  pace(pPage->pBt-
8eb0: 3e 70 50 61 67 65 72 29 3b 0a 20 20 64 61 74 61  >pPager);.  data
8ec0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
8ed0: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
8ee0: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c  hdrOffset;.  cel
8ef0: 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
8f00: 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e  >cellOffset;.  n
8f10: 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
8f20: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ell;.  assert( n
8f30: 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26  Cell==get2byte(&
8f40: 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a  data[hdr+3]) );.
8f50: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
8f60: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
8f70: 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20  eSize;.  cbrk = 
8f80: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
8f90: 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79  dr+5]);.  memcpy
8fa0: 28 26 74 65 6d 70 5b 63 62 72 6b 5d 2c 20 26 64  (&temp[cbrk], &d
8fb0: 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c  ata[cbrk], usabl
8fc0: 65 53 69 7a 65 20 2d 20 63 62 72 6b 29 3b 0a 20  eSize - cbrk);. 
8fd0: 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69   cbrk = usableSi
8fe0: 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74  ze;.  iCellFirst
8ff0: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
9000: 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c  2*nCell;.  iCell
9010: 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a  Last = usableSiz
9020: 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30  e - 4;.  for(i=0
9030: 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
9040: 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20  .    u8 *pAddr; 
9050: 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20      /* The i-th 
9060: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
9070: 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74      pAddr = &dat
9080: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69  a[cellOffset + i
9090: 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65  *2];.    pc = ge
90a0: 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20  t2byte(pAddr);. 
90b0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
90c0: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
90d0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
90e0: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 23 69  =iCellLast );.#i
90f0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
9100: 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
9110: 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20  E_CELL_CHECK).  
9120: 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64 69    /* These condi
9130: 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65 61  tions have alrea
9140: 64 79 20 62 65 65 6e 20 76 65 72 69 66 69 65 64  dy been verified
9150: 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61 67   in btreeInitPag
9160: 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 53 51  e().    ** if SQ
9170: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52  LITE_ENABLE_OVER
9180: 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 20  SIZE_CELL_CHECK 
9190: 69 73 20 64 65 66 69 6e 65 64 20 0a 20 20 20 20  is defined .    
91a0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43  */.    if( pc<iC
91b0: 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69  ellFirst || pc>i
91c0: 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20  CellLast ){.    
91d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
91e0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
91f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61    }.#endif.    a
9200: 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c  ssert( pc>=iCell
9210: 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69 43 65  First && pc<=iCe
9220: 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 73 69  llLast );.    si
9230: 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ze = cellSizePtr
9240: 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70 63  (pPage, &temp[pc
9250: 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20  ]);.    cbrk -= 
9260: 73 69 7a 65 3b 0a 23 69 66 20 64 65 66 69 6e 65  size;.#if define
9270: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
9280: 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
9290: 45 43 4b 29 0a 20 20 20 20 69 66 28 20 63 62 72  ECK).    if( cbr
92a0: 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a  k<iCellFirst ){.
92b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
92c0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
92d0: 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
92e0: 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c    if( cbrk<iCell
92f0: 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65  First || pc+size
9300: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
9310: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
9320: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
9330: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
9340: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73    assert( cbrk+s
9350: 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize<=usableSize 
9360: 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  && cbrk>=iCellFi
9370: 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  rst );.    testc
9380: 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d  ase( cbrk+size==
9390: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
93a0: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
93b0: 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize==usableSize 
93c0: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
93d0: 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74 65 6d 70  ata[cbrk], &temp
93e0: 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20  [pc], size);.   
93f0: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
9400: 20 63 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73   cbrk);.  }.  as
9410: 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c  sert( cbrk>=iCel
9420: 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32  lFirst );.  put2
9430: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
9440: 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61  ], cbrk);.  data
9450: 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+1] = 0;.  d
9460: 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a  ata[hdr+2] = 0;.
9470: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
9480: 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  0;.  memset(&dat
9490: 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30  a[iCellFirst], 0
94a0: 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73  , cbrk-iCellFirs
94b0: 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t);.  assert( sq
94c0: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
94d0: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
94e0: 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 63  Page) );.  if( c
94f0: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d  brk-iCellFirst!=
9500: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a  pPage->nFree ){.
9510: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9520: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
9530: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
9540: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
9550: 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20   Allocate nByte 
9560: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
9570: 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42  rom within the B
9580: 2d 54 72 65 65 20 70 61 67 65 20 70 61 73 73 65  -Tree page passe
9590: 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73  d.** as the firs
95a0: 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72 69 74  t argument. Writ
95b0: 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74 68 65  e into *pIdx the
95c0: 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67   index into pPag
95d0: 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66  e->aData[].** of
95e0: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
95f0: 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61  of allocated spa
9600: 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74 68 65  ce. Return eithe
9610: 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a  r SQLITE_OK or.*
9620: 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * an error code 
9630: 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f  (usually SQLITE_
9640: 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20  CORRUPT)..**.** 
9650: 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61  The caller guara
9660: 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 72 65  ntees that there
9670: 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 73   is sufficient s
9680: 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65  pace to make the
9690: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  .** allocation. 
96a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   This routine mi
96b0: 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65 66 72  ght need to defr
96c0: 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 20  agment in order 
96d0: 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20  to bring.** all 
96e0: 74 68 65 20 73 70 61 63 65 20 74 6f 67 65 74 68  the space togeth
96f0: 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20 54 68  er, however.  Th
9700: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
9710: 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74  avoid using.** t
9720: 68 65 20 66 69 72 73 74 20 74 77 6f 20 62 79 74  he first two byt
9730: 65 73 20 70 61 73 74 20 74 68 65 20 63 65 6c 6c  es past the cell
9740: 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20 73 69   pointer area si
9750: 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79 20 74  nce presumably t
9760: 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  his.** allocatio
9770: 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64 65 20  n is being made 
9780: 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 73 65  in order to inse
9790: 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73  rt a new cell, s
97a0: 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73  o we will.** als
97b0: 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69 6e 67  o end up needing
97c0: 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e   a new cell poin
97d0: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ter..*/.static i
97e0: 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65  nt allocateSpace
97f0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
9800: 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20   int nByte, int 
9810: 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20  *pIdx){.  const 
9820: 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d  int hdr = pPage-
9830: 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f  >hdrOffset;    /
9840: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
9850: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
9860: 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73  t */.  u8 * cons
9870: 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  t data = pPage->
9880: 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c  aData;      /* L
9890: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50  ocal cache of pP
98a0: 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
98b0: 69 6e 74 20 6e 46 72 61 67 3b 20 20 20 20 20 20  int nFrag;      
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
98e0: 66 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74  f fragmented byt
98f0: 65 73 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20  es on pPage */. 
9900: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
9910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9920: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
9930: 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74  yte of cell cont
9940: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
9950: 74 20 67 61 70 3b 20 20 20 20 20 20 20 20 2f 2a  t gap;        /*
9960: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 67   First byte of g
9970: 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 20  ap between cell 
9980: 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63 65 6c  pointers and cel
9990: 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69  l content */.  i
99a0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f  nt rc;         /
99b0: 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e  * Integer return
99c0: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 75   code */.  int u
99d0: 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73  sableSize; /* Us
99e0: 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 74 68 65  able size of the
99f0: 20 70 61 67 65 20 2a 2f 0a 20 20 0a 20 20 61 73   page */.  .  as
9a00: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
9a10: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
9a20: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
9a30: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9a40: 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
9a50: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
9a60: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
9a70: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
9a80: 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29  sert( nByte>=0 )
9a90: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65  ;  /* Minimum ce
9aa0: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
9ab0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9ac0: 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b  >nFree>=nByte );
9ad0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9ae0: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
9af0: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
9b00: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
9b10: 62 6c 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  bleSize;.  asser
9b20: 74 28 20 6e 42 79 74 65 20 3c 20 75 73 61 62 6c  t( nByte < usabl
9b30: 65 53 69 7a 65 2d 38 20 29 3b 0a 0a 20 20 6e 46  eSize-8 );..  nF
9b40: 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  rag = data[hdr+7
9b50: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
9b60: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
9b70: 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70  = hdr + 12 - 4*p
9b80: 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
9b90: 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  gap = pPage->cel
9ba0: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
9bb0: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 74 6f 70 20  e->nCell;.  top 
9bc0: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
9bd0: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
9be0: 0a 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29  .  if( gap>top )
9bf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9c00: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 74  ORRUPT_BKPT;.  t
9c10: 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 3d 3d  estcase( gap+2==
9c20: 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73  top );.  testcas
9c30: 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b  e( gap+1==top );
9c40: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
9c50: 3d 3d 74 6f 70 20 29 3b 0a 0a 20 20 69 66 28 20  ==top );..  if( 
9c60: 6e 46 72 61 67 3e 3d 36 30 20 29 7b 0a 20 20 20  nFrag>=60 ){.   
9c70: 20 2f 2a 20 41 6c 77 61 79 73 20 64 65 66 72 61   /* Always defra
9c80: 67 6d 65 6e 74 20 68 69 67 68 6c 79 20 66 72 61  gment highly fra
9c90: 67 6d 65 6e 74 65 64 20 70 61 67 65 73 20 2a 2f  gmented pages */
9ca0: 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67  .    rc = defrag
9cb0: 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b  mentPage(pPage);
9cc0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
9cd0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70  turn rc;.    top
9ce0: 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65   = get2byteNotZe
9cf0: 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  ro(&data[hdr+5])
9d00: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67 61  ;.  }else if( ga
9d10: 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20  p+2<=top ){.    
9d20: 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 72  /* Search the fr
9d30: 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66  eelist looking f
9d40: 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62  or a free slot b
9d50: 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74  ig enough to sat
9d60: 69 73 66 79 20 0a 20 20 20 20 2a 2a 20 74 68 65  isfy .    ** the
9d70: 20 72 65 71 75 65 73 74 2e 20 54 68 65 20 61 6c   request. The al
9d80: 6c 6f 63 61 74 69 6f 6e 20 69 73 20 6d 61 64 65  location is made
9d90: 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20   from the first 
9da0: 66 72 65 65 20 73 6c 6f 74 20 69 6e 20 0a 20 20  free slot in .  
9db0: 20 20 2a 2a 20 74 68 65 20 6c 69 73 74 20 74 68    ** the list th
9dc0: 61 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  at is large enou
9dd0: 67 68 20 74 6f 20 61 63 63 6f 6d 61 64 61 74 65  gh to accomadate
9de0: 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
9df0: 69 6e 74 20 70 63 2c 20 61 64 64 72 3b 0a 20 20  int pc, addr;.  
9e00: 20 20 66 6f 72 28 61 64 64 72 3d 68 64 72 2b 31    for(addr=hdr+1
9e10: 3b 20 28 70 63 20 3d 20 67 65 74 32 62 79 74 65  ; (pc = get2byte
9e20: 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30  (&data[addr]))>0
9e30: 3b 20 61 64 64 72 3d 70 63 29 7b 0a 20 20 20 20  ; addr=pc){.    
9e40: 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
9e50: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
9e60: 66 20 74 68 65 20 66 72 65 65 20 73 6c 6f 74 20  f the free slot 
9e70: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 63 3e  */.      if( pc>
9e80: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20  usableSize-4 || 
9e90: 70 63 3c 61 64 64 72 2b 34 20 29 7b 0a 20 20 20  pc<addr+4 ){.   
9ea0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
9eb0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
9ec0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
9ed0: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
9ee0: 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  data[pc+2]);.   
9ef0: 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79     if( size>=nBy
9f00: 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  te ){.        in
9f10: 74 20 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79  t x = size - nBy
9f20: 74 65 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  te;.        test
9f30: 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20  case( x==4 );.  
9f40: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9f50: 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 20 20  x==3 );.        
9f60: 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20  if( x<4 ){.     
9f70: 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
9f80: 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65  he slot from the
9f90: 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61   free-list. Upda
9fa0: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
9fb0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 72  .          ** fr
9fc0: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77  agmented bytes w
9fd0: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20  ithin the page. 
9fe0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  */.          mem
9ff0: 63 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  cpy(&data[addr],
a000: 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a   &data[pc], 2);.
a010: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 5b 68            data[h
a020: 64 72 2b 37 5d 20 3d 20 28 75 38 29 28 6e 46 72  dr+7] = (u8)(nFr
a030: 61 67 20 2b 20 78 29 3b 0a 20 20 20 20 20 20 20  ag + x);.       
a040: 20 7d 65 6c 73 65 20 69 66 28 20 73 69 7a 65 2b   }else if( size+
a050: 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20  pc > usableSize 
a060: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
a070: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
a080: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
a090: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a0a0: 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72 65    /* The slot re
a0b0: 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72 65  mains on the fre
a0c0: 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20 69  e-list. Reduce i
a0d0: 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f 75  ts size to accou
a0e0: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nt.          ** 
a0f0: 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20  for the portion 
a100: 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77 20  used by the new 
a110: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20  allocation. */. 
a120: 20 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74           put2byt
a130: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20 78  e(&data[pc+2], x
a140: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
a150: 20 20 20 20 20 2a 70 49 64 78 20 3d 20 70 63 20       *pIdx = pc 
a160: 2b 20 78 3b 0a 20 20 20 20 20 20 20 20 72 65 74  + x;.        ret
a170: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
a180: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
a190: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
a1a0: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  make sure there 
a1b0: 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  is enough space 
a1c0: 69 6e 20 74 68 65 20 67 61 70 20 74 6f 20 73 61  in the gap to sa
a1d0: 74 69 73 66 79 0a 20 20 2a 2a 20 74 68 65 20 61  tisfy.  ** the a
a1e0: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 49 66 20 6e  llocation.  If n
a1f0: 6f 74 2c 20 64 65 66 72 61 67 6d 65 6e 74 2e 0a  ot, defragment..
a200: 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28    */.  testcase(
a210: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f   gap+2+nByte==to
a220: 70 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32  p );.  if( gap+2
a230: 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20  +nByte>top ){.  
a240: 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e    rc = defragmen
a250: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
a260: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
a270: 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20  n rc;.    top = 
a280: 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
a290: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
a2a0: 20 20 20 61 73 73 65 72 74 28 20 67 61 70 2b 6e     assert( gap+n
a2b0: 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d  Byte<=top );.  }
a2c0: 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ...  /* Allocate
a2d0: 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65   memory from the
a2e0: 20 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20   gap in between 
a2f0: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
a300: 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20   array.  ** and 
a310: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
a320: 20 61 72 65 61 2e 20 20 54 68 65 20 62 74 72 65   area.  The btre
a330: 65 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c  eInitPage() call
a340: 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a   has already.  *
a350: 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68 65 20  * validated the 
a360: 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e  freelist.  Given
a370: 20 74 68 61 74 20 74 68 65 20 66 72 65 65 6c 69   that the freeli
a380: 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65  st is valid, the
a390: 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61  re.  ** is no wa
a3a0: 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63  y that the alloc
a3b0: 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64  ation can extend
a3c0: 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
a3d0: 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54  the page..  ** T
a3e0: 68 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f  he assert() belo
a3f0: 77 20 76 65 72 69 66 69 65 73 20 74 68 65 20 70  w verifies the p
a400: 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65  revious sentence
a410: 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20  ..  */.  top -= 
a420: 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74  nByte;.  put2byt
a430: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
a440: 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  top);.  assert( 
a450: 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e  top+nByte <= (in
a460: 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  t)pPage->pBt->us
a470: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70  ableSize );.  *p
a480: 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74  Idx = top;.  ret
a490: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
a4a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
a4b0: 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20   section of the 
a4c0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20  pPage->aData to 
a4d0: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
a4e0: 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20   The first byte 
a4f0: 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65 20  of the new free 
a500: 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e  block is pPage->
a510: 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20  aDisk[start].** 
a520: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
a530: 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 22 73 69  the block is "si
a540: 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  ze" bytes..**.**
a550: 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 65 66 66   Most of the eff
a560: 6f 72 74 20 68 65 72 65 20 69 73 20 69 6e 76 6f  ort here is invo
a570: 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65 73 69 6e  lved in coalesin
a580: 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66 72  g adjacent.** fr
a590: 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20 61  ee blocks into a
a5a0: 20 73 69 6e 67 6c 65 20 62 69 67 20 66 72 65 65   single big free
a5b0: 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69   block..*/.stati
a5c0: 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65 28  c int freeSpace(
a5d0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
a5e0: 69 6e 74 20 73 74 61 72 74 2c 20 69 6e 74 20 73  int start, int s
a5f0: 69 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72  ize){.  int addr
a600: 2c 20 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20  , pbegin, hdr;. 
a610: 20 69 6e 74 20 69 4c 61 73 74 3b 20 20 20 20 20   int iLast;     
a620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a630: 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f     /* Largest po
a640: 73 73 69 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b  ssible freeblock
a650: 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 6e 73   offset */.  uns
a660: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
a670: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
a680: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
a690: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
a6a0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
a6b0: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
a6c0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
a6d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61 72  ;.  assert( star
a6e0: 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t>=pPage->hdrOff
a6f0: 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69  set+6+pPage->chi
a700: 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a 20 20 61  ldPtrSize );.  a
a710: 73 73 65 72 74 28 20 28 73 74 61 72 74 20 2b 20  ssert( (start + 
a720: 73 69 7a 65 29 20 3c 3d 20 28 69 6e 74 29 70 50  size) <= (int)pP
a730: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
a740: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
a750: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
a760: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
a770: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
a780: 65 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b 20  ert( size>=0 ); 
a790: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
a7a0: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 0a  l size is 4 */..
a7b0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74    if( pPage->pBt
a7c0: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
a7d0: 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29  _SECURE_DELETE )
a7e0: 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69  {.    /* Overwri
a7f0: 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
a800: 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
a810: 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 75 72  s when the secur
a820: 65 5f 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a 20  e_delete.    ** 
a830: 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
a840: 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  d */.    memset(
a850: 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30 2c  &data[start], 0,
a860: 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f   size);.  }..  /
a870: 2a 20 41 64 64 20 74 68 65 20 73 70 61 63 65 20  * Add the space 
a880: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69  back into the li
a890: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72 65  nked list of fre
a8a0: 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74 65 20 74  eblocks.  Note t
a8b0: 68 61 74 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68  hat.  ** even th
a8c0: 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f  ough the freeblo
a8d0: 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65 63  ck list was chec
a8e0: 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e 69 74  ked by btreeInit
a8f0: 50 61 67 65 28 29 2c 0a 20 20 2a 2a 20 62 74 72  Page(),.  ** btr
a900: 65 65 49 6e 69 74 50 61 67 65 28 29 20 64 69 64  eeInitPage() did
a910: 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72   not detect over
a920: 6c 61 70 70 69 6e 67 20 63 65 6c 6c 73 20 6f 72  lapping cells or
a930: 0a 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73  .  ** freeblocks
a940: 20 74 68 61 74 20 6f 76 65 72 6c 61 70 70 65 64   that overlapped
a950: 20 63 65 6c 6c 73 2e 20 20 20 4e 6f 72 20 64 6f   cells.   Nor do
a960: 65 73 20 69 74 20 64 65 74 65 63 74 20 77 68 65  es it detect whe
a970: 6e 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 20  n the.  ** cell 
a980: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 65 78 63  content area exc
a990: 65 65 64 73 20 74 68 65 20 76 61 6c 75 65 20 69  eeds the value i
a9a0: 6e 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  n the page heade
a9b0: 72 2e 20 20 49 66 20 74 68 65 73 65 0a 20 20 2a  r.  If these.  *
a9c0: 2a 20 73 69 74 75 61 74 69 6f 6e 73 20 61 72 69  * situations ari
a9d0: 73 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75  se, then subsequ
a9e0: 65 6e 74 20 69 6e 73 65 72 74 20 6f 70 65 72 61  ent insert opera
a9f0: 74 69 6f 6e 73 20 6d 69 67 68 74 20 63 6f 72 72  tions might corr
aa00: 75 70 74 0a 20 20 2a 2a 20 74 68 65 20 66 72 65  upt.  ** the fre
aa10: 65 6c 69 73 74 2e 20 20 53 6f 20 77 65 20 64 6f  elist.  So we do
aa20: 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66   need to check f
aa30: 6f 72 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 68  or corruption wh
aa40: 69 6c 65 20 73 63 61 6e 6e 69 6e 67 0a 20 20 2a  ile scanning.  *
aa50: 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  * the freelist..
aa60: 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61    */.  hdr = pPa
aa70: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
aa80: 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b   addr = hdr + 1;
aa90: 0a 20 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65  .  iLast = pPage
aaa0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
aab0: 65 20 2d 20 34 3b 0a 20 20 61 73 73 65 72 74 28  e - 4;.  assert(
aac0: 20 73 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b   start<=iLast );
aad0: 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69  .  while( (pbegi
aae0: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
aaf0: 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74  ta[addr]))<start
ab00: 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a   && pbegin>0 ){.
ab10: 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 3c 61      if( pbegin<a
ab20: 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 72  ddr+4 ){.      r
ab30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
ab40: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
ab50: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67  .    addr = pbeg
ab60: 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 62  in;.  }.  if( pb
ab70: 65 67 69 6e 3e 69 4c 61 73 74 20 29 7b 0a 20 20  egin>iLast ){.  
ab80: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ab90: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
aba0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62 65 67  }.  assert( pbeg
abb0: 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67 69  in>addr || pbegi
abc0: 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62 79  n==0 );.  put2by
abd0: 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20  te(&data[addr], 
abe0: 73 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62 79  start);.  put2by
abf0: 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c  te(&data[start],
ac00: 20 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74 32   pbegin);.  put2
ac10: 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74  byte(&data[start
ac20: 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50  +2], size);.  pP
ac30: 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61  age->nFree = pPa
ac40: 67 65 2d 3e 6e 46 72 65 65 20 2b 20 28 75 31 36  ge->nFree + (u16
ac50: 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61  )size;..  /* Coa
ac60: 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20 66  lesce adjacent f
ac70: 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ree blocks */.  
ac80: 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a  addr = hdr + 1;.
ac90: 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e    while( (pbegin
aca0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
acb0: 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20  a[addr]))>0 ){. 
acc0: 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70 73     int pnext, ps
acd0: 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73 73 65  ize, x;.    asse
ace0: 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20  rt( pbegin>addr 
acf0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
ad00: 62 65 67 69 6e 20 3c 3d 20 28 69 6e 74 29 70 50  begin <= (int)pP
ad10: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
ad20: 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70 6e  Size-4 );.    pn
ad30: 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26  ext = get2byte(&
ad40: 64 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a 20  data[pbegin]);. 
ad50: 20 20 20 70 73 69 7a 65 20 3d 20 67 65 74 32 62     psize = get2b
ad60: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
ad70: 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 62  +2]);.    if( pb
ad80: 65 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20 33  egin + psize + 3
ad90: 20 3e 3d 20 70 6e 65 78 74 20 26 26 20 70 6e 65   >= pnext && pne
ada0: 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  xt>0 ){.      in
adb0: 74 20 66 72 61 67 20 3d 20 70 6e 65 78 74 20 2d  t frag = pnext -
adc0: 20 28 70 62 65 67 69 6e 2b 70 73 69 7a 65 29 3b   (pbegin+psize);
add0: 0a 20 20 20 20 20 20 69 66 28 20 28 66 72 61 67  .      if( (frag
ade0: 3c 30 29 20 7c 7c 20 28 66 72 61 67 3e 28 69 6e  <0) || (frag>(in
adf0: 74 29 64 61 74 61 5b 68 64 72 2b 37 5d 29 20 29  t)data[hdr+7]) )
ae00: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
ae10: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
ae20: 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
ae30: 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20      data[hdr+7] 
ae40: 2d 3d 20 28 75 38 29 66 72 61 67 3b 0a 20 20 20  -= (u8)frag;.   
ae50: 20 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28     x = get2byte(
ae60: 26 64 61 74 61 5b 70 6e 65 78 74 5d 29 3b 0a 20  &data[pnext]);. 
ae70: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64       put2byte(&d
ae80: 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 78 29 3b  ata[pbegin], x);
ae90: 0a 20 20 20 20 20 20 78 20 3d 20 70 6e 65 78 74  .      x = pnext
aea0: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
aeb0: 61 5b 70 6e 65 78 74 2b 32 5d 29 20 2d 20 70 62  a[pnext+2]) - pb
aec0: 65 67 69 6e 3b 0a 20 20 20 20 20 20 70 75 74 32  egin;.      put2
aed0: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
aee0: 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 7d 65  n+2], x);.    }e
aef0: 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 20  lse{.      addr 
af00: 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 7d 0a  = pbegin;.    }.
af10: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
af20: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
af30: 65 61 20 62 65 67 69 6e 73 20 77 69 74 68 20 61  ea begins with a
af40: 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f   freeblock, remo
af50: 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ve it. */.  if( 
af60: 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64 61 74  data[hdr+1]==dat
af70: 61 5b 68 64 72 2b 35 5d 20 26 26 20 64 61 74 61  a[hdr+5] && data
af80: 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b 68 64  [hdr+2]==data[hd
af90: 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20  r+6] ){.    int 
afa0: 74 6f 70 3b 0a 20 20 20 20 70 62 65 67 69 6e 20  top;.    pbegin 
afb0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
afc0: 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6d 65  [hdr+1]);.    me
afd0: 6d 63 70 79 28 26 64 61 74 61 5b 68 64 72 2b 31  mcpy(&data[hdr+1
afe0: 5d 2c 20 26 64 61 74 61 5b 70 62 65 67 69 6e 5d  ], &data[pbegin]
aff0: 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70 20 3d 20  , 2);.    top = 
b000: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
b010: 64 72 2b 35 5d 29 20 2b 20 67 65 74 32 62 79 74  dr+5]) + get2byt
b020: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32  e(&data[pbegin+2
b030: 5d 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  ]);.    put2byte
b040: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
b050: 6f 70 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  op);.  }.  asser
b060: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
b070: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
b080: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
b090: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
b0a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  ;.}../*.** Decod
b0b0: 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
b0c0: 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65   (the first byte
b0d0: 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20   of the header) 
b0e0: 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e  for a page.** an
b0f0: 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65  d initialize fie
b100: 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  lds of the MemPa
b110: 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63  ge structure acc
b120: 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20  ordingly..**.** 
b130: 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  Only the followi
b140: 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  ng combinations 
b150: 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20  are supported.  
b160: 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72 65  Anything differe
b170: 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20  nt.** indicates 
b180: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
b190: 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  se files:.**.** 
b1a0: 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f          PTF_ZERO
b1b0: 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20  DATA.**         
b1c0: 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50  PTF_ZERODATA | P
b1d0: 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20  TF_LEAF.**      
b1e0: 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20     PTF_LEAFDATA 
b1f0: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20  | PTF_INTKEY.** 
b200: 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46          PTF_LEAF
b210: 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
b220: 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a  Y | PTF_LEAF.*/.
b230: 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64  static int decod
b240: 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a  eFlags(MemPage *
b250: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42  pPage, int flagB
b260: 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  yte){.  BtShared
b270: 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20   *pBt;     /* A 
b280: 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70  copy of pPage->p
b290: 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  Bt */..  assert(
b2a0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
b2b0: 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  t==(pPage->pgno=
b2c0: 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b  =1 ? 100 : 0) );
b2d0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b2e0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
b2f0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
b300: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61   );.  pPage->lea
b310: 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74  f = (u8)(flagByt
b320: 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20  e>>3);  assert( 
b330: 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33  PTF_LEAF == 1<<3
b340: 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26   );.  flagByte &
b350: 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70  = ~PTF_LEAF;.  p
b360: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
b370: 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e  ze = 4-4*pPage->
b380: 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d 20 70 50  leaf;.  pBt = pP
b390: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  age->pBt;.  if( 
b3a0: 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c  flagByte==(PTF_L
b3b0: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
b3c0: 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 70 50 61  TKEY) ){.    pPa
b3d0: 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a  ge->intKey = 1;.
b3e0: 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61      pPage->hasDa
b3f0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66  ta = pPage->leaf
b400: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
b410: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
b420: 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d  Leaf;.    pPage-
b430: 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >minLocal = pBt-
b440: 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73  >minLeaf;.  }els
b450: 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d  e if( flagByte==
b460: 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a  PTF_ZERODATA ){.
b470: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
b480: 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
b490: 2d 3e 68 61 73 44 61 74 61 20 3d 20 30 3b 0a 20  ->hasData = 0;. 
b4a0: 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
b4b0: 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  al = pBt->maxLoc
b4c0: 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  al;.    pPage->m
b4d0: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
b4e0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65  inLocal;.  }else
b4f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
b500: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b510: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d  ;.  }.  pPage->m
b520: 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d  ax1bytePayload =
b530: 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
b540: 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20  yload;.  return 
b550: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
b560: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
b570: 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66  he auxiliary inf
b580: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64  ormation for a d
b590: 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  isk block..**.**
b5a0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
b5b0: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  K on success.  I
b5c0: 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68  f we see that th
b5d0: 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e  e page does.** n
b5e0: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c  ot contain a wel
b5f0: 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
b600: 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74  e page, then ret
b610: 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  urn .** SQLITE_C
b620: 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68  ORRUPT.  Note th
b630: 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53  at a return of S
b640: 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f  QLITE_OK does no
b650: 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74  t.** guarantee t
b660: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
b670: 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74  well-formed.  It
b680: 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74   only shows that
b690: 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f  .** we failed to
b6a0: 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72   detect any corr
b6b0: 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
b6c0: 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50  c int btreeInitP
b6d0: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
b6e0: 67 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20  ge){..  assert( 
b6f0: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
b700: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b710: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
b720: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
b730: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
b740: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74  age->pgno==sqlit
b750: 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
b760: 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
b770: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
b780: 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50  Page == sqlite3P
b790: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
b7a0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
b7b0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b7c0: 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65  >aData == sqlite
b7d0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
b7e0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
b7f0: 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
b800: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75 31  isInit ){.    u1
b810: 36 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  6 pc;           
b820: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
b830: 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69   freeblock withi
b840: 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  n pPage->aData[]
b850: 20 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20   */.    u8 hdr; 
b860: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
b870: 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e  fset to beginnin
b880: 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72  g of page header
b890: 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61   */.    u8 *data
b8a0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71  ;          /* Eq
b8b0: 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44  ual to pPage->aD
b8c0: 61 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61  ata */.    BtSha
b8d0: 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
b8e0: 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72   /* The main btr
b8f0: 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
b900: 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69      int usableSi
b910: 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74  ze;    /* Amount
b920: 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65   of usable space
b930: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f   on each page */
b940: 0a 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66  .    u16 cellOff
b950: 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65  set;    /* Offse
b960: 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20  t from start of 
b970: 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65  page to first ce
b980: 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
b990: 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20    int nFree;    
b9a0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
b9b0: 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f  f unused bytes o
b9c0: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
b9d0: 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20    int top;      
b9e0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
b9f0: 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  te of the cell c
ba00: 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20  ontent area */. 
ba10: 20 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73     int iCellFirs
ba20: 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61  t;    /* First a
ba30: 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72  llowable cell or
ba40: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
ba50: 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65  t */.    int iCe
ba60: 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c  llLast;     /* L
ba70: 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c  ast possible cel
ba80: 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f  l or freeblock o
ba90: 66 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70 42  ffset */..    pB
baa0: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
bab0: 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65  .    hdr = pPage
bac0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  ->hdrOffset;.   
bad0: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
bae0: 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 64 65  Data;.    if( de
baf0: 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c  codeFlags(pPage,
bb00: 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65   data[hdr]) ) re
bb10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
bb20: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73  UPT_BKPT;.    as
bb30: 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53  sert( pBt->pageS
bb40: 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d  ize>=512 && pBt-
bb50: 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36  >pageSize<=65536
bb60: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d   );.    pPage->m
bb70: 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28  askPage = (u16)(
bb80: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
bb90: 31 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  1);.    pPage->n
bba0: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
bbb0: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
bbc0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
bbd0: 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f      pPage->cellO
bbe0: 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73  ffset = cellOffs
bbf0: 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  et = hdr + 12 - 
bc00: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  4*pPage->leaf;. 
bc10: 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45     pPage->aDataE
bc20: 6e 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c  nd = &data[usabl
bc30: 65 53 69 7a 65 5d 3b 0a 20 20 20 20 70 50 61 67  eSize];.    pPag
bc40: 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64  e->aCellIdx = &d
bc50: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b  ata[cellOffset];
bc60: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
bc70: 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61  yteNotZero(&data
bc80: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70 50  [hdr+5]);.    pP
bc90: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74  age->nCell = get
bca0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
bcb0: 33 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  3]);.    if( pPa
bcc0: 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c  ge->nCell>MX_CEL
bcd0: 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  L(pBt) ){.      
bce0: 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73  /* To many cells
bcf0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61   for a single pa
bd00: 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75  ge.  The page mu
bd10: 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f  st be corrupt */
bd20: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
bd30: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
bd40: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73  T;.    }.    tes
bd50: 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43  tcase( pPage->nC
bd60: 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74  ell==MX_CELL(pBt
bd70: 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d  ) );..    /* A m
bd80: 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  alformed databas
bd90: 65 20 70 61 67 65 20 6d 69 67 68 74 20 63 61 75  e page might cau
bda0: 73 65 20 75 73 20 74 6f 20 72 65 61 64 20 70 61  se us to read pa
bdb0: 73 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a  st the end.    *
bdc0: 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70  * of page when p
bdd0: 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20  arsing a cell.  
bde0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
bdf0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
be00: 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b  ck of code check
be10: 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69  s early to see i
be20: 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73  f a cell extends
be30: 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65  .    ** past the
be40: 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62   end of a page b
be50: 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73  oundary and caus
be60: 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  es SQLITE_CORRUP
be70: 54 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20  T to be .    ** 
be80: 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 20 64  returned if it d
be90: 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oes..    */.    
bea0: 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c  iCellFirst = cel
beb0: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
bec0: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43  e->nCell;.    iC
bed0: 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65  ellLast = usable
bee0: 53 69 7a 65 20 2d 20 34 3b 0a 23 69 66 20 64 65  Size - 4;.#if de
bef0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
bf00: 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c  BLE_OVERSIZE_CEL
bf10: 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 7b 0a 20  L_CHECK).    {. 
bf20: 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
bf30: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
bf40: 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  into the cell po
bf50: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
bf60: 20 20 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20       int sz;    
bf70: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
bf80: 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20  f a cell */..   
bf90: 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
bfa0: 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d  eaf ) iCellLast-
bfb0: 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  -;.      for(i=0
bfc0: 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
bfd0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
bfe0: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
bff0: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69  ata[cellOffset+i
c000: 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  *2]);.        te
c010: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
c020: 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20  lFirst );.      
c030: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
c040: 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20  iCellLast );.   
c050: 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c       if( pc<iCel
c060: 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
c070: 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
c080: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c090: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
c0a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c0b0: 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50    sz = cellSizeP
c0c0: 74 72 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b  tr(pPage, &data[
c0d0: 70 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  pc]);.        te
c0e0: 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75  stcase( pc+sz==u
c0f0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
c100: 20 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75       if( pc+sz>u
c110: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
c120: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
c130: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c140: 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  T;.        }.   
c150: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
c160: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43  pPage->leaf ) iC
c170: 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d  ellLast++;.    }
c180: 20 20 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f    .#endif..    /
c190: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
c1a0: 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f  tal free space o
c1b0: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
c1c0: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
c1d0: 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20  &data[hdr+1]);. 
c1e0: 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b     nFree = data[
c1f0: 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 0a 20 20  hdr+7] + top;.  
c200: 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b    while( pc>0 ){
c210: 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78 74 2c  .      u16 next,
c220: 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28   size;.      if(
c230: 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c   pc<iCellFirst |
c240: 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  | pc>iCellLast )
c250: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61  {.        /* Sta
c260: 72 74 20 6f 66 20 66 72 65 65 20 62 6c 6f 63 6b  rt of free block
c270: 20 69 73 20 6f 66 66 20 74 68 65 20 70 61 67 65   is off the page
c280: 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75   */.        retu
c290: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
c2a0: 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d  T_BKPT; .      }
c2b0: 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65  .      next = ge
c2c0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d  t2byte(&data[pc]
c2d0: 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20  );.      size = 
c2e0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
c2f0: 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  c+2]);.      if(
c300: 20 28 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74   (next>0 && next
c310: 3c 3d 70 63 2b 73 69 7a 65 2b 33 29 20 7c 7c 20  <=pc+size+3) || 
c320: 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69  pc+size>usableSi
c330: 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ze ){.        /*
c340: 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73   Free blocks mus
c350: 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e  t be in ascendin
c360: 67 20 6f 72 64 65 72 2e 20 41 6e 64 20 74 68 65  g order. And the
c370: 20 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 20 20   last byte of.  
c380: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65        ** the fre
c390: 65 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65  e-block must lie
c3a0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
c3b0: 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
c3c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c3d0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
c3e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46        }.      nF
c3f0: 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69  ree = nFree + si
c400: 7a 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e  ze;.      pc = n
c410: 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ext;.    }..    
c420: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
c430: 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73  , nFree contains
c440: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
c450: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
c460: 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  art.    ** of th
c470: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
c480: 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d  rea plus the num
c490: 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65  ber of free byte
c4a0: 73 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20  s within.    ** 
c4b0: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
c4c0: 20 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69   area. If this i
c4d0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
c4e0: 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20  he usable-size. 
c4f0: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67     ** of the pag
c500: 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  e, then the page
c510: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
c520: 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61  ed. This check a
c530: 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65  lso.    ** serve
c540: 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  s to verify that
c550: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
c560: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
c570: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20  cell-content.   
c580: 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64   ** area, accord
c590: 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20  ing to the page 
c5a0: 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74  header, lies wit
c5b0: 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20  hin the page..  
c5c0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72    */.    if( nFr
c5d0: 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ee>usableSize ){
c5e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
c5f0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c600: 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  T; .    }.    pP
c610: 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31  age->nFree = (u1
c620: 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c  6)(nFree - iCell
c630: 46 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67  First);.    pPag
c640: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  e->isInit = 1;. 
c650: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
c660: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
c670: 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67  Set up a raw pag
c680: 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f  e so that it loo
c690: 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61  ks like a databa
c6a0: 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a  se page holding.
c6b0: 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a  ** no entries..*
c6c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65  /.static void ze
c6d0: 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  roPage(MemPage *
c6e0: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73  pPage, int flags
c6f0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
c700: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
c710: 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61  ->aData;.  BtSha
c720: 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
c730: 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20  ->pBt;.  u8 hdr 
c740: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
c750: 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b  et;.  u16 first;
c760: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
c770: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
c780: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
c790: 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20  e)==pPage->pgno 
c7a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c7b0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
c7c0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
c7d0: 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
c7e0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
c7f0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
c800: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
c810: 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20  e) == data );.  
c820: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
c830: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
c840: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
c850: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c860: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
c870: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
c880: 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61   if( pBt->btsFla
c890: 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
c8a0: 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65  DELETE ){.    me
c8b0: 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c  mset(&data[hdr],
c8c0: 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   0, pBt->usableS
c8d0: 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a  ize - hdr);.  }.
c8e0: 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63    data[hdr] = (c
c8f0: 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72  har)flags;.  fir
c900: 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 34  st = hdr + 8 + 4
c910: 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41  *((flags&PTF_LEA
c920: 46 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20 20 6d  F)==0 ?1:0);.  m
c930: 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b  emset(&data[hdr+
c940: 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74  1], 0, 4);.  dat
c950: 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
c960: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
c970: 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62  dr+5], pBt->usab
c980: 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
c990: 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28  ->nFree = (u16)(
c9a0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
c9b0: 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f  - first);.  deco
c9c0: 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66  deFlags(pPage, f
c9d0: 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e  lags);.  pPage->
c9e0: 68 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b  hdrOffset = hdr;
c9f0: 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  .  pPage->cellOf
ca00: 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20  fset = first;.  
ca10: 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
ca20: 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61  = &data[pBt->usa
ca30: 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67  bleSize];.  pPag
ca40: 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64  e->aCellIdx = &d
ca50: 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50  ata[first];.  pP
ca60: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
ca70: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   0;.  assert( pB
ca80: 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  t->pageSize>=512
ca90: 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   && pBt->pageSiz
caa0: 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50  e<=65536 );.  pP
cab0: 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20  age->maskPage = 
cac0: 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53  (u16)(pBt->pageS
cad0: 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67  ize - 1);.  pPag
cae0: 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  e->nCell = 0;.  
caf0: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
cb00: 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  1;.}.../*.** Con
cb10: 76 65 72 74 20 61 20 44 62 50 61 67 65 20 6f 62  vert a DbPage ob
cb20: 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20  tained from the 
cb30: 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d  pager into a Mem
cb40: 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20  Page used by.** 
cb50: 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e  the btree layer.
cb60: 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61  .*/.static MemPa
cb70: 67 65 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f  ge *btreePageFro
cb80: 6d 44 62 50 61 67 65 28 44 62 50 61 67 65 20 2a  mDbPage(DbPage *
cb90: 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67  pDbPage, Pgno pg
cba0: 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42  no, BtShared *pB
cbb0: 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  t){.  MemPage *p
cbc0: 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a  Page = (MemPage*
cbd0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
cbe0: 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a  Extra(pDbPage);.
cbf0: 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d    pPage->aData =
cc00: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
cc10: 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
cc20: 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20   pPage->pDbPage 
cc30: 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70 50 61  = pDbPage;.  pPa
cc40: 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20  ge->pBt = pBt;. 
cc50: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70   pPage->pgno = p
cc60: 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64  gno;.  pPage->hd
cc70: 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  rOffset = pPage-
cc80: 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a  >pgno==1 ? 100 :
cc90: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61   0;.  return pPa
cca0: 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ge; .}../*.** Ge
ccb0: 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
ccc0: 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61  e pager.  Initia
ccd0: 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
cce0: 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
ccf0: 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
cd00: 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a  ts if needed..**
cd10: 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e  .** If the noCon
cd20: 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73 65 74  tent flag is set
cd30: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
cd40: 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
cd50: 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  bout.** the cont
cd60: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
cd70: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53  at this time.  S
cd80: 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74  o do not go to t
cd90: 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65  he disk.** to fe
cda0: 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e  tch the content.
cdb0: 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74    Just fill in t
cdc0: 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20  he content with 
cdd0: 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a  zeros for now..*
cde0: 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74 75  * If in the futu
cdf0: 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74  re we call sqlit
ce00: 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f  e3PagerWrite() o
ce10: 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 61  n this page, tha
ce20: 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61  t.** means we ha
ce30: 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62 65  ve started to be
ce40: 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74   concerned about
ce50: 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65   content and the
ce60: 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68   disk.** read sh
ce70: 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68  ould occur at th
ce80: 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  at point..*/.sta
ce90: 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
cea0: 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
ceb0: 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20   *pBt,       /* 
cec0: 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50  The btree */.  P
ced0: 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
cee0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
cef0: 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74   the page to fet
cf00: 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ch */.  MemPage 
cf10: 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
cf20: 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
cf30: 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  in this paramete
cf40: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e  r */.  int noCon
cf50: 74 65 6e 74 2c 20 20 20 20 20 20 20 2f 2a 20 44  tent,       /* D
cf60: 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65 20  o not load page 
cf70: 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75 65 20  content if true 
cf80: 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61 64 6f 6e  */.  int bReadon
cf90: 6c 79 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ly        /* Tru
cfa0: 65 20 69 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79  e if a read-only
cfb0: 20 28 6d 6d 61 70 29 20 70 61 67 65 20 69 73 20   (mmap) page is 
cfc0: 6f 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ok */.){.  int r
cfd0: 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  c;.  DbPage *pDb
cfe0: 50 61 67 65 3b 0a 20 20 69 6e 74 20 66 6c 61 67  Page;.  int flag
cff0: 73 20 3d 20 28 6e 6f 43 6f 6e 74 65 6e 74 20 3f  s = (noContent ?
d000: 20 50 41 47 45 52 5f 41 43 51 55 49 52 45 5f 4e   PAGER_ACQUIRE_N
d010: 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 29 20 0a 20  OCONTENT : 0) . 
d020: 20 20 20 20 20 20 20 20 20 20 20 7c 20 28 62 52             | (bR
d030: 65 61 64 6f 6e 6c 79 20 3f 20 50 41 47 45 52 5f  eadonly ? PAGER_
d040: 41 43 51 55 49 52 45 5f 52 45 41 44 4f 4e 4c 59  ACQUIRE_READONLY
d050: 20 3a 20 30 29 3b 0a 0a 20 20 61 73 73 65 72 74   : 0);..  assert
d060: 28 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 20 7c  ( noContent==0 |
d070: 7c 20 62 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 29  | bReadonly==0 )
d080: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
d090: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
d0a0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
d0b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
d0c0: 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50  rAcquire(pBt->pP
d0d0: 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50  ager, pgno, (DbP
d0e0: 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20  age**)&pDbPage, 
d0f0: 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63  flags);.  if( rc
d100: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
d110: 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65 65 50  *ppPage = btreeP
d120: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
d130: 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
d140: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
d150: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
d160: 52 65 74 72 69 65 76 65 20 61 20 70 61 67 65 20  Retrieve a page 
d170: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63  from the pager c
d180: 61 63 68 65 2e 20 49 66 20 74 68 65 20 72 65 71  ache. If the req
d190: 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
d1a0: 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  ot.** already in
d1b0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
d1c0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e   return NULL. In
d1d0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d  itialize the Mem
d1e0: 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20  Page.pBt and.** 
d1f0: 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c  MemPage.aData el
d200: 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64  ements if needed
d210: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50  ..*/.static MemP
d220: 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f  age *btreePageLo
d230: 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a 70  okup(BtShared *p
d240: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
d250: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
d260: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  e;.  assert( sql
d270: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
d280: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
d290: 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74   pDbPage = sqlit
d2a0: 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42  e3PagerLookup(pB
d2b0: 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  t->pPager, pgno)
d2c0: 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20  ;.  if( pDbPage 
d2d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74  ){.    return bt
d2e0: 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
d2f0: 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
d300: 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74   pBt);.  }.  ret
d310: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
d320: 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
d330: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
d340: 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49  file in pages. I
d350: 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b  f there is any k
d360: 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c  ind of.** error,
d370: 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e   return ((unsign
d380: 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73  ed int)-1)..*/.s
d390: 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65  tatic Pgno btree
d3a0: 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72  Pagecount(BtShar
d3b0: 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75  ed *pBt){.  retu
d3c0: 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d  rn pBt->nPage;.}
d3d0: 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74 72 65  .u32 sqlite3Btre
d3e0: 65 4c 61 73 74 50 61 67 65 28 42 74 72 65 65 20  eLastPage(Btree 
d3f0: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  *p){.  assert( s
d400: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
d410: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
d420: 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e  sert( ((p->pBt->
d430: 6e 50 61 67 65 29 26 30 78 38 30 30 30 30 30 30  nPage)&0x8000000
d440: 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
d450: 20 28 69 6e 74 29 62 74 72 65 65 50 61 67 65 63   (int)btreePagec
d460: 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a  ount(p->pBt);.}.
d470: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
d480: 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
d490: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
d4a0: 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  it.  This routin
d4b0: 65 20 69 73 20 6a 75 73 74 20 61 0a 2a 2a 20 63  e is just a.** c
d4c0: 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70  onvenience wrapp
d4d0: 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61  er around separa
d4e0: 74 65 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65  te calls to btre
d4f0: 65 47 65 74 50 61 67 65 28 29 20 61 6e 64 20 0a  eGetPage() and .
d500: 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  ** btreeInitPage
d510: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ()..**.** If an 
d520: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
d530: 65 6e 20 74 68 65 20 76 61 6c 75 65 20 2a 70 70  en the value *pp
d540: 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 69  Page is set to i
d550: 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a  s undefined. It.
d560: 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e  ** may remain un
d570: 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d  changed, or it m
d580: 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20  ay be set to an 
d590: 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a  invalid value..*
d5a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
d5b0: 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42  AndInitPage(.  B
d5c0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d5e0: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
d5f0: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
d600: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  no,             
d610: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
d620: 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
d630: 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  o get */.  MemPa
d640: 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
d650: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
d660: 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f 69  ite the page poi
d670: 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 69  nter here */.  i
d680: 6e 74 20 62 52 65 61 64 6f 6e 6c 79 20 20 20 20  nt bReadonly    
d690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d6a0: 2a 20 54 72 75 65 20 69 66 20 61 20 72 65 61 64  * True if a read
d6b0: 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29 20 70 61 67  -only (mmap) pag
d6c0: 65 20 69 73 20 6f 6b 20 2a 2f 0a 29 7b 0a 20 20  e is ok */.){.  
d6d0: 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
d6e0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
d6f0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
d700: 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e   );..  if( pgno>
d710: 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
d720: 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Bt) ){.    rc = 
d730: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
d740: 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  KPT;.  }else{.  
d750: 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
d760: 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70  age(pBt, pgno, p
d770: 70 50 61 67 65 2c 20 30 2c 20 62 52 65 61 64 6f  pPage, 0, bReado
d780: 6e 6c 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nly);.    if( rc
d790: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
d7a0: 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49       rc = btreeI
d7b0: 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65 29  nitPage(*ppPage)
d7c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
d7d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d7e0: 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
d7f0: 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
d800: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
d810: 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d  testcase( pgno==
d820: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
d830: 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  gno!=0 || rc==SQ
d840: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a  LITE_CORRUPT );.
d850: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
d860: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
d870: 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73  MemPage.  This s
d880: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
d890: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72  once for each pr
d8a0: 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62  ior.** call to b
d8b0: 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a  treeGetPage..*/.
d8c0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
d8d0: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
d8e0: 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70  *pPage){.  if( p
d8f0: 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Page ){.    asse
d900: 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
d910: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
d920: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
d930: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d940: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
d950: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
d960: 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29  = (void*)pPage )
d970: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
d980: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
d990: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
d9a0: 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20  )==pPage->aData 
d9b0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
d9c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
d9d0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
d9e0: 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  tex) );.    sqli
d9f0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
da00: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
da10: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69   }.}../*.** Duri
da20: 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77  ng a rollback, w
da30: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65  hen the pager re
da40: 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f  loads informatio
da50: 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  n into the cache
da60: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20  .** so that the 
da70: 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
da80: 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
da90: 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73  l state at the s
daa0: 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74  tart of.** the t
dab0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20  ransaction, for 
dac0: 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72  each page restor
dad0: 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
dae0: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
daf0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65   This routine ne
db00: 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65  eds to reset the
db10: 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74   extra data sect
db20: 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ion at the end o
db30: 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  f the.** page to
db40: 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20   agree with the 
db50: 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a  restored data..*
db60: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
db70: 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20  geReinit(DbPage 
db80: 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61  *pData){.  MemPa
db90: 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61  ge *pPage;.  pPa
dba0: 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29  ge = (MemPage *)
dbb0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
dbc0: 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61  xtra(pData);.  a
dbd0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
dbe0: 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
dbf0: 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66  pData)>0 );.  if
dc00: 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
dc10: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
dc20: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
dc30: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
dc40: 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67  tex) );.    pPag
dc50: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
dc60: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
dc70: 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
dc80: 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20  pData)>1 ){.    
dc90: 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74    /* pPage might
dca0: 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65 20   not be a btree 
dcb0: 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20  page;  it might 
dcc0: 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  be an overflow p
dcd0: 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20  age.      ** or 
dce0: 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61  ptrmap page or a
dcf0: 20 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20   free page.  In 
dd00: 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65  those cases, the
dd10: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20   following.     
dd20: 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65   ** call to btre
dd30: 65 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c  eInitPage() will
dd40: 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53   likely return S
dd50: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20  QLITE_CORRUPT.. 
dd60: 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68       ** But no h
dd70: 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74  arm is done by t
dd80: 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20  his.  And it is 
dd90: 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74  very important t
dda0: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72  hat.      ** btr
ddb0: 65 65 49 6e 69 74 50 61 67 65 28 29 20 62 65 20  eeInitPage() be 
ddc0: 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20  called on every 
ddd0: 62 74 72 65 65 20 70 61 67 65 20 73 6f 20 77 65  btree page so we
dde0: 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74   make.      ** t
ddf0: 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72  he call for ever
de00: 79 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65  y page that come
de10: 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74  s in for re-init
de20: 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74  ing. */.      bt
de30: 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
de40: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  e);.    }.  }.}.
de50: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
de60: 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
de70: 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73  or a btree..*/.s
de80: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49  tatic int btreeI
de90: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
dea0: 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20  (void *pArg){.  
deb0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
dec0: 28 42 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b  (BtShared*)pArg;
ded0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
dee0: 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  db );.  assert( 
def0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
df00: 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65  ld(pBt->db->mute
df10: 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  x) );.  return s
df20: 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79  qlite3InvokeBusy
df30: 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62  Handler(&pBt->db
df40: 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a  ->busyHandler);.
df50: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
df60: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
df70: 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20  * .** zFilename 
df80: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
df90: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
dfa0: 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  .  If zFilename 
dfb0: 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20  is NULL.** then 
dfc0: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  an ephemeral dat
dfd0: 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64  abase is created
dfe0: 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72 61 6c  .  The ephemeral
dff0: 20 64 61 74 61 62 61 73 65 20 6d 69 67 68 74 0a   database might.
e000: 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65 6c  ** be exclusivel
e010: 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20  y in memory, or 
e020: 69 74 20 6d 69 67 68 74 20 75 73 65 20 61 20 64  it might use a d
e030: 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79  isk-based memory
e040: 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65   cache..** Eithe
e050: 72 20 77 61 79 2c 20 74 68 65 20 65 70 68 65 6d  r way, the ephem
e060: 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 77 69  eral database wi
e070: 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  ll be automatica
e080: 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20  lly deleted .** 
e090: 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65  when sqlite3Btre
e0a0: 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c  eClose() is call
e0b0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ed..**.** If zFi
e0c0: 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
e0d0: 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d  ry:" then an in-
e0e0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
e0f0: 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68  is created.** th
e100: 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  at is automatica
e110: 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77 68  lly destroyed wh
e120: 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
e130: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67  .**.** The "flag
e140: 73 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  s" parameter is 
e150: 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20 6d  a bitmask that m
e160: 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69 74  ight contain bit
e170: 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f  s like.** BTREE_
e180: 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64  OMIT_JOURNAL and
e190: 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59  /or BTREE_MEMORY
e1a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
e1b0: 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
e1c0: 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68 65  dy opened in the
e1d0: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63   same database c
e1e0: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64  onnection.** and
e1f0: 20 77 65 20 61 72 65 20 69 6e 20 73 68 61 72 65   we are in share
e200: 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d cache mode, th
e210: 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c  en the open will
e220: 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a   fail with an.**
e230: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
e240: 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63 61  NT error.  We ca
e250: 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f  nnot allow two o
e260: 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64 0a  r more BtShared.
e270: 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68  ** objects in th
e280: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
e290: 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65  connection since
e2a0: 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c   doing so will l
e2b0: 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65  ead.** to proble
e2c0: 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e  ms with locking.
e2d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
e2e0: 74 72 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69  treeOpen(.  sqli
e2f0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
e300: 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73      /* VFS to us
e310: 65 20 66 6f 72 20 74 68 69 73 20 62 2d 74 72 65  e for this b-tre
e320: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
e330: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f  r *zFilename,  /
e340: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
e350: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
e360: 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65  e BTree database
e370: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
e380: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
e390: 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   Associated data
e3a0: 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
e3b0: 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65   Btree **ppBtree
e3c0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ,        /* Poin
e3d0: 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65  ter to new Btree
e3e0: 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20   object written 
e3f0: 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
e400: 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
e410: 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a    /* Options */.
e420: 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
e430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
e440: 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
e450: 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
e460: 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20  .xOpen() */.){. 
e470: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
e480: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
e490: 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f  /* Shared part o
e4a0: 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  f btree structur
e4b0: 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b  e */.  Btree *p;
e4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4d0: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
e4e0: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73  to return */.  s
e4f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
e500: 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a  texOpen = 0;  /*
e510: 20 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65   Prevents a race
e520: 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b   condition. Tick
e530: 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e  et #3537 */.  in
e540: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e550: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
e560: 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d  Result code from
e570: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
e580: 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b  /.  u8 nReserve;
e590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5a0: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e     /* Byte of un
e5b0: 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61  used space on ea
e5c0: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  ch page */.  uns
e5d0: 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65  igned char zDbHe
e5e0: 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44  ader[100];  /* D
e5f0: 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63  atabase header c
e600: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20  ontent */..  /* 
e610: 54 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67 20  True if opening 
e620: 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 65  an ephemeral, te
e630: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
e640: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
e650: 69 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65  isTempDb = zFile
e660: 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65  name==0 || zFile
e670: 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f  name[0]==0;..  /
e680: 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62  * Set the variab
e690: 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72  le isMemdb to tr
e6a0: 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ue for an in-mem
e6b0: 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72  ory database, or
e6c0: 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72   .  ** false for
e6d0: 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61   a file-based da
e6e0: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66  tabase..  */.#if
e6f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e700: 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74  MEMORYDB.  const
e710: 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30   int isMemdb = 0
e720: 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20  ;.#else.  const 
e730: 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a  int isMemdb = (z
e740: 46 69 6c 65 6e 61 6d 65 20 26 26 20 73 74 72 63  Filename && strc
e750: 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a  mp(zFilename, ":
e760: 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20  memory:")==0).  
e770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e780: 20 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70 44       || (isTempD
e790: 62 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d 70  b && sqlite3Temp
e7a0: 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a 20 20  InMemory(db)).  
e7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7c0: 20 20 20 20 20 7c 7c 20 28 76 66 73 46 6c 61 67       || (vfsFlag
e7d0: 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
e7e0: 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64  MEMORY)!=0;.#end
e7f0: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  if..  assert( db
e800: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e810: 20 70 56 66 73 21 3d 30 20 29 3b 0a 20 20 61 73   pVfs!=0 );.  as
e820: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
e830: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
e840: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
e850: 20 28 66 6c 61 67 73 26 30 78 66 66 29 3d 3d 66   (flags&0xff)==f
e860: 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61  lags );   /* fla
e870: 67 73 20 66 69 74 20 69 6e 20 38 20 62 69 74 73  gs fit in 8 bits
e880: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61   */..  /* Only a
e890: 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61   BTREE_SINGLE da
e8a0: 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 42 54  tabase can be BT
e8b0: 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f  REE_UNORDERED */
e8c0: 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
e8d0: 73 20 26 20 42 54 52 45 45 5f 55 4e 4f 52 44 45  s & BTREE_UNORDE
e8e0: 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67  RED)==0 || (flag
e8f0: 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  s & BTREE_SINGLE
e900: 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20  )!=0 );..  /* A 
e910: 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74  BTREE_SINGLE dat
e920: 61 62 61 73 65 20 69 73 20 61 6c 77 61 79 73 20  abase is always 
e930: 61 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f  a temporary and/
e940: 6f 72 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a  or ephemeral */.
e950: 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
e960: 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29   & BTREE_SINGLE)
e970: 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44 62 20  ==0 || isTempDb 
e980: 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65 6d 64  );..  if( isMemd
e990: 62 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c  b ){.    flags |
e9a0: 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a  = BTREE_MEMORY;.
e9b0: 20 20 7d 0a 20 20 69 66 28 20 28 76 66 73 46 6c    }.  if( (vfsFl
e9c0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
e9d0: 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26  N_MAIN_DB)!=0 &&
e9e0: 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54   (isMemdb || isT
e9f0: 65 6d 70 44 62 29 20 29 7b 0a 20 20 20 20 76 66  empDb) ){.    vf
ea00: 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c 61  sFlags = (vfsFla
ea10: 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45  gs & ~SQLITE_OPE
ea20: 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c  N_MAIN_DB) | SQL
ea30: 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
ea40: 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69  ;.  }.  p = sqli
ea50: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
ea60: 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20  zeof(Btree));.  
ea70: 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65  if( !p ){.    re
ea80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
ea90: 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72  M;.  }.  p->inTr
eaa0: 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
eab0: 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a  ;.  p->db = db;.
eac0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ead0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
eae0: 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65  .  p->lock.pBtre
eaf0: 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b  e = p;.  p->lock
eb00: 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e  .iTable = 1;.#en
eb10: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
eb20: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
eb30: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
eb40: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
eb50: 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a  MIT_DISKIO).  /*
eb60: 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74  .  ** If this Bt
eb70: 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61  ree is a candida
eb80: 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61  te for shared ca
eb90: 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64  che, try to find
eba0: 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e   an.  ** existin
ebb0: 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  g BtShared objec
ebc0: 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68  t that we can sh
ebd0: 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20  are with.  */.  
ebe0: 69 66 28 20 69 73 54 65 6d 70 44 62 3d 3d 30 20  if( isTempDb==0 
ebf0: 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c  && (isMemdb==0 |
ec00: 7c 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49  | (vfsFlags&SQLI
ec10: 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29  TE_OPEN_URI)!=0)
ec20: 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46   ){.    if( vfsF
ec30: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
ec40: 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 29  EN_SHAREDCACHE )
ec50: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c  {.      int nFul
ec60: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73  lPathname = pVfs
ec70: 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
ec80: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c        char *zFul
ec90: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
eca0: 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50  te3Malloc(nFullP
ecb0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
ecc0: 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
ecd0: 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
ece0: 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20  xShared; ).     
ecf0: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31   p->sharable = 1
ed00: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46 75  ;.      if( !zFu
ed10: 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  llPathname ){.  
ed20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
ed30: 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ee(p);.        r
ed40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
ed50: 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
ed60: 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b    if( isMemdb ){
ed70: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
ed80: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a  zFullPathname, z
ed90: 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69 74 65  Filename, sqlite
eda0: 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
edb0: 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 20 20 7d  ame)+1);.      }
edc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
edd0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
ede0: 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
edf0: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee10: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 46 75               nFu
ee20: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c  llPathname, zFul
ee30: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
ee40: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
ee50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
ee60: 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
ee70: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  me);.          s
ee80: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
ee90: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
eea0: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
eeb0: 20 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54       }.#if SQLIT
eec0: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 20  E_THREADSAFE.   
eed0: 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73     mutexOpen = s
eee0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
eef0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
ef00: 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20  ATIC_OPEN);.    
ef10: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
ef20: 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29  enter(mutexOpen)
ef30: 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61  ;.      mutexSha
ef40: 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  red = sqlite3Mut
ef50: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
ef60: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
ef70: 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ER);.      sqlit
ef80: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
ef90: 75 74 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e  utexShared);.#en
efa0: 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42  dif.      for(pB
efb0: 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  t=GLOBAL(BtShare
efc0: 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
efd0: 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b  CacheList); pBt;
efe0: 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29   pBt=pBt->pNext)
eff0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
f000: 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pBt->nRef>0 );
f010: 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d  .        if( 0==
f020: 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68  strcmp(zFullPath
f030: 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67  name, sqlite3Pag
f040: 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e  erFilename(pBt->
f050: 70 50 61 67 65 72 2c 20 30 29 29 0a 20 20 20 20  pPager, 0)).    
f060: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
f070: 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
f080: 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56  pBt->pPager)==pV
f090: 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fs ){.          
f0a0: 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
f0b0: 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e     for(iDb=db->n
f0c0: 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44  Db-1; iDb>=0; iD
f0d0: 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b--){.          
f0e0: 20 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69    Btree *pExisti
f0f0: 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ng = db->aDb[iDb
f100: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  ].pBt;.         
f110: 20 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67     if( pExisting
f120: 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70   && pExisting->p
f130: 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  Bt==pBt ){.     
f140: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f150: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
f160: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
f170: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
f180: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
f190: 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20  exOpen);.       
f1a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
f1b0: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
f1c0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
f1d0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
f1e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
f1f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
f200: 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20  ONSTRAINT;.     
f210: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f220: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
f230: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
f240: 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66         pBt->nRef
f250: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ++;.          br
f260: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
f270: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
f280: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
f290: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
f2a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
f2b0: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
f2c0: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
f2d0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
f2e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
f2f0: 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65  n debug mode, we
f300: 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73   mark all persis
f310: 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61  tent databases a
f320: 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20  s sharable.     
f330: 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68   ** even when th
f340: 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69  ey are not.  Thi
f350: 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20  s exercises the 
f360: 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64  locking code and
f370: 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20  .      ** gives 
f380: 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79  more opportunity
f390: 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c   for asserts(sql
f3a0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
f3b0: 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  )).      ** stat
f3c0: 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c  ements to find l
f3d0: 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e  ocking problems.
f3e0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
f3f0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
f400: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
f410: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
f420: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a  Bt==0 ){.    /*.
f430: 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
f440: 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b  wing asserts mak
f450: 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75  e sure that stru
f460: 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74  ctures used by t
f470: 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20  he btree are.   
f480: 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69   ** the right si
f490: 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20  ze.  This is to 
f4a0: 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69  guard against si
f4b0: 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ze changes that 
f4c0: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68  result.    ** wh
f4d0: 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20  en compiling on 
f4e0: 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68  a different arch
f4f0: 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  itecture..    */
f500: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
f510: 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(i64)==8 || s
f520: 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b  izeof(i64)==4 );
f530: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
f540: 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(u64)==8 || s
f550: 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b  izeof(u64)==4 );
f560: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
f570: 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20  eof(u32)==4 );. 
f580: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
f590: 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20  f(u16)==2 );.   
f5a0: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
f5b0: 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20  Pgno)==4 );.  . 
f5c0: 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33     pBt = sqlite3
f5d0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
f5e0: 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20  of(*pBt) );.    
f5f0: 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
f600: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
f610: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
f620: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
f630: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
f640: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
f650: 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50  n(pVfs, &pBt->pP
f660: 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  ager, zFilename,
f670: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f680: 20 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41             EXTRA
f690: 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66  _SIZE, flags, vf
f6a0: 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69 6e  sFlags, pageRein
f6b0: 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  it);.    if( rc=
f6c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f6d0: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
f6e0: 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74  SetMmapLimit(pBt
f6f0: 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e 73 7a  ->pPager, db->sz
f700: 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20  Mmap);.      rc 
f710: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
f720: 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42 74  adFileheader(pBt
f730: 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28  ->pPager,sizeof(
f740: 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65  zDbHeader),zDbHe
f750: 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ader);.    }.   
f760: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f770: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
f780: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
f790: 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
f7a0: 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38 29  openFlags = (u8)
f7b0: 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d 3e  flags;.    pBt->
f7c0: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c  db = db;.    sql
f7d0: 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
f7e0: 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61  handler(pBt->pPa
f7f0: 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65  ger, btreeInvoke
f800: 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42 74  BusyHandler, pBt
f810: 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20  );.    p->pBt = 
f820: 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74 2d  pBt;.  .    pBt-
f830: 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20  >pCursor = 0;.  
f840: 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
f850: 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
f860: 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
f870: 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  y(pBt->pPager) )
f880: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
f890: 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b  = BTS_READ_ONLY;
f8a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
f8b0: 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20  ECURE_DELETE.   
f8c0: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
f8d0: 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  = BTS_SECURE_DEL
f8e0: 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ETE;.#endif.    
f8f0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
f900: 28 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c  (zDbHeader[16]<<
f910: 38 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b  8) | (zDbHeader[
f920: 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66  17]<<16);.    if
f930: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  ( pBt->pageSize<
f940: 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65  512 || pBt->page
f950: 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
f960: 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20  PAGE_SIZE.      
f970: 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67     || ((pBt->pag
f980: 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61  eSize-1)&pBt->pa
f990: 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20  geSize)!=0 ){.  
f9a0: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
f9b0: 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  e = 0;.#ifndef S
f9c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
f9d0: 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49  ACUUM.      /* I
f9e0: 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65  f the magic name
f9f0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c   ":memory:" will
fa00: 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65   create an in-me
fa10: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74  mory database, t
fa20: 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61  hen.      ** lea
fa30: 76 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75  ve the autoVacuu
fa40: 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20  m mode at 0 (do 
fa50: 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29  not auto-vacuum)
fa60: 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20  , even if.      
fa70: 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ** SQLITE_DEFAUL
fa80: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
fa90: 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68  true. On the oth
faa0: 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20  er hand, if.    
fab0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54    ** SQLITE_OMIT
fac0: 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65  _MEMORYDB has be
fad0: 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  en defined, then
fae0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a   ":memory:" is j
faf0: 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72  ust a.      ** r
fb00: 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65  egular file-name
fb10: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
fb20: 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61  he auto-vacuum a
fb30: 70 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f  pplies as per no
fb40: 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  rmal..      */. 
fb50: 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61       if( zFilena
fb60: 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29  me && !isMemdb )
fb70: 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61  {.        pBt->a
fb80: 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c  utoVacuum = (SQL
fb90: 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
fba0: 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b  VACUUM ? 1 : 0);
fbb0: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  .        pBt->in
fbc0: 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  crVacuum = (SQLI
fbd0: 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
fbe0: 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30  ACUUM==2 ? 1 : 0
fbf0: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
fc00: 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65  f.      nReserve
fc10: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
fc20: 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
fc30: 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b  = zDbHeader[20];
fc40: 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
fc50: 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45  lags |= BTS_PAGE
fc60: 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e  SIZE_FIXED;.#ifn
fc70: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fc80: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
fc90: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
fca0: 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
fcb0: 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34  bHeader[36 + 4*4
fcc0: 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70  ])?1:0);.      p
fcd0: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
fce0: 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48   (get4byte(&zDbH
fcf0: 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29  eader[36 + 7*4])
fd00: 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
fd10: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
fd20: 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
fd30: 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
fd40: 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
fd50: 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20  , nReserve);.   
fd60: 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
fd70: 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
fd80: 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
fd90: 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ze = pBt->pageSi
fda0: 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20  ze - nReserve;. 
fdb0: 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d     assert( (pBt-
fdc0: 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  >pageSize & 7)==
fdd0: 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20  0 );  /* 8-byte 
fde0: 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67  alignment of pag
fdf0: 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66  eSize */.   .#if
fe00: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
fe10: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
fe20: 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
fe30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
fe40: 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74  IO).    /* Add t
fe50: 68 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20  he new BtShared 
fe60: 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69  object to the li
fe70: 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62  nked list sharab
fe80: 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20  le BtShareds..  
fe90: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
fea0: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
feb0: 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
fec0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
fed0: 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20  texShared; ).   
fee0: 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31     pBt->nRef = 1
fef0: 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  ;.      MUTEX_LO
ff00: 47 49 43 28 20 6d 75 74 65 78 53 68 61 72 65 64  GIC( mutexShared
ff10: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
ff20: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
ff30: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
ff40: 3b 29 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  ;).      if( SQL
ff50: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
ff60: 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  & sqlite3GlobalC
ff70: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
ff80: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
ff90: 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
ffa0: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
ffb0: 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
ffc0: 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e         if( pBt->
ffd0: 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
ffe0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
fff0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
10000 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
10010 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  led = 0;.       
10020 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
10030 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  en_out;.        
10040 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
10050 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
10060 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29  ter(mutexShared)
10070 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65  ;.      pBt->pNe
10080 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68  xt = GLOBAL(BtSh
10090 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
100a0 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20  redCacheList);. 
100b0 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68       GLOBAL(BtSh
100c0 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
100d0 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20  redCacheList) = 
100e0 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pBt;.      sqlit
100f0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
10100 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
10110 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23   }.#endif.  }..#
10120 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
10130 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
10140 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
10150 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
10160 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68  SKIO).  /* If th
10170 65 20 6e 65 77 20 42 74 72 65 65 20 75 73 65 73  e new Btree uses
10180 20 61 20 73 68 61 72 61 62 6c 65 20 70 42 74 53   a sharable pBtS
10190 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b  hared, then link
101a0 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74   the new.  ** Bt
101b0 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73  ree into the lis
101c0 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c  t of all sharabl
101d0 65 20 42 74 72 65 65 73 20 66 6f 72 20 74 68 65  e Btrees for the
101e0 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e   same connection
101f0 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20  ..  ** The list 
10200 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e  is kept in ascen
10210 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42  ding order by pB
10220 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a  t address..  */.
10230 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
10240 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
10250 20 20 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b      Btree *pSib;
10260 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
10270 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
10280 20 20 20 20 20 69 66 28 20 28 70 53 69 62 20 3d       if( (pSib =
10290 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29   db->aDb[i].pBt)
102a0 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61  !=0 && pSib->sha
102b0 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  rable ){.       
102c0 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50   while( pSib->pP
102d0 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53  rev ){ pSib = pS
102e0 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20  ib->pPrev; }.   
102f0 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c       if( p->pBt<
10300 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20  pSib->pBt ){.   
10310 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
10320 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
10330 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
10340 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e            pSib->
10350 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
10360 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10370 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
10380 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e  >pNext && pSib->
10390 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42  pNext->pBt<p->pB
103a0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
103b0 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e   pSib = pSib->pN
103c0 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ext;.          }
103d0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  .          p->pN
103e0 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78  ext = pSib->pNex
103f0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  t;.          p->
10400 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20  pPrev = pSib;.  
10410 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
10420 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
10430 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50      p->pNext->pP
10440 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rev = p;.       
10450 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
10460 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a  Sib->pNext = p;.
10470 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10480 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
10490 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
104a0 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70  f.  *ppBtree = p
104b0 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  ;..btree_open_ou
104c0 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  t:.  if( rc!=SQL
104d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
104e0 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50  ( pBt && pBt->pP
104f0 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71  ager ){.      sq
10500 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
10510 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
10520 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
10530 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73  free(pBt);.    s
10540 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
10550 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30      *ppBtree = 0
10560 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
10570 2a 20 49 66 20 74 68 65 20 42 2d 54 72 65 65 20  * If the B-Tree 
10580 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
10590 20 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65   opened, set the
105a0 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a   pager-cache siz
105b0 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  e to the.    ** 
105c0 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45  default value. E
105d0 78 63 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e  xcept, when open
105e0 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69  ing on an existi
105f0 6e 67 20 73 68 61 72 65 64 20 70 61 67 65 72 2d  ng shared pager-
10600 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f  cache,.    ** do
10610 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
10620 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65  pager-cache size
10630 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
10640 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68   sqlite3BtreeSch
10650 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20  ema(p, 0, 0)==0 
10660 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10670 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
10680 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  e(p->pBt->pPager
10690 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
106a0 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20  _CACHE_SIZE);.  
106b0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75    }.  }.  if( mu
106c0 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61  texOpen ){.    a
106d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
106e0 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f  utex_held(mutexO
106f0 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  pen) );.    sqli
10700 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
10710 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a  mutexOpen);.  }.
10720 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10730 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20  /*.** Decrement 
10740 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
10750 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e  f counter.  When
10760 20 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f   it reaches zero
10770 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20  ,.** remove the 
10780 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
10790 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72  re from the shar
107a0 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72  ing list.  Retur
107b0 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65  n.** true if the
107c0 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
107d0 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a  ounter reaches z
107e0 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ero and return.*
107f0 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73  * false if it is
10800 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e   still positive.
10810 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
10820 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
10830 4c 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70  List(BtShared *p
10840 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Bt){.#ifndef SQL
10850 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
10860 43 41 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f  CACHE.  MUTEX_LO
10870 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
10880 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20  ex *pMaster; ). 
10890 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74   BtShared *pList
108a0 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20  ;.  int removed 
108b0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
108c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f  sqlite3_mutex_no
108d0 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  theld(pBt->mutex
108e0 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  ) );.  MUTEX_LOG
108f0 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71  IC( pMaster = sq
10900 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
10910 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
10920 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20  TIC_MASTER); ). 
10930 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
10940 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
10950 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20   pBt->nRef--;.  
10960 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30  if( pBt->nRef<=0
10970 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42   ){.    if( GLOB
10980 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
10990 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
109a0 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20  ist)==pBt ){.   
109b0 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
109c0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
109d0 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
109e0 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  t->pNext;.    }e
109f0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  lse{.      pList
10a00 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
10a10 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
10a20 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
10a30 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
10a40 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74  (pList) && pList
10a50 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a  ->pNext!=pBt ){.
10a60 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c          pList=pL
10a70 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ist->pNext;.    
10a80 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c    }.      if( AL
10a90 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20  WAYS(pList) ){. 
10aa0 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e         pList->pN
10ab0 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  ext = pBt->pNext
10ac0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10ad0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
10ae0 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20  HREADSAFE ){.   
10af0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
10b00 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78  _free(pBt->mutex
10b10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d  );.    }.    rem
10b20 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  oved = 1;.  }.  
10b30 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
10b40 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ave(pMaster);.  
10b50 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a  return removed;.
10b60 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31  #else.  return 1
10b70 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
10b80 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d  * Make sure pBt-
10b90 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74  >pTmpSpace point
10ba0 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69  s to an allocati
10bb0 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c  on of .** MX_CEL
10bc0 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65  L_SIZE(pBt) byte
10bd0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
10be0 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70  d allocateTempSp
10bf0 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
10c00 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  t){.  if( !pBt->
10c10 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
10c20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
10c30 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
10c40 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69  loc( pBt->pageSi
10c50 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ze );.  }.}../*.
10c60 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d  ** Free the pBt-
10c70 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63  >pTmpSpace alloc
10c80 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
10c90 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61  void freeTempSpa
10ca0 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
10cb0 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ){.  sqlite3Page
10cc0 46 72 65 65 28 20 70 42 74 2d 3e 70 54 6d 70 53  Free( pBt->pTmpS
10cd0 70 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70 54  pace);.  pBt->pT
10ce0 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a  mpSpace = 0;.}..
10cf0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f  /*.** Close an o
10d00 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64  pen database and
10d10 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
10d20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20  cursors..*/.int 
10d30 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
10d40 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  e(Btree *p){.  B
10d50 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
10d60 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f  ->pBt;.  BtCurso
10d70 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43  r *pCur;..  /* C
10d80 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
10d90 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73   opened via this
10da0 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61   handle.  */.  a
10db0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10dc0 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
10dd0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
10de0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
10df0 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d  );.  pCur = pBt-
10e00 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c  >pCursor;.  whil
10e10 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42  e( pCur ){.    B
10e20 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20  tCursor *pTmp = 
10e30 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d  pCur;.    pCur =
10e40 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
10e50 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72    if( pTmp->pBtr
10e60 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73  ee==p ){.      s
10e70 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
10e80 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20  Cursor(pTmp);.  
10e90 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f    }.  }..  /* Ro
10ea0 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
10eb0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
10ec0 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c  d free the handl
10ed0 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a  e structure..  *
10ee0 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  * The call to sq
10ef0 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
10f00 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74  ck() drops any t
10f10 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20  able-locks held 
10f20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e  by.  ** this han
10f30 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  dle..  */.  sqli
10f40 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
10f50 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  (p, SQLITE_OK);.
10f60 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
10f70 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ave(p);..  /* If
10f80 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c   there are still
10f90 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69   other outstandi
10fa0 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
10fb0 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
10fc0 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65  e.  ** structure
10fd0 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68  , return now. Th
10fe0 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
10ff0 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c  his procedure cl
11000 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68  eans .  ** up th
11010 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a  e shared-btree..
11020 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
11030 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20  ->wantToLock==0 
11040 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  && p->locked==0 
11050 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  );.  if( !p->sha
11060 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46  rable || removeF
11070 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70  romSharingList(p
11080 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  Bt) ){.    /* Th
11090 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67  e pBt is no long
110a0 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e  er on the sharin
110b0 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61  g list, so we ca
110c0 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20  n access.    ** 
110d0 69 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  it without havin
110e0 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75  g to hold the mu
110f0 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  tex..    **.    
11100 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64  ** Clean out and
11110 20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53 68   delete the BtSh
11120 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20  ared object..   
11130 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
11140 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
11150 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
11160 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
11170 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  er);.    if( pBt
11180 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26  ->xFreeSchema &&
11190 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b   pBt->pSchema ){
111a0 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65  .      pBt->xFre
111b0 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63  eSchema(pBt->pSc
111c0 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hema);.    }.   
111d0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
111e0 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  , pBt->pSchema);
111f0 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61  .    freeTempSpa
11200 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ce(pBt);.    sql
11210 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
11220 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
11230 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
11240 43 41 43 48 45 0a 20 20 61 73 73 65 72 74 28 20  CACHE.  assert( 
11250 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
11260 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
11270 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20  >locked==0 );.  
11280 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70  if( p->pPrev ) p
11290 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
112a0 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28   p->pNext;.  if(
112b0 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70   p->pNext ) p->p
112c0 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
112d0 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a  >pPrev;.#endif..
112e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
112f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
11300 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
11310 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74  Change the limit
11320 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   on the number o
11330 66 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20  f pages allowed 
11340 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a  in the cache..**
11350 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  .** The maximum 
11360 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20  number of cache 
11370 70 61 67 65 73 20 69 73 20 73 65 74 20 74 6f 20  pages is set to 
11380 74 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20  the absolute.** 
11390 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e  value of mxPage.
113a0 20 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e    If mxPage is n
113b0 65 67 61 74 69 76 65 2c 20 74 68 65 20 70 61 67  egative, the pag
113c0 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61  er will.** opera
113d0 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c  te asynchronousl
113e0 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  y - it will not 
113f0 73 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63  stop to do fsync
11400 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65  ()s.** to insure
11410 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
11420 20 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72   to the disk sur
11430 66 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63  face before.** c
11440 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e  ontinuing.  Tran
11450 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77  sactions still w
11460 6f 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f  ork if synchrono
11470 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e  us is off,.** an
11480 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  d the database c
11490 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  annot be corrupt
114a0 65 64 20 69 66 20 74 68 69 73 20 70 72 6f 67 72  ed if this progr
114b0 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20  am.** crashes.  
114c0 42 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61  But if the opera
114d0 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73  ting system cras
114e0 68 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a  hes or there is.
114f0 2a 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77  ** an abrupt pow
11500 65 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20  er failure when 
11510 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  synchronous is o
11520 66 66 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ff, the database
11530 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66  .** could be lef
11540 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73  t in an inconsis
11550 74 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76  tent and unrecov
11560 65 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a  erable state..**
11570 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   Synchronous is 
11580 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f  on by default so
11590 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
115a0 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e  tion is not.** n
115b0 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e  ormally a worry.
115c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
115d0 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
115e0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
115f0 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72  xPage){.  BtShar
11600 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
11610 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
11620 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11630 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
11640 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
11650 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
11660 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
11670 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
11680 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
11690 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
116a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
116b0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
116c0 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f  ange the limit o
116d0 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
116e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
116f0 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a  e that may be.**
11700 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a   memory mapped..
11710 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
11720 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  reeSetMmapLimit(
11730 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65  Btree *p, sqlite
11740 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b  3_int64 szMmap){
11750 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
11760 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
11770 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
11780 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
11790 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
117a0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
117b0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
117c0 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d  etMmapLimit(pBt-
117d0 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29  >pPager, szMmap)
117e0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
117f0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
11800 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11810 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
11820 65 20 77 61 79 20 64 61 74 61 20 69 73 20 73 79  e way data is sy
11830 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20  nced to disk in 
11840 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73  order to increas
11850 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a  e or decrease.**
11860 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61   how well the da
11870 74 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64  tabase resists d
11880 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
11890 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65  crashes and powe
118a0 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20  r.** failures.  
118b0 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73  Level 1 is the s
118c0 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e  ame as asynchron
118d0 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20  ous (no syncs() 
118e0 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65  occur and.** the
118f0 72 65 20 69 73 20 61 20 68 69 67 68 20 70 72 6f  re is a high pro
11900 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
11910 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20  ge)  Level 2 is 
11920 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68  the default.  Th
11930 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79  ere.** is a very
11940 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72   low but non-zer
11950 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  o probability of
11960 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20   damage.  Level 
11970 33 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a  3 reduces the.**
11980 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
11990 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a  damage to near z
119a0 65 72 6f 20 62 75 74 20 77 69 74 68 20 61 20 77  ero but with a w
119b0 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  rite performance
119c0 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23   reduction..*/.#
119d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
119e0 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
119f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
11a00 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  eSetSafetyLevel(
11a10 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
11a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11a30 20 62 74 72 65 65 20 74 6f 20 73 65 74 20 74 68   btree to set th
11a40 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 6f  e safety level o
11a50 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 76 65 6c  n */.  int level
11a60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
11a70 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e   PRAGMA synchron
11a80 6f 75 73 2e 20 20 31 3d 4f 46 46 2c 20 32 3d 4e  ous.  1=OFF, 2=N
11a90 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c 4c 20 2a 2f  ORMAL, 3=FULL */
11aa0 0a 20 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c  .  int fullSync,
11ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 52 41            /* PRA
11ac0 47 4d 41 20 66 75 6c 6c 66 73 79 6e 63 2e 20 2a  GMA fullfsync. *
11ad0 2f 0a 20 20 69 6e 74 20 63 6b 70 74 46 75 6c 6c  /.  int ckptFull
11ae0 53 79 6e 63 20 20 20 20 20 20 20 2f 2a 20 50 52  Sync       /* PR
11af0 41 47 4d 41 20 63 68 65 63 6b 70 6f 69 6e 74 5f  AGMA checkpoint_
11b00 66 75 6c 6c 66 79 6e 63 20 2a 2f 0a 29 7b 0a 20  fullfync */.){. 
11b10 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
11b20 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
11b30 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11b40 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
11b50 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
11b60 20 6c 65 76 65 6c 3e 3d 31 20 26 26 20 6c 65 76   level>=1 && lev
11b70 65 6c 3c 3d 33 20 29 3b 0a 20 20 73 71 6c 69 74  el<=3 );.  sqlit
11b80 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
11b90 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
11ba0 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70 42  etSafetyLevel(pB
11bb0 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76 65 6c  t->pPager, level
11bc0 2c 20 66 75 6c 6c 53 79 6e 63 2c 20 63 6b 70 74  , fullSync, ckpt
11bd0 46 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c  FullSync);.  sql
11be0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
11bf0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
11c00 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
11c10 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
11c20 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
11c30 62 74 72 65 65 20 69 73 20 73 65 74 20 74 6f 20  btree is set to 
11c40 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20  safety level 1. 
11c50 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72   In other.** wor
11c60 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20  ds, return TRUE 
11c70 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63  if no sync() occ
11c80 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20  urs on the disk 
11c90 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  files..*/.int sq
11ca0 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69  lite3BtreeSyncDi
11cb0 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29  sabled(Btree *p)
11cc0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
11cd0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
11ce0 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
11cf0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
11d00 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
11d10 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 42   );  .  sqlite3B
11d20 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
11d30 61 73 73 65 72 74 28 20 70 42 74 20 26 26 20 70  assert( pBt && p
11d40 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20 20  Bt->pPager );.  
11d50 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
11d60 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61  rNosync(pBt->pPa
11d70 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ger);.  sqlite3B
11d80 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
11d90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11da0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64  .** Change the d
11db0 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a  efault pages siz
11dc0 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  e and the number
11dd0 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74   of reserved byt
11de0 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20  es per page..** 
11df0 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  Or, if the page 
11e00 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79  size has already
11e10 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74   been fixed, ret
11e20 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
11e30 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20  NLY .** without 
11e40 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e  changing anythin
11e50 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  g..**.** The pag
11e60 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61  e size must be a
11e70 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77   power of 2 betw
11e80 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33  een 512 and 6553
11e90 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 0a  6.  If the page.
11ea0 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64  ** size supplied
11eb0 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74   does not meet t
11ec0 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  his constraint t
11ed0 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a  hen the page siz
11ee0 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e  e is not.** chan
11ef0 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20  ged..**.** Page 
11f00 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72  sizes are constr
11f10 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f  ained to be a po
11f20 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68  wer of two so th
11f30 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a  at the region.**
11f40 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
11f50 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c   file used for l
11f60 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e  ocking (beginnin
11f70 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54  g at PENDING_BYT
11f80 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  E,.** the first 
11f90 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31 47  byte past the 1G
11fa0 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30  B boundary, 0x40
11fb0 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f  000000) needs to
11fc0 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65   occur.** at the
11fd0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
11fe0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  page..**.** If p
11ff0 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76  arameter nReserv
12000 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  e is less than z
12010 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ero, then the nu
12020 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
12030 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70 61  .** bytes per pa
12040 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61  ge is left uncha
12050 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  nged..**.** If t
12060 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20  he iFix!=0 then 
12070 74 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a 45  the BTS_PAGESIZE
12080 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73 20 73  _FIXED flag is s
12090 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  et so that the p
120a0 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20  age size.** and 
120b0 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20  autovacuum mode 
120c0 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65  can no longer be
120d0 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74   changed..*/.int
120e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
120f0 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a  PageSize(Btree *
12100 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c  p, int pageSize,
12110 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69   int nReserve, i
12120 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20  nt iFix){.  int 
12130 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12140 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
12150 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
12160 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31  rt( nReserve>=-1
12170 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35   && nReserve<=25
12180 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  5 );.  sqlite3Bt
12190 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
121a0 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
121b0 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f   & BTS_PAGESIZE_
121c0 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71 6c  FIXED ){.    sql
121d0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
121e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
121f0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
12200 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76   }.  if( nReserv
12210 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65  e<0 ){.    nRese
12220 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  rve = pBt->pageS
12230 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
12240 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73  eSize;.  }.  ass
12250 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30  ert( nReserve>=0
12260 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35   && nReserve<=25
12270 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53  5 );.  if( pageS
12280 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65  ize>=512 && page
12290 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  Size<=SQLITE_MAX
122a0 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20  _PAGE_SIZE &&.  
122b0 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a 65        ((pageSize
122c0 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30  -1)&pageSize)==0
122d0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
122e0 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
122f0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
12300 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26   !pBt->pPage1 &&
12310 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29   !pBt->pCursor )
12320 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  ;.    pBt->pageS
12330 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65 53  ize = (u32)pageS
12340 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d  ize;.    freeTem
12350 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d  pSpace(pBt);.  }
12360 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
12370 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
12380 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
12390 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65  t->pageSize, nRe
123a0 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75  serve);.  pBt->u
123b0 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
123c0 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36  >pageSize - (u16
123d0 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28  )nReserve;.  if(
123e0 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74 73   iFix ) pBt->bts
123f0 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47  Flags |= BTS_PAG
12400 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73  ESIZE_FIXED;.  s
12410 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
12420 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
12430 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
12440 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  n the currently 
12450 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a  defined page siz
12460 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  e.*/.int sqlite3
12470 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65  BtreeGetPageSize
12480 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
12490 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67  turn p->pBt->pag
124a0 65 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 20 64 65  eSize;.}..#if de
124b0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53  fined(SQLITE_HAS
124c0 5f 43 4f 44 45 43 29 20 7c 7c 20 64 65 66 69 6e  _CODEC) || defin
124d0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
124e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
124f0 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20  tion is similar 
12500 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  to sqlite3BtreeG
12510 65 74 52 65 73 65 72 76 65 28 29 2c 20 65 78 63  etReserve(), exc
12520 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d  ept that it.** m
12530 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ay only be calle
12540 64 20 69 66 20 69 74 20 69 73 20 67 75 61 72 61  d if it is guara
12550 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20 62  nteed that the b
12560 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 61  -tree mutex is a
12570 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a  lready.** held..
12580 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73  **.** This is us
12590 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63  eful in one spec
125a0 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20  ial case in the 
125b0 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65 20  backup API code 
125c0 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b  where it is.** k
125d0 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73 68  nown that the sh
125e0 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65  ared b-tree mute
125f0 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20 74  x is held, but t
12600 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20  he mutex on the 
12610 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
12620 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70  dle that owns *p
12630 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73   is not. In this
12640 20 63 61 73 65 20 69 66 20 73 71 6c 69 74 65 33   case if sqlite3
12650 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20  BtreeEnter().** 
12660 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c 65  were to be calle
12670 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c  d, it might coll
12680 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f 74  ide with some ot
12690 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e  her operation on
126a0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
126b0 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e   handle that own
126c0 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75 6e  s *p, causing un
126d0 64 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f 72  defined behavior
126e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
126f0 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e  BtreeGetReserveN
12700 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70 29  oMutex(Btree *p)
12710 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
12720 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
12730 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
12740 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74  .  return p->pBt
12750 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e  ->pageSize - p->
12760 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
12770 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
12780 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 20 7c 7c  ITE_HAS_CODEC ||
12790 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
127a0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
127b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
127c0 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65  _PRAGMAS) || !de
127d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
127e0 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20  T_VACUUM)./*.** 
127f0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
12800 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
12810 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
12820 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61  f every page tha
12830 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75  t.** are intentu
12840 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64  ally left unused
12850 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 22  .  This is the "
12860 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65 20  reserved" space 
12870 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74  that is.** somet
12880 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78 74  imes used by ext
12890 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20  ensions..*/.int 
128a0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
128b0 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29  eserve(Btree *p)
128c0 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
128d0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
128e0 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d  );.  n = p->pBt-
128f0 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70  >pageSize - p->p
12900 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
12910 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
12920 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
12930 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   n;.}../*.** Set
12940 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
12950 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61  e count for a da
12960 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67 65  tabase if mxPage
12970 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a   is positive..**
12980 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
12990 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20 69  made if mxPage i
129a0 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  s 0 or negative.
129b0 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f  .** Regardless o
129c0 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d  f the value of m
129d0 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
129e0 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
129f0 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ount..*/.int sql
12a00 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65  ite3BtreeMaxPage
12a10 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  Count(Btree *p, 
12a20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
12a30 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt n;.  sqlite3B
12a40 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
12a50 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  n = sqlite3Pager
12a60 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e  MaxPageCount(p->
12a70 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
12a80 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
12a90 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
12aa0 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
12ab0 2a 2a 20 53 65 74 20 74 68 65 20 42 54 53 5f 53  ** Set the BTS_S
12ac0 45 43 55 52 45 5f 44 45 4c 45 54 45 20 66 6c 61  ECURE_DELETE fla
12ad0 67 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20  g if newFlag is 
12ae0 30 20 6f 72 20 31 2e 20 20 49 66 20 6e 65 77 46  0 or 1.  If newF
12af0 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20 74 68  lag is -1,.** th
12b00 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  en make no chang
12b10 65 73 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75  es.  Always retu
12b20 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
12b30 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44  the BTS_SECURE_D
12b40 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69 6e 67  ELETE.** setting
12b50 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67   after the chang
12b60 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
12b70 33 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65  3BtreeSecureDele
12b80 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  te(Btree *p, int
12b90 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74   newFlag){.  int
12ba0 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   b;.  if( p==0 )
12bb0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c   return 0;.  sql
12bc0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
12bd0 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67  );.  if( newFlag
12be0 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42  >=0 ){.    p->pB
12bf0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
12c00 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
12c10 45 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 46 6c  E;.    if( newFl
12c20 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62 74 73  ag ) p->pBt->bts
12c30 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43  Flags |= BTS_SEC
12c40 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 20  URE_DELETE;.  } 
12c50 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e  .  b = (p->pBt->
12c60 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
12c70 45 43 55 52 45 5f 44 45 4c 45 54 45 29 21 3d 30  ECURE_DELETE)!=0
12c80 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
12c90 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
12ca0 72 6e 20 62 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn b;.}.#endif /
12cb0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
12cc0 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
12cd0 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65  GMAS) || !define
12ce0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  d(SQLITE_OMIT_VA
12cf0 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  CUUM) */../*.** 
12d00 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f  Change the 'auto
12d10 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74  -vacuum' propert
12d20 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  y of the databas
12d30 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56  e. If the 'autoV
12d40 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65  acuum'.** parame
12d50 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
12d60 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75   then auto-vacuu
12d70 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65  m mode is enable
12d80 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a  d. If zero, it.*
12d90 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54  * is disabled. T
12da0 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
12db0 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61   for the auto-va
12dc0 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73  cuum property is
12dd0 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20   .** determined 
12de0 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45  by the SQLITE_DE
12df0 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
12e00 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73   macro..*/.int s
12e10 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75  qlite3BtreeSetAu
12e20 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
12e30 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  p, int autoVacuu
12e40 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  m){.#ifdef SQLIT
12e50 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
12e60 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  M.  return SQLIT
12e70 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73  E_READONLY;.#els
12e80 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  e.  BtShared *pB
12e90 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
12ea0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12eb0 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38 29  ;.  u8 av = (u8)
12ec0 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73  autoVacuum;..  s
12ed0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
12ee0 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74 2d  (p);.  if( (pBt-
12ef0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
12f00 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29 21  PAGESIZE_FIXED)!
12f10 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21  =0 && (av ?1:0)!
12f20 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  =pBt->autoVacuum
12f30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
12f40 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
12f50 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e  }else{.    pBt->
12f60 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20  autoVacuum = av 
12f70 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69  ?1:0;.    pBt->i
12f80 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d  ncrVacuum = av==
12f90 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71  2 ?1:0;.  }.  sq
12fa0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
12fb0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
12fc0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
12fd0 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
12fe0 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76  e of the 'auto-v
12ff0 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e  acuum' property.
13000 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   If auto-vacuum 
13010 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31  is .** enabled 1
13020 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
13030 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e  herwise 0..*/.in
13040 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
13050 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
13060 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51  e *p){.#ifdef SQ
13070 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
13080 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54  CUUM.  return BT
13090 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
130a0 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  ONE;.#else.  int
130b0 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
130c0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
130d0 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70  c = (.    (!p->p
130e0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f  Bt->autoVacuum)?
130f0 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
13100 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e  _NONE:.    (!p->
13110 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
13120 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
13130 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45  M_FULL:.    BTRE
13140 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43  E_AUTOVACUUM_INC
13150 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  R.  );.  sqlite3
13160 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
13170 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
13180 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  if.}.../*.** Get
13190 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
131a0 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61  pPage1 of the da
131b0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
131c0 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  is will.** also 
131d0 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f  acquire a readlo
131e0 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e  ck on that file.
131f0 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
13200 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
13210 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
13220 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a   file is not a.*
13230 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  * well-formed da
13240 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
13250 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
13260 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
13270 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
13280 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
13290 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
132a0 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ed.  SQLITE_NOME
132b0 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  M.** is returned
132c0 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f   if we run out o
132d0 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74  f memory. .*/.st
132e0 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72  atic int lockBtr
132f0 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ee(BtShared *pBt
13300 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
13310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
13320 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  ult code from su
13330 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  bfunctions */.  
13340 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
13350 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f       /* Page 1 o
13360 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
13370 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
13380 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;           /*
13390 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
133a0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
133b0 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 46   */.  int nPageF
133c0 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75  ile = 0;   /* Nu
133d0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
133e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
133f0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  le */.  int nPag
13400 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20  eHeader;     /* 
13410 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
13420 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
13430 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72  according to hdr
13440 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
13450 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
13460 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
13470 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
13480 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72  pPage1==0 );.  r
13490 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
134a0 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e  SharedLock(pBt->
134b0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
134c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
134d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
134e0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
134f0 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
13500 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
13510 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
13520 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20  rn rc;..  /* Do 
13530 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f  some checking to
13540 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65   help insure the
13550 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20   file we opened 
13560 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61  really is.  ** a
13570 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20   valid database 
13580 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50  file. .  */.  nP
13590 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65  age = nPageHeade
135a0 72 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b  r = get4byte(28+
135b0 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
135c0 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ta);.  sqlite3Pa
135d0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
135e0 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
135f0 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61  File);.  if( nPa
13600 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28  ge==0 || memcmp(
13610 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  24+(u8*)pPage1->
13620 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70  aData, 92+(u8*)p
13630 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21  Page1->aData,4)!
13640 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20  =0 ){.    nPage 
13650 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d  = nPageFile;.  }
13660 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29  .  if( nPage>0 )
13670 7b 0a 20 20 20 20 75 33 32 20 70 61 67 65 53 69  {.    u32 pageSi
13680 7a 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62  ze;.    u32 usab
13690 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a  leSize;.    u8 *
136a0 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e  page1 = pPage1->
136b0 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20  aData;.    rc = 
136c0 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
136d0 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61     if( memcmp(pa
136e0 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ge1, zMagicHeade
136f0 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20  r, 16)!=0 ){.   
13700 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
13710 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
13720 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
13730 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28  OMIT_WAL.    if(
13740 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a   page1[18]>1 ){.
13750 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
13760 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f  ags |= BTS_READ_
13770 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ONLY;.    }.    
13780 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20  if( page1[19]>1 
13790 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
137a0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
137b0 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
137c0 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32   if( page1[18]>2
137d0 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62   ){.      pBt->b
137e0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52  tsFlags |= BTS_R
137f0 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  EAD_ONLY;.    }.
13800 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
13810 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ]>2 ){.      got
13820 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
13830 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  led;.    }..    
13840 2f 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 20  /* If the write 
13850 76 65 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74  version is set t
13860 6f 20 32 2c 20 74 68 69 73 20 64 61 74 61 62 61  o 2, this databa
13870 73 65 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63  se should be acc
13880 65 73 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20  essed.    ** in 
13890 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  WAL mode. If the
138a0 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65   log is not alre
138b0 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69  ady open, open i
138c0 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20  t now. Then .   
138d0 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
138e0 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20  E_OK and return 
138f0 77 69 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69  without populati
13900 6e 67 20 42 74 53 68 61 72 65 64 2e 70 50 61 67  ng BtShared.pPag
13910 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63  e1..    ** The c
13920 61 6c 6c 65 72 20 64 65 74 65 63 74 73 20 74 68  aller detects th
13930 69 73 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69  is and calls thi
13940 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
13950 2e 20 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a  . This is.    **
13960 20 72 65 71 75 69 72 65 64 20 61 73 20 74 68 65   required as the
13970 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65   version of page
13980 20 31 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20   1 currently in 
13990 74 68 65 20 70 61 67 65 31 20 62 75 66 66 65 72  the page1 buffer
139a0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20  .    ** may not 
139b0 62 65 20 74 68 65 20 6c 61 74 65 73 74 20 76 65  be the latest ve
139c0 72 73 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61  rsion - there ma
139d0 79 20 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65  y be a newer one
139e0 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20   in the log.    
139f0 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  ** file..    */.
13a00 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
13a10 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74  ]==2 && (pBt->bt
13a20 73 46 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f  sFlags & BTS_NO_
13a30 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  WAL)==0 ){.     
13a40 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b   int isOpen = 0;
13a50 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
13a60 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28  te3PagerOpenWal(
13a70 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73  pBt->pPager, &is
13a80 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  Open);.      if(
13a90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13aa0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  {.        goto p
13ab0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
13ac0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
13ad0 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20  ( isOpen==0 ){. 
13ae0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
13af0 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
13b00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13b10 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
13b20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13b30 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23 65  NOTADB;.    }.#e
13b40 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ndif..    /* The
13b50 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65   maximum embedde
13b60 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20  d fraction must 
13b70 62 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20  be exactly 25%. 
13b80 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d   And the minimum
13b90 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 64  .    ** embedded
13ba0 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62   fraction must b
13bb0 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 68  e 12.5% for both
13bc0 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20 6e   leaf-data and n
13bd0 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20  on-leaf-data..  
13be0 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61    ** The origina
13bf0 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64  l design allowed
13c00 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74   these amounts t
13c10 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f  o vary, but as o
13c20 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e  f.    ** version
13c30 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69   3.6.0, we requi
13c40 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69  re them to be fi
13c50 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xed..    */.    
13c60 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65  if( memcmp(&page
13c70 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30  1[21], "\100\040
13c80 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20  \040",3)!=0 ){. 
13c90 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
13ca0 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
13cb0 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20   }.    pageSize 
13cc0 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29  = (page1[16]<<8)
13cd0 20 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31   | (page1[17]<<1
13ce0 36 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61  6);.    if( ((pa
13cf0 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
13d00 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70  ze)!=0.     || p
13d10 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
13d20 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20  AX_PAGE_SIZE .  
13d30 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d     || pageSize<=
13d40 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  256 .    ){.    
13d50 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
13d60 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
13d70 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
13d80 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
13d90 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20  .    usableSize 
13da0 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67  = pageSize - pag
13db0 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20  e1[20];.    if( 
13dc0 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70  (u32)pageSize!=p
13dd0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  Bt->pageSize ){.
13de0 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72        /* After r
13df0 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74  eading the first
13e00 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
13e10 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61  abase assuming a
13e20 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20   page size.     
13e30 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e   ** of BtShared.
13e40 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76  pageSize, we hav
13e50 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  e discovered tha
13e60 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
13e70 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75  is.      ** actu
13e80 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55  ally pageSize. U
13e90 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
13ea0 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70  se, leave pBt->p
13eb0 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a  Page1 at.      *
13ec0 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  * zero and retur
13ed0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65  n SQLITE_OK. The
13ee0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c   caller will cal
13ef0 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  l this function.
13f00 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77        ** again w
13f10 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ith the correct 
13f20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20  page-size..     
13f30 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73   */.      releas
13f40 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
13f50 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65       pBt->usable
13f60 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a  Size = usableSiz
13f70 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  e;.      pBt->pa
13f80 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
13f90 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d  e;.      freeTem
13fa0 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
13fb0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
13fc0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
13fd0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
13fe0 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  t->pageSize,.   
13ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14010 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53  pageSize-usableS
14020 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ize);.      retu
14030 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
14040 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66   if( (pBt->db->f
14050 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
14060 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20 26  coveryMode)==0 &
14070 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c  & nPage>nPageFil
14080 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
14090 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
140a0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
140b0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
140c0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
140d0 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20   usableSize<480 
140e0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
140f0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
14100 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
14110 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
14120 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  ize;.    pBt->us
14130 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
14140 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53  eSize;.#ifndef S
14150 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
14160 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
14170 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
14180 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
14190 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
141a0 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
141b0 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
141c0 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  age1[36 + 7*4])?
141d0 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1:0);.#endif.  }
141e0 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20  ..  /* maxLocal 
141f0 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
14200 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
14210 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
14220 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c  y for.  ** a cel
14230 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74  l.  Make sure it
14240 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
14250 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
14260 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a  t minFanout.  **
14270 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20   cells can will 
14280 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e  fit on one page.
14290 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30    We assume a 10
142a0 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65  -byte page heade
142b0 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20  r..  ** Besides 
142c0 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65  the payload, the
142d0 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65   cell must store
142e0 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74  :.  **     2-byt
142f0 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
14300 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34   cell.  **     4
14310 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
14320 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62  ter.  **     9-b
14330 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20  yte nKey value. 
14340 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e   **     4-byte n
14350 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20  Data value.  ** 
14360 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66      4-byte overf
14370 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
14380 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20  .  ** So a cell 
14390 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d  consists of a 2-
143a0 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20  byte pointer, a 
143b0 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20  header which is 
143c0 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20  as much as.  ** 
143d0 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30  17 bytes long, 0
143e0 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70   to N bytes of p
143f0 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f  ayload, and an o
14400 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f  ptional 4 byte o
14410 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67  verflow.  ** pag
14420 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a  e pointer..  */.
14430 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20    pBt->maxLocal 
14440 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
14450 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f  ableSize-12)*64/
14460 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
14470 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  ->minLocal = (u1
14480 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
14490 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
144a0 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78   23);.  pBt->max
144b0 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74  Leaf = (u16)(pBt
144c0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
144d0 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  5);.  pBt->minLe
144e0 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  af = (u16)((pBt-
144f0 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
14500 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
14510 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  if( pBt->maxLoca
14520 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74  l>127 ){.    pBt
14530 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
14540 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65  d = 127;.  }else
14550 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62  {.    pBt->max1b
14560 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38  ytePayload = (u8
14570 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  )pBt->maxLocal;.
14580 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
14590 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20  t->maxLeaf + 23 
145a0 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  <= MX_CELL_SIZE(
145b0 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70  pBt) );.  pBt->p
145c0 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a  Page1 = pPage1;.
145d0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
145e0 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
145f0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31  QLITE_OK;..page1
14600 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20  _init_failed:.  
14610 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
14620 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  e1);.  pBt->pPag
14630 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e1 = 0;.  return
14640 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
14650 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  NDEBUG./*.** Ret
14660 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
14670 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  f cursors open o
14680 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66  n pBt. This is f
14690 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73  or use.** in ass
146a0 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e  ert() expression
146b0 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79  s, so it is only
146c0 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45   compiled if NDE
146d0 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65  BUG is not.** de
146e0 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  fined..**.** Onl
146f0 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  y write cursors 
14700 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77  are counted if w
14710 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20  rOnly is true.  
14720 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20  If wrOnly is.** 
14730 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63  false then all c
14740 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74  ursors are count
14750 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ed..**.** For th
14760 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
14770 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75  is routine, a cu
14780 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73  rsor is any curs
14790 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61  or that.** is ca
147a0 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67  pable of reading
147b0 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74   or writing to t
147c0 68 65 20 64 61 74 61 62 73 65 2e 20 20 43 75 72  he databse.  Cur
147d0 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61 76  sors that.** hav
147e0 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20 69  e been tripped i
147f0 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f 46  nto the CURSOR_F
14800 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20 6e  AULT state are n
14810 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73  ot counted..*/.s
14820 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 56  tatic int countV
14830 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53 68  alidCursors(BtSh
14840 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 77  ared *pBt, int w
14850 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73  rOnly){.  BtCurs
14860 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
14870 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75  r = 0;.  for(pCu
14880 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  r=pBt->pCursor; 
14890 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d  pCur; pCur=pCur-
148a0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
148b0 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 70   (wrOnly==0 || p
148c0 43 75 72 2d 3e 77 72 46 6c 61 67 29 20 26 26 20  Cur->wrFlag) && 
148d0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
148e0 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b  RSOR_FAULT ) r++
148f0 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ; .  }.  return 
14900 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  r;.}.#endif../*.
14910 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
14920 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63  no outstanding c
14930 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72  ursors and we ar
14940 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64  e not in the mid
14950 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e  dle.** of a tran
14960 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72  saction but ther
14970 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b  e is a read lock
14980 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
14990 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
149a0 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68  outine unrefs th
149b0 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
149c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
149d0 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20  e which .** has 
149e0 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65  the effect of re
149f0 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64  leasing the read
14a00 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
14a10 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73  there is a trans
14a20 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
14a30 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ss, this routine
14a40 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
14a50 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f  static void unlo
14a60 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
14a70 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
14a80 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
14a90 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
14aa0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
14ab0 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64  sert( countValid
14ac0 43 75 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d  Cursors(pBt,0)==
14ad0 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e  0 || pBt->inTran
14ae0 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f  saction>TRANS_NO
14af0 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  NE );.  if( pBt-
14b00 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
14b10 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42  TRANS_NONE && pB
14b20 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a  t->pPage1!=0 ){.
14b30 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
14b40 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  >pPage1->aData )
14b50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
14b60 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
14b70 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  nt(pBt->pPager)=
14b80 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
14b90 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  ( pBt->pPage1->a
14ba0 44 61 74 61 20 29 3b 0a 20 20 20 20 72 65 6c 65  Data );.    rele
14bb0 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50 61  asePage(pBt->pPa
14bc0 67 65 31 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  ge1);.    pBt->p
14bd0 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Page1 = 0;.  }.}
14be0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70  ../*.** If pBt p
14bf0 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74  oints to an empt
14c00 79 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76  y file then conv
14c10 65 72 74 20 74 68 61 74 20 65 6d 70 74 79 20 66  ert that empty f
14c20 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65  ile.** into a ne
14c30 77 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65  w empty database
14c40 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
14c50 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
14c60 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  of.** the databa
14c70 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
14c80 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74  t newDatabase(Bt
14c90 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
14ca0 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20  MemPage *pP1;.  
14cb0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
14cc0 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ata;.  int rc;..
14cd0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
14ce0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
14cf0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
14d00 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29  ( pBt->nPage>0 )
14d10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
14d20 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50  ITE_OK;.  }.  pP
14d30 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
14d40 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d  .  assert( pP1!=
14d50 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  0 );.  data = pP
14d60 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d  1->aData;.  rc =
14d70 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
14d80 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29  te(pP1->pDbPage)
14d90 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
14da0 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79  urn rc;.  memcpy
14db0 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61  (data, zMagicHea
14dc0 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67  der, sizeof(zMag
14dd0 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73  icHeader));.  as
14de0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61  sert( sizeof(zMa
14df0 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29  gicHeader)==16 )
14e00 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28  ;.  data[16] = (
14e10 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69  u8)((pBt->pageSi
14e20 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20  ze>>8)&0xff);.  
14e30 64 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28  data[17] = (u8)(
14e40 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
14e50 31 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74  16)&0xff);.  dat
14e60 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74  a[18] = 1;.  dat
14e70 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73  a[19] = 1;.  ass
14e80 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
14e90 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  Size<=pBt->pageS
14ea0 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62  ize && pBt->usab
14eb0 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d  leSize+255>=pBt-
14ec0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61  >pageSize);.  da
14ed0 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42  ta[20] = (u8)(pB
14ee0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
14ef0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
14f00 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b    data[21] = 64;
14f10 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32  .  data[22] = 32
14f20 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33  ;.  data[23] = 3
14f30 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  2;.  memset(&dat
14f40 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34  a[24], 0, 100-24
14f50 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50  );.  zeroPage(pP
14f60 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  1, PTF_INTKEY|PT
14f70 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44  F_LEAF|PTF_LEAFD
14f80 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74  ATA );.  pBt->bt
14f90 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
14fa0 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69  GESIZE_FIXED;.#i
14fb0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14fc0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61  T_AUTOVACUUM.  a
14fd0 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
14fe0 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
14ff0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20  ->autoVacuum==0 
15000 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
15010 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20  ->incrVacuum==1 
15020 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  || pBt->incrVacu
15030 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62  um==0 );.  put4b
15040 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34  yte(&data[36 + 4
15050 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61  *4], pBt->autoVa
15060 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74  cuum);.  put4byt
15070 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34  e(&data[36 + 7*4
15080 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ], pBt->incrVacu
15090 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42  um);.#endif.  pB
150a0 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20  t->nPage = 1;.  
150b0 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20  data[31] = 1;.  
150c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
150d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
150e0 61 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74 20  alize the first 
150f0 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
15100 62 61 73 65 20 66 69 6c 65 20 28 63 72 65 61 74  base file (creat
15110 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a  ing a database.*
15120 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  * consisting of 
15130 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e  a single page an
15140 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65  d no schema obje
15150 63 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c  cts). Return SQL
15160 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63  ITE_OK.** if suc
15170 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53  cessful, or an S
15180 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
15190 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69   otherwise..*/.i
151a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  nt sqlite3BtreeN
151b0 65 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a  ewDb(Btree *p){.
151c0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
151d0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
151e0 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67  ;.  p->pBt->nPag
151f0 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65  e = 0;.  rc = ne
15200 77 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74  wDatabase(p->pBt
15210 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
15220 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
15230 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
15240 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72   Attempt to star
15250 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  t a new transact
15260 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61  ion. A write-tra
15270 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73  nsaction.** is s
15280 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65  tarted if the se
15290 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
152a0 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77   nonzero, otherw
152b0 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74  ise a read-.** t
152c0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
152d0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
152e0 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65  ent is 2 or more
152f0 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a   and exclusive.*
15300 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
15310 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e   started, meanin
15320 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  g that no other 
15330 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77  process is allow
15340 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ed.** to access 
15350 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41  the database.  A
15360 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61   preexisting tra
15370 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74  nsaction may not
15380 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20   be.** upgraded 
15390 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20  to exclusive by 
153a0 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
153b0 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69  tine a second ti
153c0 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c  me - the.** excl
153d0 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c  usivity flag onl
153e0 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65  y works for a ne
153f0 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  w transaction..*
15400 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
15410 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
15420 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20   started before 
15430 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a  attempting any .
15440 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ** changes to th
15450 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e  e database.  Non
15460 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
15470 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20  ng routines .** 
15480 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73  will work unless
15490 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
154a0 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a  s started first:
154b0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  .**.**      sqli
154c0 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61  te3BtreeCreateTa
154d0 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
154e0 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
154f0 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20  Index().**      
15500 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
15510 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  rTable().**     
15520 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f   sqlite3BtreeDro
15530 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  pTable().**     
15540 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73   sqlite3BtreeIns
15550 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ert().**      sq
15560 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
15570 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
15580 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
15590 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  a().**.** If an 
155a0 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20  initial attempt 
155b0 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c  to acquire the l
155c0 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73  ock fails becaus
155d0 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  e of lock conten
155e0 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20  tion.** and the 
155f0 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65  database was pre
15600 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64  viously unlocked
15610 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68  , then invoke th
15620 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a  e busy handler.*
15630 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
15640 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65  e.  But if there
15650 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
15660 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20  a read-lock, do 
15670 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68  not.** invoke th
15680 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d  e busy handler -
15690 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
156a0 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54  ITE_BUSY.  SQLIT
156b0 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65  E_BUSY is .** re
156c0 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72  turned when ther
156d0 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72  e is already a r
156e0 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65  ead-lock in orde
156f0 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61  r to avoid a dea
15700 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70  dlock..**.** Sup
15710 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74  pose there are t
15720 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61  wo processes A a
15730 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72  nd B.  A has a r
15740 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68  ead lock and B h
15750 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64  as.** a reserved
15760 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20   lock.  B tries 
15770 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78  to promote to ex
15780 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62  clusive but is b
15790 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a  locked because.*
157a0 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f  * of A's read lo
157b0 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20  ck.  A tries to 
157c0 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72  promote to reser
157d0 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ved but is block
157e0 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20  ed by B..** One 
157f0 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
15800 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  the two processe
15810 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20  s must give way 
15820 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  or there can be.
15830 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20  ** no progress. 
15840 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51   By returning SQ
15850 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f  LITE_BUSY and no
15860 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62  t invoking the b
15870 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  usy callback.** 
15880 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68  when A already h
15890 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20  as a read lock, 
158a0 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74  we encourage A t
158b0 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65  o give up and le
158c0 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a  t B.** proceed..
158d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
158e0 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74  reeBeginTrans(Bt
158f0 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c  ree *p, int wrfl
15900 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ag){.  sqlite3 *
15910 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74  pBlock = 0;.  Bt
15920 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
15930 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
15940 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73   SQLITE_OK;..  s
15950 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
15960 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
15970 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
15980 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  If the btree is 
15990 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69  already in a wri
159a0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
159b0 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c  or it.  ** is al
159c0 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d  ready in a read-
159d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
159e0 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
159f0 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65  on.  ** is reque
15a00 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20  sted, this is a 
15a10 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
15a20 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
15a30 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d  ANS_WRITE || (p-
15a40 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
15a50 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29  READ && !wrflag)
15a60 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61   ){.    goto tra
15a70 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20  ns_begun;.  }.  
15a80 61 73 73 65 72 74 28 20 49 66 4e 6f 74 4f 6d 69  assert( IfNotOmi
15a90 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e  tAV(pBt->bDoTrun
15aa0 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f  cate)==0 );..  /
15ab0 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74  * Write transact
15ac0 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73  ions are not pos
15ad0 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d  sible on a read-
15ae0 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
15af0 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73  .  if( (pBt->bts
15b00 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44  Flags & BTS_READ
15b10 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72 66  _ONLY)!=0 && wrf
15b20 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lag ){.    rc = 
15b30 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
15b40 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
15b50 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e  begun;.  }..#ifn
15b60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15b70 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
15b80 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74  * If another dat
15b90 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73  abase handle has
15ba0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
15bb0 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  a write transact
15bc0 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69  ion .  ** on thi
15bd0 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73  s shared-btree s
15be0 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73  tructure and a s
15bf0 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e  econd write tran
15c00 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
15c10 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72  requested, retur
15c20 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e  n SQLITE_LOCKED.
15c30 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66  .  */.  if( (wrf
15c40 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  lag && pBt->inTr
15c50 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
15c60 5f 57 52 49 54 45 29 0a 20 20 20 7c 7c 20 28 70  _WRITE).   || (p
15c70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
15c80 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20  TS_PENDING)!=0. 
15c90 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d   ){.    pBlock =
15ca0 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
15cb0 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 77  b;.  }else if( w
15cc0 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42  rflag>1 ){.    B
15cd0 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20  tLock *pIter;.  
15ce0 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
15cf0 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
15d00 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
15d10 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49  t){.      if( pI
15d20 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29  ter->pBtree!=p )
15d30 7b 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b  {.        pBlock
15d40 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65   = pIter->pBtree
15d50 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62 72  ->db;.        br
15d60 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
15d70 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 6c   }.  }.  if( pBl
15d80 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ock ){.    sqlit
15d90 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
15da0 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63  ked(p->db, pBloc
15db0 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  k);.    rc = SQL
15dc0 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
15dd0 44 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f  DCACHE;.    goto
15de0 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
15df0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  }.#endif..  /* A
15e00 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20  ny read-only or 
15e10 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73  read-write trans
15e20 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61  action implies a
15e30 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20   read-lock on . 
15e40 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69   ** page 1. So i
15e50 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61  f some other sha
15e60 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74  red-cache client
15e70 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77   already has a w
15e80 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20  rite-lock .  ** 
15e90 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74  on page 1, the t
15ea0 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f  ransaction canno
15eb0 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a  t be opened. */.
15ec0 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72    rc = queryShar
15ed0 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
15ee0 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c  (p, MASTER_ROOT,
15ef0 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69   READ_LOCK);.  i
15f00 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
15f10 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65   ) goto trans_be
15f20 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73  gun;..  pBt->bts
15f30 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e  Flags &= ~BTS_IN
15f40 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20  ITIALLY_EMPTY;. 
15f50 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
15f60 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  =0 ) pBt->btsFla
15f70 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41  gs |= BTS_INITIA
15f80 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20  LLY_EMPTY;.  do 
15f90 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f  {.    /* Call lo
15fa0 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20  ckBtree() until 
15fb0 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67  either pBt->pPag
15fc0 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  e1 is populated 
15fd0 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74  or.    ** lockBt
15fe0 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f  ree() returns so
15ff0 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
16000 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f  an SQLITE_OK. lo
16010 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a  ckBtree().    **
16020 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
16030 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20  TE_OK but leave 
16040 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20  pBt->pPage1 set 
16050 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20  to 0 if after.  
16060 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67    ** reading pag
16070 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73  e 1 it discovers
16080 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
16090 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
160a0 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65  ase .    ** file
160b0 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67   is not pBt->pag
160c0 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63  eSize. In this c
160d0 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  ase lockBtree() 
160e0 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20  will update.    
160f0 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ** pBt->pageSize
16100 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a   to the page-siz
16110 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  e of the file on
16120 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   disk..    */.  
16130 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50    while( pBt->pP
16140 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54  age1==0 && SQLIT
16150 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b  E_OK==(rc = lock
16160 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a  Btree(pBt)) );..
16170 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
16180 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
16190 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 42  ){.      if( (pB
161a0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
161b0 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20  S_READ_ONLY)!=0 
161c0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
161d0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
161e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
161f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
16200 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74  e3PagerBegin(pBt
16210 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e  ->pPager,wrflag>
16220 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  1,sqlite3TempInM
16230 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20  emory(p->db));. 
16240 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
16250 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16260 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
16270 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
16280 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
16290 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
162a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
162b0 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  .      unlockBtr
162c0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
162d0 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
162e0 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49   (rc&0xFF)==SQLI
162f0 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e  TE_BUSY && pBt->
16300 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
16310 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20  RANS_NONE &&.   
16320 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f         btreeInvo
16330 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42  keBusyHandler(pB
16340 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  t) );..  if( rc=
16350 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16360 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
16370 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  ==TRANS_NONE ){.
16380 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
16390 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64  saction++;.#ifnd
163a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
163b0 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
163c0 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
163d0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
163e0 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74  ert( p->lock.pBt
163f0 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63  ree==p && p->loc
16400 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20  k.iTable==1 );. 
16410 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65         p->lock.e
16420 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b  Lock = READ_LOCK
16430 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63  ;.        p->loc
16440 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  k.pNext = pBt->p
16450 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42  Lock;.        pB
16460 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c  t->pLock = &p->l
16470 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ock;.      }.#en
16480 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  dif.    }.    p-
16490 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c  >inTrans = (wrfl
164a0 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54  ag?TRANS_WRITE:T
164b0 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20  RANS_READ);.    
164c0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70  if( p->inTrans>p
164d0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
164e0 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
164f0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
16500 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20  p->inTrans;.    
16510 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67  }.    if( wrflag
16520 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   ){.      MemPag
16530 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
16540 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66  >pPage1;.#ifndef
16550 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
16560 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
16570 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57  assert( !pBt->pW
16580 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70  riter );.      p
16590 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b  Bt->pWriter = p;
165a0 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
165b0 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43  lags &= ~BTS_EXC
165c0 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66  LUSIVE;.      if
165d0 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74  ( wrflag>1 ) pBt
165e0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
165f0 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e  S_EXCLUSIVE;.#en
16600 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  dif..      /* If
16610 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61   the db-size hea
16620 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63  der field is inc
16630 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d 61  orrect (as it ma
16640 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20  y be if an old. 
16650 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68       ** client h
16660 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20  as been writing 
16670 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16680 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f  e), update it no
16690 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a  w. Doing.      *
166a0 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61  * this sooner ra
166b0 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20  ther than later 
166c0 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
166d0 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65  se size can safe
166e0 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d  ly .      ** re-
166f0 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  read the databas
16700 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65  e size from page
16710 20 31 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e   1 if a savepoin
16720 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  t or transaction
16730 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61  .      ** rollba
16740 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  ck occurs within
16750 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
16760 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
16770 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21   if( pBt->nPage!
16780 3d 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65  =get4byte(&pPage
16790 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b  1->aData[28]) ){
167a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
167b0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
167c0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
167d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
167e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
167f0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
16800 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
16810 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65  [28], pBt->nPage
16820 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
16830 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
16840 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20  .trans_begun:.  
16850 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16860 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
16870 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20     /* This call 
16880 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20  makes sure that 
16890 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68  the pager has th
168a0 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72  e correct number
168b0 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20   of.    ** open 
168c0 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74  savepoints. If t
168d0 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
168e0 74 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ter is greater t
168f0 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a  han 0 and.    **
16900 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
16910 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
16920 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69  open, then it wi
16930 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72  ll be opened her
16940 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  e..    */.    rc
16950 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
16960 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
16970 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d  ->pPager, p->db-
16980 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  >nSavepoint);.  
16990 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  }..  btreeIntegr
169a0 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ity(p);.  sqlite
169b0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
169c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
169d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
169e0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a  MIT_AUTOVACUUM..
169f0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f  /*.** Set the po
16a00 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
16a10 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72  s for all childr
16a20 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  en of page pPage
16a30 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50  . Also, if.** pP
16a40 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c  age contains cel
16a50 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ls that point to
16a60 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
16a70 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   set the pointer
16a80 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20  .** map entries 
16a90 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
16aa0 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a   pages as well..
16ab0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
16ac0 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65  tChildPtrmaps(Me
16ad0 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
16ae0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
16af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b00 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76      /* Counter v
16b10 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ariable */.  int
16b20 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
16b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b40 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
16b50 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65  ls in page pPage
16b60 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
16b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b80 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
16b90 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53  rn code */.  BtS
16ba0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
16bb0 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73  ge->pBt;.  u8 is
16bc0 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
16bd0 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f  ->isInit;.  Pgno
16be0 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70   pgno = pPage->p
16bf0 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  gno;..  assert( 
16c00 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
16c10 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
16c20 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
16c30 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
16c40 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
16c50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16c60 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f   goto set_child_
16c70 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d  ptrmaps_out;.  }
16c80 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
16c90 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28  ->nCell;..  for(
16ca0 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
16cb0 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
16cc0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
16cd0 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72  ge, i);..    ptr
16ce0 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
16cf0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29  age, pCell, &rc)
16d00 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ;..    if( !pPag
16d10 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
16d20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
16d30 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
16d40 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  );.      ptrmapP
16d50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
16d60 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
16d70 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20   pgno, &rc);.   
16d80 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70   }.  }..  if( !p
16d90 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
16da0 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
16db0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
16dc0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
16dd0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
16de0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
16df0 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
16e00 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
16e10 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74  , &rc);.  }..set
16e20 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
16e30 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49  ut:.  pPage->isI
16e40 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
16e50 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
16e60 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72  ../*.** Somewher
16e70 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20  e on pPage is a 
16e80 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  pointer to page 
16e90 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74  iFrom.  Modify t
16ea0 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a  his pointer so.*
16eb0 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
16ec0 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74   to iTo. Paramet
16ed0 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62  er eType describ
16ee0 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70  es the type of p
16ef0 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20  ointer to.** be 
16f00 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f  modified, as  fo
16f10 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52  llows:.**.** PTR
16f20 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70  MAP_BTREE:     p
16f30 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
16f40 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
16f50 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68  r points at a ch
16f60 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ild .**         
16f70 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f            page o
16f80 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  f pPage..**.** P
16f90 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a  TRMAP_OVERFLOW1:
16fa0 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
16fb0 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
16fc0 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  ter points at an
16fd0 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20   overflow.**    
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
16ff0 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  age pointed to b
17000 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c  y one of the cel
17010 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a  ls on pPage..**.
17020 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
17030 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e  OW2: pPage is an
17040 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20   overflow-page. 
17050 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
17060 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a  ts at the next.*
17070 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
17080 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67      overflow pag
17090 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  e in the list..*
170a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64  /.static int mod
170b0 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d  ifyPagePointer(M
170c0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50  emPage *pPage, P
170d0 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20  gno iFrom, Pgno 
170e0 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a  iTo, u8 eType){.
170f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
17100 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
17110 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
17120 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
17130 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
17140 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
17150 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54  age) );.  if( eT
17160 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
17170 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20  FLOW2 ){.    /* 
17180 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61  The pointer is a
17190 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
171a0 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70  4 bytes of the p
171b0 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
171c0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  .  */.    if( ge
171d0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
171e0 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  ata)!=iFrom ){. 
171f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
17200 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
17210 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62  .    }.    put4b
17220 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
17230 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  , iTo);.  }else{
17240 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72  .    u8 isInitOr
17250 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
17260 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  it;.    int i;. 
17270 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20     int nCell;.. 
17280 20 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65     btreeInitPage
17290 28 70 50 61 67 65 29 3b 0a 20 20 20 20 6e 43 65  (pPage);.    nCe
172a0 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
172b0 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  l;..    for(i=0;
172c0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
172d0 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20        u8 *pCell 
172e0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
172f0 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
17300 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
17310 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20  ERFLOW1 ){.     
17320 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
17330 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 50  ;.        btreeP
17340 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
17350 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
17360 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e  ;.        if( in
17370 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 0a 20 20 20  fo.iOverflow.   
17380 20 20 20 20 20 20 26 26 20 70 43 65 6c 6c 2b 69        && pCell+i
17390 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 3c  nfo.iOverflow+3<
173a0 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50  =pPage->aData+pP
173b0 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20 20  age->maskPage.  
173c0 20 20 20 20 20 20 20 26 26 20 69 46 72 6f 6d 3d         && iFrom=
173d0 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c  =get4byte(&pCell
173e0 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
173f0 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
17400 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
17410 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
17420 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20  rflow], iTo);.  
17430 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
17440 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
17450 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
17460 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  ( get4byte(pCell
17470 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )==iFrom ){.    
17480 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
17490 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20  Cell, iTo);.    
174a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
174b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
174c0 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
174d0 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  i==nCell ){.    
174e0 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
174f0 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20  MAP_BTREE || .  
17500 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65          get4byte
17510 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
17520 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
17530 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  8])!=iFrom ){.  
17540 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
17550 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
17560 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17570 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
17580 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
17590 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29  rOffset+8], iTo)
175a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ;.    }..    pPa
175b0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
175c0 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72  nitOrig;.  }.  r
175d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
175e0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
175f0 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
17600 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74  e page pDbPage t
17610 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65  o location iFree
17620 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  Page in the .** 
17630 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44  database. The pD
17640 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20  bPage reference 
17650 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a  remains valid..*
17660 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69  *.** The isCommi
17670 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73  t flag indicates
17680 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
17690 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62  o need to rememb
176a0 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a  er that.** the j
176b0 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20  ournal needs to 
176c0 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  be sync()ed befo
176d0 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  re database page
176e0 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a   pDbPage->pgno .
176f0 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ** can be writte
17700 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72  n to. The caller
17710 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f   has already pro
17720 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69  mised not to wri
17730 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61  te to that.** pa
17740 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
17750 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a  t relocatePage(.
17760 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
17770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
17780 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
17790 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20   *pDbPage,      
177a0 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74    /* Open page t
177b0 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65  o move */.  u8 e
177c0 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  Type,           
177d0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
177e0 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79  map 'type' entry
177f0 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
17800 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c    Pgno iPtrPage,
17810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
17820 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d  inter map 'page-
17830 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  no' entry for pD
17840 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
17850 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20 20  iFreePage,      
17860 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74      /* The locat
17870 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50  ion to move pDbP
17880 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  age to */.  int 
17890 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20  isCommit        
178a0 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74       /* isCommit
178b0 20 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20   flag passed to 
178c0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
178d0 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  page */.){.  Mem
178e0 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20  Page *pPtrPage; 
178f0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
17900 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  at contains a po
17910 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65  inter to pDbPage
17920 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61   */.  Pgno iDbPa
17930 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67  ge = pDbPage->pg
17940 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  no;.  Pager *pPa
17950 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
17960 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  r;.  int rc;..  
17970 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50  assert( eType==P
17980 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
17990 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
179a0 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20  _OVERFLOW1 || . 
179b0 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d       eType==PTRM
179c0 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
179d0 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
179e0 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
179f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
17a00 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
17a10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50  ;.  assert( pDbP
17a20 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  age->pBt==pBt );
17a30 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65  ..  /* Move page
17a40 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74   iDbPage from it
17a50 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  s current locati
17a60 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  on to page numbe
17a70 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20  r iFreePage */. 
17a80 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43   TRACE(("AUTOVAC
17a90 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74  UUM: Moving %d t
17aa0 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28  o free page %d (
17ab0 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65  ptr page %d type
17ac0 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20   %d)\n", .      
17ad0 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
17ae0 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54  ge, iPtrPage, eT
17af0 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  ype));.  rc = sq
17b00 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
17b10 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61  ge(pPager, pDbPa
17b20 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72  ge->pDbPage, iFr
17b30 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74  eePage, isCommit
17b40 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
17b50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
17b60 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
17b70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69  DbPage->pgno = i
17b80 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20  FreePage;..  /* 
17b90 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61  If pDbPage was a
17ba0 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65   btree-page, the
17bb0 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68  n it may have ch
17bc0 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72  ild pages and/or
17bd0 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74   cells.  ** that
17be0 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
17bf0 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f  ow pages. The po
17c00 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
17c10 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a  s for all these.
17c20 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20    ** pages need 
17c30 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  to be changed.. 
17c40 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50   **.  ** If pDbP
17c50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
17c60 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ow page, then th
17c70 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
17c80 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a  may store a.  **
17c90 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
17ca0 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
17cb0 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20  w page. If this 
17cc0 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
17cd0 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74  n.  ** the point
17ce0 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20  er map needs to 
17cf0 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74  be updated for t
17d00 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76  he subsequent ov
17d10 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a  erflow page..  *
17d20 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  /.  if( eType==P
17d30 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
17d40 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
17d50 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
17d60 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
17d70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  s(pDbPage);.    
17d80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17d90 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
17da0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n rc;.    }.  }e
17db0 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65  lse{.    Pgno ne
17dc0 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  xtOvfl = get4byt
17dd0 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61  e(pDbPage->aData
17de0 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f  );.    if( nextO
17df0 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  vfl!=0 ){.      
17e00 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e  ptrmapPut(pBt, n
17e10 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  extOvfl, PTRMAP_
17e20 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65  OVERFLOW2, iFree
17e30 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Page, &rc);.    
17e40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17e50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
17e60 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
17e70 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
17e80 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61  * Fix the databa
17e90 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61  se pointer on pa
17ea0 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74  ge iPtrPage that
17eb0 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50   pointed at iDbP
17ec0 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  age so.  ** that
17ed0 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46   it points at iF
17ee0 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69  reePage. Also fi
17ef0 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  x the pointer ma
17f00 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a  p entry for.  **
17f10 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a   iPtrPage..  */.
17f20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
17f30 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
17f40 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
17f50 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50  tPage(pBt, iPtrP
17f60 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20  age, &pPtrPage, 
17f70 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  0, 0);.    if( r
17f80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17f90 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
17fa0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
17fb0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
17fc0 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50  e(pPtrPage->pDbP
17fd0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
17fe0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17ff0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
18000 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
18010 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
18020 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69   }.    rc = modi
18030 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50  fyPagePointer(pP
18040 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c  trPage, iDbPage,
18050 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
18060 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  e);.    releaseP
18070 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
18080 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18090 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74  E_OK ){.      pt
180a0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72  rmapPut(pBt, iFr
180b0 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69  eePage, eType, i
180c0 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20  PtrPage, &rc);. 
180d0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
180e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
180f0 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
18100 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72  required by incr
18110 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f  VacuumStep(). */
18120 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
18130 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74  cateBtreePage(Bt
18140 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67  Shared *, MemPag
18150 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67  e **, Pgno *, Pg
18160 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20  no, u8);../*.** 
18170 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65  Perform a single
18180 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72   step of an incr
18190 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20  emental-vacuum. 
181a0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  If successful, r
181b0 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
181c0 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  OK. If there is 
181d0 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61  no work to do (a
181e0 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 20  nd therefore no 
181f0 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c  point in .** cal
18200 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
18210 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72  on again), retur
18220 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f  n SQLITE_DONE. O
18230 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a  r, if an error .
18240 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  ** occurs, retur
18250 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  n some other err
18260 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d  or code..**.** M
18270 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79 2c 20  ore specificly, 
18280 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  this function at
18290 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67  tempts to re-org
182a0 61 6e 69 7a 65 20 74 68 65 20 64 61 74 61 62 61  anize the databa
182b0 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74  se so .** that t
182c0 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20  he last page of 
182d0 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74  the file current
182e0 6c 79 20 69 6e 20 75 73 65 20 69 73 20 6e 6f 20  ly in use is no 
182f0 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a  longer in use..*
18300 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e  *.** Parameter n
18310 46 69 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Fin is the numbe
18320 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  r of pages that 
18330 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77 6f  this database wo
18340 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77  uld contain.** w
18350 65 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ere this functio
18360 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69  n called until i
18370 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
18380 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _DONE..**.** If 
18390 74 68 65 20 62 43 6f 6d 6d 69 74 20 70 61 72 61  the bCommit para
183a0 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
183b0 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  o, this function
183c0 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68   assumes that th
183d0 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c  e .** caller wil
183e0 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69  l keep calling i
183f0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20  ncrVacuumStep() 
18400 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73  until it returns
18410 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a   SQLITE_DONE .**
18420 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20 62 43   or an error. bC
18430 6f 6d 6d 69 74 20 69 73 20 70 61 73 73 65 64 20  ommit is passed 
18440 74 72 75 65 20 66 6f 72 20 61 6e 20 61 75 74 6f  true for an auto
18450 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 6d  -vacuum-on-commm
18460 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  it .** operation
18470 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f 72 20 61  , or false for a
18480 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
18490 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cuum..*/.static 
184a0 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74  int incrVacuumSt
184b0 65 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ep(BtShared *pBt
184c0 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e  , Pgno nFin, Pgn
184d0 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e 74 20 62  o iLastPg, int b
184e0 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20  Commit){.  Pgno 
184f0 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20  nFreeList;      
18500 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
18510 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e  f pages still on
18520 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a   the free-list *
18530 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
18540 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
18550 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
18560 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
18570 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20  t( iLastPg>nFin 
18580 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41  );..  if( !PTRMA
18590 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c  P_ISPAGE(pBt, iL
185a0 61 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50  astPg) && iLastP
185b0 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g!=PENDING_BYTE_
185c0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
185d0 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50   u8 eType;.    P
185e0 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20  gno iPtrPage;.. 
185f0 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67     nFreeList = g
18600 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
18610 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
18620 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c  ;.    if( nFreeL
18630 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
18640 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
18650 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  NE;.    }..    r
18660 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
18670 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79  t, iLastPg, &eTy
18680 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a  pe, &iPtrPage);.
18690 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
186a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
186b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
186c0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
186d0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
186e0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
186f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
18700 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  PT;.    }..    i
18710 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
18720 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
18730 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d     if( bCommit==
18740 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
18750 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20  Remove the page 
18760 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66  from the files f
18770 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69  ree-list. This i
18780 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20  s not required. 
18790 20 20 20 20 20 20 20 2a 2a 20 69 66 20 62 43 6f         ** if bCo
187a0 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  mmit is non-zero
187b0 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20  . In that case, 
187c0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69  the free-list wi
187d0 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ll be.        **
187e0 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65   truncated to ze
187f0 72 6f 20 61 66 74 65 72 20 74 68 69 73 20 66 75  ro after this fu
18800 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20  nction returns, 
18810 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20  so it doesn't . 
18820 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72         ** matter
18830 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e   if it still con
18840 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61  tains some garba
18850 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20  ge entries..    
18860 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
18870 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20  gno iFreePg;.   
18880 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46       MemPage *pF
18890 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72  reePg;.        r
188a0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
188b0 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65  ePage(pBt, &pFre
188c0 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69  ePg, &iFreePg, i
188d0 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f  LastPg, BTALLOC_
188e0 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20 20 20  EXACT);.        
188f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18900 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
18910 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
18920 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
18930 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61  rt( iFreePg==iLa
18940 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20  stPg );.        
18950 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
18960 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ePg);.      }.  
18970 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
18980 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20   Pgno iFreePg;  
18990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
189a0 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65  dex of free page
189b0 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67   to move pLastPg
189c0 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d   to */.      Mem
189d0 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20  Page *pLastPg;. 
189e0 20 20 20 20 20 75 38 20 65 4d 6f 64 65 20 3d 20       u8 eMode = 
189f0 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f  BTALLOC_ANY;   /
18a00 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72  * Mode parameter
18a10 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72   for allocateBtr
18a20 65 65 50 61 67 65 28 29 20 2a 2f 0a 20 20 20 20  eePage() */.    
18a30 20 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30    Pgno iNear = 0
18a40 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e  ;           /* n
18a50 65 61 72 62 79 20 70 61 72 61 6d 65 74 65 72 20  earby parameter 
18a60 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  for allocateBtre
18a70 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20  ePage() */..    
18a80 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
18a90 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67  age(pBt, iLastPg
18aa0 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 2c 20 30  , &pLastPg, 0, 0
18ab0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
18ac0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18ad0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
18ae0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
18af0 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73  /* If bCommit is
18b00 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70   zero, this loop
18b10 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e   runs exactly on
18b20 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73  ce and page pLas
18b30 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  tPg.      ** is 
18b40 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65  swapped with the
18b50 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65   first free page
18b60 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20   pulled off the 
18b70 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20  free list..     
18b80 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20   **.      ** On 
18b90 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
18ba0 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72  if bCommit is gr
18bb0 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
18bc0 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20   then keep.     
18bd0 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69   ** looping unti
18be0 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f  l a free-page lo
18bf0 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65  cated within the
18c00 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65   first nFin page
18c10 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  s.      ** of th
18c20 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e  e file is found.
18c30 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
18c40 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29  if( bCommit==0 )
18c50 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20  {.        eMode 
18c60 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20  = BTALLOC_LE;.  
18c70 20 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46        iNear = nF
18c80 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  in;.      }.    
18c90 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d    do {.        M
18ca0 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
18cb0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
18cc0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
18cd0 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
18ce0 69 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20  iFreePg, iNear, 
18cf0 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20  eMode);.        
18d00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18d10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
18d20 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
18d30 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  Pg);.          r
18d40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
18d50 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65    }.        rele
18d60 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
18d70 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
18d80 62 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65  bCommit && iFree
18d90 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20  Pg>nFin );.     
18da0 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
18db0 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  <iLastPg );.    
18dc0 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65    .      rc = re
18dd0 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
18de0 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20  pLastPg, eType, 
18df0 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50  iPtrPage, iFreeP
18e00 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20  g, bCommit);.   
18e10 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
18e20 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69  LastPg);.      i
18e30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18e40 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
18e50 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
18e60 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
18e70 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  bCommit==0 ){.  
18e80 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61    do {.      iLa
18e90 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69  stPg--;.    }whi
18ea0 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e  le( iLastPg==PEN
18eb0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
18ec0 42 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53  Bt) || PTRMAP_IS
18ed0 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
18ee0 67 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62  g) );.    pBt->b
18ef0 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a  DoTruncate = 1;.
18f00 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
18f10 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20   iLastPg;.  }.  
18f20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18f30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64  ;.}../*.** The d
18f40 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
18f50 79 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  y the first argu
18f60 6d 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d  ment is an auto-
18f70 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a  vacuum database.
18f80 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69  ** nOrig pages i
18f90 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e  n size containin
18fa0 67 20 6e 46 72 65 65 20 66 72 65 65 20 70 61 67  g nFree free pag
18fb0 65 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65  es. Return the e
18fc0 78 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65  xpected .** size
18fd0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
18fe0 20 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77   in pages follow
18ff0 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ing an auto-vacu
19000 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  um operation..*/
19010 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e  .static Pgno fin
19020 61 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72 65  alDbSize(BtShare
19030 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72  d *pBt, Pgno nOr
19040 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b  ig, Pgno nFree){
19050 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20  .  int nEntry;  
19060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19070 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
19080 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70  entries on one p
19090 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  trmap page */.  
190a0 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20  Pgno nPtrmap;   
190b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72  /* Number of Ptr
190d0 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20  Map pages to be 
190e0 66 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20  freed */.  Pgno 
190f0 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nFin;           
19100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
19110 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20  turn value */.. 
19120 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75   nEntry = pBt->u
19130 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e  sableSize/5;.  n
19140 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d  Ptrmap = (nFree-
19150 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47  nOrig+PTRMAP_PAG
19160 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b  ENO(pBt, nOrig)+
19170 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a  nEntry)/nEntry;.
19180 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d    nFin = nOrig -
19190 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70   nFree - nPtrmap
191a0 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45  ;.  if( nOrig>PE
191b0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
191c0 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e  pBt) && nFin<PEN
191d0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
191e0 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d  Bt) ){.    nFin-
191f0 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  -;.  }.  while( 
19200 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
19210 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e  t, nFin) || nFin
19220 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
19230 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
19240 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72  nFin--;.  }..  r
19250 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f  eturn nFin;.}../
19260 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
19270 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
19280 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63   opened before c
19290 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
192a0 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66  tion..** It perf
192b0 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e  orms a single un
192c0 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72  it of work towar
192d0 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ds an incrementa
192e0 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20  l vacuum..**.** 
192f0 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74  If the increment
19300 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e  al vacuum is fin
19310 69 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73  ished after this
19320 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75   function has ru
19330 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  n,.** SQLITE_DON
19340 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  E is returned. I
19350 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69  f it is not fini
19360 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72  shed, but no err
19370 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20  or occurred,.** 
19380 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
19390 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
193a0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
193b0 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73   code. .*/.int s
193c0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56  qlite3BtreeIncrV
193d0 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
193e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
193f0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
19400 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  pBt;..  sqlite3B
19410 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
19420 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
19430 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
19440 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e  S_WRITE && p->in
19450 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
19460 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74  TE );.  if( !pBt
19470 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
19480 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
19490 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  DONE;.  }else{. 
194a0 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20     Pgno nOrig = 
194b0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
194c0 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  Bt);.    Pgno nF
194d0 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
194e0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
194f0 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e  ta[36]);.    Pgn
19500 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62  o nFin = finalDb
19510 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c  Size(pBt, nOrig,
19520 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66   nFree);..    if
19530 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a  ( nOrig<nFin ){.
19540 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
19550 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
19560 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46      }else if( nF
19570 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  ree>0 ){.      r
19580 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
19590 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
195a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
195b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
195c0 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
195d0 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
195e0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
195f0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
19600 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c  Bt, nFin, nOrig,
19610 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
19620 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19630 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
19640 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
19650 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
19660 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
19670 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
19680 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
19690 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61  ta[28], pBt->nPa
196a0 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
196b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
196c0 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
196d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
196e0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
196f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
19700 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
19710 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70  tine is called p
19720 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50  rior to sqlite3P
19730 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20  agerCommit when 
19740 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  a transaction.**
19750 20 69 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72   is commited for
19760 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
19770 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
19780 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
19790 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a  returned, then *
197a0 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74  pnTrunc is set t
197b0 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
197c0 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74  pages.** the dat
197d0 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
197e0 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  d be truncated t
197f0 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d  o during the com
19800 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a  mit process. .**
19810 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61   i.e. the databa
19820 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72  se has been reor
19830 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20  ganized so that 
19840 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a  only the first *
19850 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73  pnTrunc.** pages
19860 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a   are in use..*/.
19870 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56  static int autoV
19880 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68  acuumCommit(BtSh
19890 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
198a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
198b0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
198c0 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
198d0 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74  .  VVA_ONLY( int
198e0 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50   nRef = sqlite3P
198f0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
19900 67 65 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72  ger) );..  asser
19910 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
19920 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
19930 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74  ) );.  invalidat
19940 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
19950 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74  e(pBt);.  assert
19960 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
19970 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69  );.  if( !pBt->i
19980 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  ncrVacuum ){.   
19990 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20   Pgno nFin;     
199a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
199b0 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
199c0 73 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63  se after autovac
199d0 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67  uuming */.    Pg
199e0 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  no nFree;       
199f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
19a00 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
19a10 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f  ist initially */
19a20 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b  .    Pgno iFree;
19a30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
19a40 65 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66  ext page to be f
19a50 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  reed */.    Pgno
19a60 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f   nOrig;        /
19a70 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20  * Database size 
19a80 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a  before freeing *
19a90 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62  /..    nOrig = b
19aa0 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
19ab0 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d  t);.    if( PTRM
19ac0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
19ad0 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d  Orig) || nOrig==
19ae0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
19af0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
19b00 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
19b10 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  sible to create 
19b20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77  a database for w
19b30 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70  hich the final p
19b40 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
19b50 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72  either a pointer
19b60 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65  -map page or the
19b70 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61   pending-byte pa
19b80 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20  ge. If one.     
19b90 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   ** is encounter
19ba0 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ed, this indicat
19bb0 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  es corruption.. 
19bc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
19bd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
19be0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
19bf0 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74  .    nFree = get
19c00 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
19c10 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
19c20 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c      nFin = final
19c30 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69  DbSize(pBt, nOri
19c40 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69  g, nFree);.    i
19c50 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20  f( nFin>nOrig ) 
19c60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
19c70 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
19c80 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29  if( nFin<nOrig )
19c90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76  {.      rc = sav
19ca0 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
19cb0 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
19cc0 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69    for(iFree=nOri
19cd0 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26  g; iFree>nFin &&
19ce0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
19cf0 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20  iFree--){.      
19d00 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
19d10 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69  tep(pBt, nFin, i
19d20 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  Free, 1);.    }.
19d30 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c      if( (rc==SQL
19d40 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d  ITE_DONE || rc==
19d50 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46  SQLITE_OK) && nF
19d60 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  ree>0 ){.      r
19d70 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
19d80 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
19d90 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
19da0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
19db0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
19dc0 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  32], 0);.      p
19dd0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
19de0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
19df0 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
19e00 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
19e10 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69  ->aData[28], nFi
19e20 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62  n);.      pBt->b
19e30 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a  DoTruncate = 1;.
19e40 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
19e50 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20   = nFin;.    }. 
19e60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19e70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
19e80 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
19e90 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
19ea0 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
19eb0 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50 61   nRef>=sqlite3Pa
19ec0 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
19ed0 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
19ee0 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  rc;.}..#else /* 
19ef0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19f00 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
19f10 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69  .# define setChi
19f20 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c  ldPtrmaps(x) SQL
19f30 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f  ITE_OK.#endif../
19f40 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
19f50 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
19f60 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d   phase of a two-
19f70 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
19f80 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63  his routine.** c
19f90 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b  auses a rollback
19fa0 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63   journal to be c
19fb0 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f  reated (if it do
19fc0 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
19fd0 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70  xist).** and pop
19fe0 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75  ulated with enou
19ff0 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73  gh information s
1a000 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  o that if a powe
1a010 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a  r loss occurs.**
1a020 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
1a030 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  n be restored to
1a040 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
1a050 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62  ate by playing b
1a060 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ack.** the journ
1a070 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  al.  Then the co
1a080 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f  ntents of the jo
1a090 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65  urnal are flushe
1a0a0 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20  d out to.** the 
1a0b0 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65  disk.  After the
1a0c0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65   journal is safe
1a0d0 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65  ly on oxide, the
1a0e0 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a   changes to the.
1a0f0 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20  ** database are 
1a100 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1a110 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
1a120 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78  nd flushed to ox
1a130 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ide..** At the e
1a140 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c  nd of this call,
1a150 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1a160 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73  urnal still exis
1a170 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73  ts on the.** dis
1a180 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69  k and we are sti
1a190 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c  ll holding all l
1a1a0 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61  ocks, so the tra
1a1b0 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74  nsaction has not
1a1c0 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20  .** committed.  
1a1d0 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  See sqlite3Btree
1a1e0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
1a1f0 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
1a200 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20  phase of the.** 
1a210 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
1a220 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
1a230 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f  is a no-op if no
1a240 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1a250 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  on is currently 
1a260 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a  active on pBt..*
1a270 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1a280 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
1a290 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62  e file for the b
1a2a0 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65  tree pBt. zMaste
1a2b0 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  r points to.** t
1a2c0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
1a2d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1a2e0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
1a2f0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1a300 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  .** individual j
1a310 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20  ournal file, or 
1a320 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74  is NULL, indicat
1a330 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  ing no master jo
1a340 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28  urnal file .** (
1a350 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
1a360 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
1a370 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
1a380 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73   called, the mas
1a390 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75  ter journal shou
1a3a0 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ld already have 
1a3b0 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c  been.** created,
1a3c0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
1a3d0 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  this journal poi
1a3e0 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20  nter and synced 
1a3f0 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  to disk..**.** O
1a400 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74  nce this is rout
1a410 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64  ine has returned
1a420 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  , the only thing
1a430 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d   required to com
1a440 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65  mit.** the write
1a450 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
1a460 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66   this database f
1a470 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ile is to delete
1a480 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   the journal..*/
1a490 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1a4a0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
1a4b0 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20  Btree *p, const 
1a4c0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
1a4d0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1a4e0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69  E_OK;.  if( p->i
1a4f0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1a500 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
1a510 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1a520 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
1a530 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66  reeEnter(p);.#if
1a540 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a550 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1a560 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
1a570 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  uum ){.      rc 
1a580 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  = autoVacuumComm
1a590 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69  it(pBt);.      i
1a5a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a5b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1a5c0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1a5d0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1a5e0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1a5f0 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e   }.    if( pBt->
1a600 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20  bDoTruncate ){. 
1a610 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1a620 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70  rTruncateImage(p
1a630 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d  Bt->pPager, pBt-
1a640 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23  >nPage);.    }.#
1a650 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73  endif.    rc = s
1a660 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1a670 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70  tPhaseOne(pBt->p
1a680 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20  Pager, zMaster, 
1a690 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  0);.    sqlite3B
1a6a0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1a6b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1a6c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1a6d0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1a6e0 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43  from both BtreeC
1a6f0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
1a700 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63  and BtreeRollbac
1a710 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f  k().** at the co
1a720 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72  nclusion of a tr
1a730 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
1a740 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45  atic void btreeE
1a750 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74  ndTransaction(Bt
1a760 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
1a770 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1a780 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
1a790 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1a7a0 74 65 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64  tex(p) );..#ifnd
1a7b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1a7c0 55 54 4f 56 41 43 55 55 4d 0a 20 20 70 42 74 2d  UTOVACUUM.  pBt-
1a7d0 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 30  >bDoTruncate = 0
1a7e0 3b 0a 23 65 6e 64 69 66 0a 20 20 62 74 72 65 65  ;.#endif.  btree
1a7f0 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
1a800 70 42 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69  pBt);.  if( p->i
1a810 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e  nTrans>TRANS_NON
1a820 45 20 26 26 20 70 2d 3e 64 62 2d 3e 61 63 74 69  E && p->db->acti
1a830 76 65 56 64 62 65 43 6e 74 3e 31 20 29 7b 0a 20  veVdbeCnt>1 ){. 
1a840 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
1a850 72 65 20 6f 74 68 65 72 20 61 63 74 69 76 65 20  re other active 
1a860 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
1a870 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64  belong to this d
1a880 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68  atabase.    ** h
1a890 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65  andle, downgrade
1a8a0 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   to a read-only 
1a8b0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
1a8c0 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
1a8d0 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69  s.    ** may sti
1a8e0 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66 72  ll be reading fr
1a8f0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
1a900 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61    */.    downgra
1a910 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
1a920 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20  TableLocks(p);. 
1a930 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
1a940 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65  TRANS_READ;.  }e
1a950 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
1a960 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e  he handle had an
1a970 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61  y kind of transa
1a980 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72  ction open, decr
1a990 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a  ement the .    *
1a9a0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  * transaction co
1a9b0 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65  unt of the share
1a9c0 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20  d btree. If the 
1a9d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1a9e0 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65  t .    ** reache
1a9f0 73 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61  s 0, set the sha
1aa00 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41  red state to TRA
1aa10 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c  NS_NONE. The unl
1aa20 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
1aa30 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62  ().    ** call b
1aa40 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b  elow will unlock
1aa50 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a   the pager.  */.
1aa60 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
1aa70 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns!=TRANS_NONE )
1aa80 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c  {.      clearAll
1aa90 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1aaa0 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20  Locks(p);.      
1aab0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
1aac0 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30  n--;.      if( 0
1aad0 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ==pBt->nTransact
1aae0 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ion ){.        p
1aaf0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1ab00 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  n = TRANS_NONE;.
1ab10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1ab20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75     /* Set the cu
1ab30 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
1ab40 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  n state to TRANS
1ab50 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b  _NONE and unlock
1ab60 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67   the .    ** pag
1ab70 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  er if this call 
1ab80 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20  closed the only 
1ab90 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
1aba0 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20  ansaction.  */. 
1abb0 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
1abc0 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
1abd0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
1abe0 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20  sed(pBt);.  }.. 
1abf0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
1ac00 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  p);.}../*.** Com
1ac10 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
1ac20 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ion currently in
1ac30 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a   progress..**.**
1ac40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d   This routine im
1ac50 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63  plements the sec
1ac60 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32  ond phase of a 2
1ac70 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20  -phase commit.  
1ac80 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74  The.** sqlite3Bt
1ac90 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
1aca0 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  e() routine does
1acb0 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65   the first phase
1acc0 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62   and should.** b
1acd0 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20  e invoked prior 
1ace0 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
1acf0 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71  routine.  The sq
1ad00 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1ad10 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f  PhaseOne().** ro
1ad20 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68  utine did all th
1ad30 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e  e work of writin
1ad40 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75  g information ou
1ad50 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c  t to disk and fl
1ad60 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  ushing the.** co
1ad70 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74  ntents so that t
1ad80 68 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20  hey are written 
1ad90 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c  onto the disk pl
1ada0 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73  atter.  All this
1adb0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20  .** routine has 
1adc0 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20  to do is delete 
1add0 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a  or truncate or z
1ade0 65 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69  ero the header i
1adf0 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c  n the.** the rol
1ae00 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77  lback journal (w
1ae10 68 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20  hich causes the 
1ae20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63  transaction to c
1ae30 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72  ommit) and.** dr
1ae40 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  op locks..**.** 
1ae50 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20  Normally, if an 
1ae60 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
1ae70 6c 65 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  le the pager lay
1ae80 65 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67  er is attempting
1ae90 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65   to .** finalize
1aea0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
1aeb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
1aec0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
1aed0 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64  rns an error and
1aee0 0a 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61  .** the upper la
1aef0 79 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74  yer will attempt
1af00 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77   a rollback. How
1af10 65 76 65 72 2c 20 69 66 20 74 68 65 20 73 65 63  ever, if the sec
1af20 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  ond argument.** 
1af30 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e  is non-zero then
1af40 20 74 68 69 73 20 62 2d 74 72 65 65 20 74 72 61   this b-tree tra
1af50 6e 73 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74  nsaction is part
1af60 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65   of a multi-file
1af70 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
1af80 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
1af90 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1afa0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1afb0 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28   committed .** (
1afc0 62 79 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61  by deleting a ma
1afd0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1afe0 65 29 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65  e) and the calle
1aff0 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68  r will ignore th
1b000 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  is .** functions
1b010 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f   return code. So
1b020 2c 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72  , even if an err
1b030 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  or occurs in the
1b040 20 70 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a   pager layer,.**
1b050 20 72 65 73 65 74 20 74 68 65 20 62 2d 74 72 65   reset the b-tre
1b060 65 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e  e objects intern
1b070 61 6c 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69  al state to indi
1b080 63 61 74 65 20 74 68 61 74 20 74 68 65 20 77 72  cate that the wr
1b090 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ite.** transacti
1b0a0 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73  on has been clos
1b0b0 65 64 2e 20 54 68 69 73 20 69 73 20 71 75 69 74  ed. This is quit
1b0c0 65 20 73 61 66 65 2c 20 61 73 20 74 68 65 20 70  e safe, as the p
1b0d0 61 67 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a  ager will have.*
1b0e0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74  * transitioned t
1b0f0 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  o the error stat
1b100 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  e..**.** This wi
1b110 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
1b120 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
1b130 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1b140 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
1b150 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
1b160 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
1b170 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
1b180 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
1b190 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1b1a0 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20  seTwo(Btree *p, 
1b1b0 69 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a  int bCleanup){..
1b1c0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1b1d0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72  ==TRANS_NONE ) r
1b1e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b1f0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1b200 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65  nter(p);.  btree
1b210 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
1b220 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
1b230 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72  e has a write-tr
1b240 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
1b250 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65  commit the share
1b260 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74  d-btrees .  ** t
1b270 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73  ransaction and s
1b280 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74  et the shared st
1b290 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41  ate to TRANS_REA
1b2a0 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  D..  */.  if( p-
1b2b0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1b2c0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
1b2d0 20 72 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65   rc;.    BtShare
1b2e0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1b2f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
1b300 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1b310 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
1b320 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
1b330 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20  >nTransaction>0 
1b340 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
1b350 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
1b360 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67  aseTwo(pBt->pPag
1b370 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
1b380 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43  =SQLITE_OK && bC
1b390 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20  leanup==0 ){.   
1b3a0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
1b3b0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72  eave(p);.      r
1b3c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1b3d0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
1b3e0 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
1b3f0 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  EAD;.  }..  btre
1b400 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
1b410 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
1b420 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1b430 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b440 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68  }../*.** Do both
1b450 20 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d   phases of a com
1b460 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mit..*/.int sqli
1b470 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42  te3BtreeCommit(B
1b480 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
1b490 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
1b4a0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
1b4b0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
1b4c0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c  ommitPhaseOne(p,
1b4d0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
1b4e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b4f0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1b500 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
1b510 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  p, 0);.  }.  sql
1b520 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1b530 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1b540 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1b550 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73  utine sets the s
1b560 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46  tate to CURSOR_F
1b570 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72  AULT and the err
1b580 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72  or.** code to er
1b590 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  rCode for every 
1b5a0 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72  cursor on BtShar
1b5b0 65 64 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a  ed that pBtree.*
1b5c0 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a  * references..**
1b5d0 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72  .** Every cursor
1b5e0 20 69 73 20 74 72 69 70 70 65 64 2c 20 69 6e 63   is tripped, inc
1b5f0 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73 20 74  luding cursors t
1b600 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f  hat belong.** to
1b610 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
1b620 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
1b630 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20 73 68   happen to be sh
1b640 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63  aring.** the cac
1b650 68 65 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a  he with pBtree..
1b660 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1b670 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77  ne gets called w
1b680 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  hen a rollback o
1b690 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75  ccurs..** All cu
1b6a0 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20  rsors using the 
1b6b0 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73 74 20  same cache must 
1b6c0 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f  be tripped.** to
1b6d0 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72   prevent them fr
1b6e0 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65  om trying to use
1b6f0 20 74 68 65 20 62 74 72 65 65 20 61 66 74 65 72   the btree after
1b700 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
1b710 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20  .  The rollback 
1b720 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74 65 64  may have deleted
1b730 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f   tables.** or mo
1b740 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73 2c 20  ved root pages, 
1b750 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66  so it is not suf
1b760 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61  ficient to.** sa
1b770 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ve the state of 
1b780 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65  the cursor.  The
1b790 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65 0a   cursor must be.
1b7a0 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  ** invalidated..
1b7b0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
1b7c0 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
1b7d0 72 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65  rs(Btree *pBtree
1b7e0 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a  , int errCode){.
1b7f0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
1b800 20 69 66 28 20 70 42 74 72 65 65 3d 3d 30 20 29   if( pBtree==0 )
1b810 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
1b820 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
1b830 72 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  ree);.  for(p=pB
1b840 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73  tree->pBt->pCurs
1b850 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
1b860 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  t){.    int i;. 
1b870 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1b880 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20  learCursor(p);. 
1b890 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43     p->eState = C
1b8a0 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20  URSOR_FAULT;.   
1b8b0 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65   p->skipNext = e
1b8c0 72 72 43 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28  rrCode;.    for(
1b8d0 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65  i=0; i<=p->iPage
1b8e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
1b8f0 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50  leasePage(p->apP
1b900 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70  age[i]);.      p
1b910 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b  ->apPage[i] = 0;
1b920 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
1b930 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1b940 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Btree);.}../*.**
1b950 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72   Rollback the tr
1b960 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
1b970 67 72 65 73 73 2e 20 20 41 6c 6c 20 63 75 72 73  gress.  All curs
1b980 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69  ors will be.** i
1b990 6e 76 61 6c 69 64 65 64 20 62 79 20 74 68 69 73  nvalided by this
1b9a0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79   operation.  Any
1b9b0 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
1b9c0 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74  a cursor.** that
1b9d0 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65   was open at the
1b9e0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
1b9f0 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c  is operation wil
1ba00 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61  l result.** in a
1ba10 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  n error..**.** T
1ba20 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
1ba30 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
1ba40 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1ba50 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
1ba60 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
1ba70 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
1ba80 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
1ba90 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
1baa0 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
1bab0 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  lback(Btree *p, 
1bac0 69 6e 74 20 74 72 69 70 43 6f 64 65 29 7b 0a 20  int tripCode){. 
1bad0 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
1bae0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1baf0 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  t;.  MemPage *pP
1bb00 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33  age1;..  sqlite3
1bb10 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1bb20 20 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d 53   if( tripCode==S
1bb30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1bb40 72 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d 20  rc = tripCode = 
1bb50 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
1bb60 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c  Bt, 0, 0);.  }el
1bb70 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
1bb80 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
1bb90 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20 20  ( tripCode ){.  
1bba0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72    sqlite3BtreeTr
1bbb0 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20  ipAllCursors(p, 
1bbc0 74 72 69 70 43 6f 64 65 29 3b 0a 20 20 7d 0a 20  tripCode);.  }. 
1bbd0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
1bbe0 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p);..  if( p->in
1bbf0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1bc00 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
1bc10 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  2;..    assert( 
1bc20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74  TRANS_WRITE==pBt
1bc30 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1bc40 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  );.    rc2 = sql
1bc50 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
1bc60 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  k(pBt->pPager);.
1bc70 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c      if( rc2!=SQL
1bc80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1bc90 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
1bca0 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c  .    /* The roll
1bcb0 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65  back may have de
1bcc0 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67  stroyed the pPag
1bcd0 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e  e1->aData value.
1bce0 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c    So.    ** call
1bcf0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20   btreeGetPage() 
1bd00 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20  on page 1 again 
1bd10 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  to make.    ** s
1bd20 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  ure pPage1->aDat
1bd30 61 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74  a is set correct
1bd40 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62  ly. */.    if( b
1bd50 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1bd60 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 2c 20   1, &pPage1, 0, 
1bd70 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  0)==SQLITE_OK ){
1bd80 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65  .      int nPage
1bd90 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28   = get4byte(28+(
1bda0 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
1bdb0 61 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  a);.      testca
1bdc0 73 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a  se( nPage==0 );.
1bdd0 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d        if( nPage=
1bde0 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61 67 65  =0 ) sqlite3Page
1bdf0 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
1be00 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
1be10 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1be20 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61   pBt->nPage!=nPa
1be30 67 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  ge );.      pBt-
1be40 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  >nPage = nPage;.
1be50 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1be60 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d  e(pPage1);.    }
1be70 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75  .    assert( cou
1be80 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70  ntValidCursors(p
1be90 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20  Bt, 1)==0 );.   
1bea0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1beb0 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
1bec0 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e  ;.  }..  btreeEn
1bed0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b  dTransaction(p);
1bee0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1bef0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1bf00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
1bf10 74 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74  tart a statement
1bf20 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
1bf30 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
1bf40 69 6f 6e 20 63 61 6e 20 63 61 6e 20 62 65 20 72  ion can can be r
1bf50 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e  olled.** back in
1bf60 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74  dependently of t
1bf70 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
1bf80 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74  ion. You must st
1bf90 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
1bfa0 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61  n .** before sta
1bfb0 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73  rting a subtrans
1bfc0 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74  action. The subt
1bfd0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e  ransaction is en
1bfe0 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ded automaticall
1bff0 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69  y .** if the mai
1c000 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  n transaction co
1c010 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62  mmits or rolls b
1c020 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65  ack..**.** State
1c030 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
1c040 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72  ions are used ar
1c050 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20  ound individual 
1c060 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  SQL statements.*
1c070 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61  * that are conta
1c080 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45  ined within a BE
1c090 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f  GIN...COMMIT blo
1c0a0 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72  ck.  If a constr
1c0b0 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63  aint.** error oc
1c0c0 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
1c0d0 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65  statement, the e
1c0e0 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e  ffect of that on
1c0f0 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63  e statement.** c
1c100 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
1c110 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
1c120 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
1c130 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
1c140 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61  ion..**.** A sta
1c150 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73  tement sub-trans
1c160 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  action is implem
1c170 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e  ented as an anon
1c180 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e  ymous savepoint.
1c190 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61   The.** value pa
1c1a0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
1c1b0 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
1c1c0 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
1c1d0 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a   of savepoints,.
1c1e0 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  ** including the
1c1f0 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73   new anonymous s
1c200 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f  avepoint, open o
1c210 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e  n the B-Tree. i.
1c220 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61  e. if there.** a
1c230 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76  re no active sav
1c240 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f  epoints and no o
1c250 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74  ther statement-t
1c260 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e  ransactions open
1c270 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20  ,.** iStatement 
1c280 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79  is 1. This anony
1c290 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63  mous savepoint c
1c2a0 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f  an be released o
1c2b0 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a  r rolled back.**
1c2c0 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74   using the sqlit
1c2d0 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
1c2e0 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
1c2f0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1c300 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20  BeginStmt(Btree 
1c310 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65  *p, int iStateme
1c320 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  nt){.  int rc;. 
1c330 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1c340 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
1c350 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1c360 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
1c370 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1c380 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
1c390 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1c3a0 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d   BTS_READ_ONLY)=
1c3b0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1c3c0 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a  iStatement>0 );.
1c3d0 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
1c3e0 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76  ment>p->db->nSav
1c3f0 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65  epoint );.  asse
1c400 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
1c410 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1c420 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74  ITE );.  /* At t
1c430 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20  he pager level, 
1c440 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
1c450 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76  saction is a sav
1c460 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a  epoint with.  **
1c470 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65   an index greate
1c480 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70  r than all savep
1c490 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65 78  oints created ex
1c4a0 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20  plicitly using. 
1c4b0 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   ** SQL statemen
1c4c0 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61  ts. It is illega
1c4d0 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61  l to open, relea
1c4e0 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61  se or rollback a
1c4f0 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76  ny.  ** such sav
1c500 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68  epoints while th
1c510 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
1c520 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e  saction savepoin
1c530 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a  t is active..  *
1c540 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
1c550 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
1c560 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
1c570 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73  iStatement);.  s
1c580 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1c590 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1c5a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
1c5b0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
1c5c0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
1c5d0 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53   op, is always S
1c5e0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
1c5f0 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e  K.** or SAVEPOIN
1c600 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20  T_RELEASE. This 
1c610 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20  function either 
1c620 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c  releases or roll
1c630 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61  s back the.** sa
1c640 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69  vepoint identifi
1c650 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
1c660 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65  iSavepoint, depe
1c670 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c  nding on the val
1c680 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a  ue .** of op..**
1c690 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53  .** Normally, iS
1c6a0 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61  avepoint is grea
1c6b0 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
1c6c0 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76  l to zero. Howev
1c6d0 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20  er, if op is.** 
1c6e0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
1c6f0 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f  CK, then iSavepo
1c700 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20  int may also be 
1c710 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  -1. In this case
1c720 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
1c730 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  s of the entire 
1c740 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20  transaction are 
1c750 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69  rolled back. Thi
1c760 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a  s is different.*
1c770 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20  * from a normal 
1c780 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
1c790 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b  back, as no lock
1c7a0 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 20 61  s are released a
1c7b0 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61  nd the.** transa
1c7c0 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70  ction remains op
1c7d0 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  en..*/.int sqlit
1c7e0 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
1c7f0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f  (Btree *p, int o
1c800 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  p, int iSavepoin
1c810 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
1c820 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
1c830 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  p && p->inTrans=
1c840 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
1c850 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
1c860 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
1c870 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45  assert( op==SAVE
1c880 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c  POINT_RELEASE ||
1c890 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
1c8a0 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61  OLLBACK );.    a
1c8b0 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e  ssert( iSavepoin
1c8c0 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f  t>=0 || (iSavepo
1c8d0 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53  int==-1 && op==S
1c8e0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
1c8f0 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  K) );.    sqlite
1c900 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1c910 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c920 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70  PagerSavepoint(p
1c930 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20  Bt->pPager, op, 
1c940 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
1c950 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c960 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
1c970 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20  iSavepoint<0 && 
1c980 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1c990 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45   BTS_INITIALLY_E
1c9a0 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  MPTY)!=0 ){.    
1c9b0 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
1c9c0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1c9d0 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
1c9e0 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70  se(pBt);.      p
1c9f0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34  Bt->nPage = get4
1ca00 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70  byte(28 + pBt->p
1ca10 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a  Page1->aData);..
1ca20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1ca30 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 77  abase size was w
1ca40 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1ca50 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74 68 65  offset 28 of the
1ca60 20 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a   header.      **
1ca70 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
1ca80 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73  ction started, s
1ca90 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  o we know that t
1caa0 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73  he value at offs
1cab0 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69  et.      ** 28 i
1cac0 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20  s nonzero. */.  
1cad0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
1cae0 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20  >nPage>0 );.    
1caf0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
1cb00 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
1cb10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1cb20 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
1cb30 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  ew cursor for th
1cb40 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f  e BTree whose ro
1cb50 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67  ot is on the pag
1cb60 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20  e.** iTable. If 
1cb70 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
1cb80 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  or is requested,
1cb90 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
1cba0 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65  hat.** the calle
1cbb0 72 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 74  r already has at
1cbc0 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e   least a read-on
1cbd0 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ly transaction o
1cbe0 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61  pen.** on the da
1cbf0 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20  tabase already. 
1cc00 49 66 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f  If a write-curso
1cc10 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  r is requested, 
1cc20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  then.** the call
1cc30 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  er is assumed to
1cc40 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72   have an open wr
1cc50 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
1cc60 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67  .**.** If wrFlag
1cc70 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ==0, then the cu
1cc80 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65  rsor can only be
1cc90 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
1cca0 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d  g..** If wrFlag=
1ccb0 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  =1, then the cur
1ccc0 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64 20  sor can be used 
1ccd0 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66  for reading or f
1cce0 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66  or.** writing if
1ccf0 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e   other condition
1cd00 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72  s for writing ar
1cd10 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65  e also met.  The
1cd20 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f  se.** are the co
1cd30 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75  nditions that mu
1cd40 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64  st be met in ord
1cd50 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74  er for writing t
1cd60 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a  o.** be allowed:
1cd70 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63  .**.** 1:  The c
1cd80 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20  ursor must have 
1cd90 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68  been opened with
1cda0 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a   wrFlag==1.**.**
1cdb0 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62   2:  Other datab
1cdc0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
1cdd0 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73  that share the s
1cde0 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a  ame pager cache.
1cdf0 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68  **     but which
1ce00 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
1ce10 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44  READ_UNCOMMITTED
1ce20 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68   state may not h
1ce30 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f  ave.**     curso
1ce40 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46  rs open with wrF
1ce50 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61  lag==0 on the sa
1ce60 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72  me table.  Other
1ce70 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20  wise.**     the 
1ce80 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20  changes made by 
1ce90 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f  this write curso
1cea0 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62  r would be visib
1ceb0 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65  le to.**     the
1cec0 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e   read cursors in
1ced0 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62   the other datab
1cee0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
1cef0 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61  **.** 3:  The da
1cf00 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77  tabase must be w
1cf10 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20  ritable (not on 
1cf20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29  read-only media)
1cf30 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65  .**.** 4:  There
1cf40 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69   must be an acti
1cf50 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ve transaction..
1cf60 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e  **.** No checkin
1cf70 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b  g is done to mak
1cf80 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65  e sure that page
1cf90 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69   iTable really i
1cfa0 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61  s the.** root pa
1cfb0 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20  ge of a b-tree. 
1cfc0 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   If it is not, t
1cfd0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61  hen the cursor a
1cfe0 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20  cquired.** will 
1cff0 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74  not work correct
1d000 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  ly..**.** It is 
1d010 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
1d020 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1d030 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65  sorZero() has be
1d040 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20  en called.** on 
1d050 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69  pCur to initiali
1d060 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70  ze the memory sp
1d070 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76  ace prior to inv
1d080 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  oking this routi
1d090 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ne..*/.static in
1d0a0 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20  t btreeCursor(. 
1d0b0 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
1d0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
1d0e0 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
1d0f0 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
1d100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d110 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
1d120 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
1d130 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
1d140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
1d160 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
1d170 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
1d180 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
1d190 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
1d1a0 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
1d1b0 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  o comparison fun
1d1c0 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72  ction */.  BtCur
1d1d0 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
1d1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1f0 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e    /* Space for n
1d200 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  ew cursor */.){.
1d210 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1d220 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  = p->pBt;       
1d230 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
1d240 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65  ed b-tree handle
1d250 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
1d260 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
1d270 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
1d280 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
1d290 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a  || wrFlag==1 );.
1d2a0 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
1d2b0 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65  ing assert state
1d2c0 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74 68 61  ments verify tha
1d2d0 74 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73  t if this is a s
1d2e0 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d  harable .  ** b-
1d2f0 74 72 65 65 20 64 61 74 61 62 61 73 65 2c 20 74  tree database, t
1d300 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  he connection is
1d310 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71   holding the req
1d320 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b  uired table lock
1d330 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61  s, .  ** and tha
1d340 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  t no other conne
1d350 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70  ction has any op
1d360 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20 63  en cursor that c
1d370 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20  onflicts with . 
1d380 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20   ** this lock.  
1d390 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61 73  */.  assert( has
1d3a0 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1d3b0 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20  Lock(p, iTable, 
1d3c0 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46  pKeyInfo!=0, wrF
1d3d0 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65  lag+1) );.  asse
1d3e0 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
1d3f0 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
1d400 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b  ts(p, iTable) );
1d410 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
1d420 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
1d430 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71  s opened the req
1d440 75 69 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f  uired transactio
1d450 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  n. */.  assert( 
1d460 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53  p->inTrans>TRANS
1d470 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72  _NONE );.  asser
1d480 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
1d490 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1d4a0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
1d4b0 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
1d4c0 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d   && pBt->pPage1-
1d4d0 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28  >aData );..  if(
1d4e0 20 4e 45 56 45 52 28 77 72 46 6c 61 67 20 26 26   NEVER(wrFlag &&
1d4f0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1d500 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
1d510 21 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  !=0) ){.    retu
1d520 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
1d530 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54  LY;.  }.  if( iT
1d540 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65  able==1 && btree
1d550 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d  Pagecount(pBt)==
1d560 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
1d570 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20   wrFlag==0 );.  
1d580 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20    iTable = 0;.  
1d590 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74  }..  /* Now that
1d5a0 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73   no other errors
1d5b0 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69   can occur, fini
1d5c0 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  sh filling in th
1d5d0 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20  e BtCursor.  ** 
1d5e0 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69  variables and li
1d5f0 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e  nk the cursor in
1d600 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20  to the BtShared 
1d610 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72  list.  */.  pCur
1d620 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67  ->pgnoRoot = (Pg
1d630 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75  no)iTable;.  pCu
1d640 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20  r->iPage = -1;. 
1d650 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20   pCur->pKeyInfo 
1d660 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43  = pKeyInfo;.  pC
1d670 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ur->pBtree = p;.
1d680 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42    pCur->pBt = pB
1d690 74 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61  t;.  pCur->wrFla
1d6a0 67 20 3d 20 28 75 38 29 77 72 46 6c 61 67 3b 0a  g = (u8)wrFlag;.
1d6b0 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20    pCur->pNext = 
1d6c0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
1d6d0 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  if( pCur->pNext 
1d6e0 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65  ){.    pCur->pNe
1d6f0 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72  xt->pPrev = pCur
1d700 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75  ;.  }.  pBt->pCu
1d710 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70  rsor = pCur;.  p
1d720 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
1d730 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
1d740 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69  pCur->cachedRowi
1d750 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  d = 0;.  return 
1d760 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74  SQLITE_OK;.}.int
1d770 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1d780 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  sor(.  Btree *p,
1d790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7b0 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
1d7c0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
1d7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7f0 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
1d800 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
1d810 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
1d820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d840 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30  /* 1 to write. 0
1d850 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
1d860 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a  struct KeyInfo *
1d870 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20  pKeyInfo,       
1d880 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1d890 69 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d  irst arg to xCom
1d8a0 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75  pare() */.  BtCu
1d8b0 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
1d8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8d0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1d8e0 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65   new cursor here
1d8f0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
1d900 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1d910 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
1d920 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69  btreeCursor(p, i
1d930 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70  Table, wrFlag, p
1d940 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a  KeyInfo, pCur);.
1d950 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1d960 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1d970 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
1d980 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
1d990 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65   a BtCursor obje
1d9a0 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a  ct in bytes..**.
1d9b0 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63  ** This interfac
1d9c0 65 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20  es is needed so 
1d9d0 74 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75  that users of cu
1d9e0 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c  rsors can preall
1d9f0 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69  ocate.** suffici
1da00 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68  ent storage to h
1da10 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54  old a cursor.  T
1da20 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65  he BtCursor obje
1da30 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20  ct is opaque.** 
1da40 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79  to users so they
1da50 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73   cannot do the s
1da60 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76  izeof() themselv
1da70 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63  es - they must c
1da80 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  all.** this rout
1da90 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ine..*/.int sqli
1daa0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69  te3BtreeCursorSi
1dab0 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75  ze(void){.  retu
1dac0 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  rn ROUND8(sizeof
1dad0 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a  (BtCursor));.}..
1dae0 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
1daf0 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c   memory that wil
1db00 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  l be converted i
1db10 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f  nto a BtCursor o
1db20 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  bject..**.** The
1db30 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68   simple approach
1db40 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74   here would be t
1db50 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65  o memset() the e
1db60 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20  ntire object.** 
1db70 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74  to zero.  But it
1db80 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20   turns out that 
1db90 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64  the apPage[] and
1dba0 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a   aiIdx[] arrays.
1dbb0 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  ** do not need t
1dbc0 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20  o be zeroed and 
1dbd0 74 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20  they are large, 
1dbe0 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20 61  so we can save a
1dbf0 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74   lot.** of run-t
1dc00 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20  ime by skipping 
1dc10 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
1dc20 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d  on of those elem
1dc30 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ents..*/.void sq
1dc40 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1dc50 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Zero(BtCursor *p
1dc60 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  ){.  memset(p, 0
1dc70 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72  , offsetof(BtCur
1dc80 73 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a  sor, iPage));.}.
1dc90 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  ./*.** Set the c
1dca0 61 63 68 65 64 20 72 6f 77 69 64 20 76 61 6c 75  ached rowid valu
1dcb0 65 20 6f 66 20 65 76 65 72 79 20 63 75 72 73 6f  e of every curso
1dcc0 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  r in the same da
1dcd0 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61  tabase file.** a
1dce0 73 20 70 43 75 72 20 61 6e 64 20 68 61 76 69 6e  s pCur and havin
1dcf0 67 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 20  g the same root 
1dd00 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20 70  page number as p
1dd10 43 75 72 2e 20 20 54 68 65 20 76 61 6c 75 65 20  Cur.  The value 
1dd20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 69 52 6f  is.** set to iRo
1dd30 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  wid..**.** Only 
1dd40 70 6f 73 69 74 69 76 65 20 72 6f 77 69 64 20 76  positive rowid v
1dd50 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64  alues are consid
1dd60 65 72 65 64 20 76 61 6c 69 64 20 66 6f 72 20 74  ered valid for t
1dd70 68 69 73 20 63 61 63 68 65 2e 0a 2a 2a 20 54 68  his cache..** Th
1dd80 65 20 63 61 63 68 65 20 69 73 20 69 6e 69 74 69  e cache is initi
1dd90 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2c 20  alized to zero, 
1dda0 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e  indicating an in
1ddb0 76 61 6c 69 64 20 63 61 63 68 65 2e 0a 2a 2a 20  valid cache..** 
1ddc0 41 20 62 74 72 65 65 20 77 69 6c 6c 20 77 6f 72  A btree will wor
1ddd0 6b 20 66 69 6e 65 20 77 69 74 68 20 7a 65 72 6f  k fine with zero
1dde0 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77   or negative row
1ddf0 69 64 73 2e 20 20 57 65 20 6a 75 73 74 20 63 61  ids.  We just ca
1de00 6e 6e 6f 74 0a 2a 2a 20 63 61 63 68 65 20 7a 65  nnot.** cache ze
1de10 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72  ro or negative r
1de20 6f 77 69 64 73 2c 20 77 68 69 63 68 20 6d 65 61  owids, which mea
1de30 6e 73 20 74 61 62 6c 65 73 20 74 68 61 74 20 75  ns tables that u
1de40 73 65 20 7a 65 72 6f 20 6f 72 0a 2a 2a 20 6e 65  se zero or.** ne
1de50 67 61 74 69 76 65 20 72 6f 77 69 64 73 20 6d 69  gative rowids mi
1de60 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65  ght run a little
1de70 20 73 6c 6f 77 65 72 2e 20 20 42 75 74 20 69 6e   slower.  But in
1de80 20 70 72 61 63 74 69 63 65 2c 20 7a 65 72 6f 0a   practice, zero.
1de90 2a 2a 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72  ** or negative r
1dea0 6f 77 69 64 73 20 61 72 65 20 76 65 72 79 20 75  owids are very u
1deb0 6e 63 6f 6d 6d 6f 6e 20 73 6f 20 74 68 69 73 20  ncommon so this 
1dec0 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20  should not be a 
1ded0 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64  problem..*/.void
1dee0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
1def0 43 61 63 68 65 64 52 6f 77 69 64 28 42 74 43 75  CachedRowid(BtCu
1df00 72 73 6f 72 20 2a 70 43 75 72 2c 20 73 71 6c 69  rsor *pCur, sqli
1df10 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64  te3_int64 iRowid
1df20 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
1df30 3b 0a 20 20 66 6f 72 28 70 3d 70 43 75 72 2d 3e  ;.  for(p=pCur->
1df40 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
1df50 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
1df60 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f    if( p->pgnoRoo
1df70 74 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t==pCur->pgnoRoo
1df80 74 20 29 20 70 2d 3e 63 61 63 68 65 64 52 6f 77  t ) p->cachedRow
1df90 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d  id = iRowid;.  }
1dfa0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1dfb0 3e 63 61 63 68 65 64 52 6f 77 69 64 3d 3d 69 52  >cachedRowid==iR
1dfc0 6f 77 69 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  owid );.}../*.**
1dfd0 20 52 65 74 75 72 6e 20 74 68 65 20 63 61 63 68   Return the cach
1dfe0 65 64 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  ed rowid for the
1dff0 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2e 20 20   given cursor.  
1e000 41 20 6e 65 67 61 74 69 76 65 20 6f 72 20 7a 65  A negative or ze
1e010 72 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  ro.** return val
1e020 75 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ue indicates tha
1e030 74 20 74 68 65 20 72 6f 77 69 64 20 63 61 63 68  t the rowid cach
1e040 65 20 69 73 20 69 6e 76 61 6c 69 64 20 61 6e 64  e is invalid and
1e050 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 67   should be.** ig
1e060 6e 6f 72 65 64 2e 20 20 49 66 20 74 68 65 20 72  nored.  If the r
1e070 6f 77 69 64 20 63 61 63 68 65 20 68 61 73 20 6e  owid cache has n
1e080 65 76 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e  ever before been
1e090 20 73 65 74 2c 20 74 68 65 6e 20 61 0a 2a 2a 20   set, then a.** 
1e0a0 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
1e0b0 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74  ..*/.sqlite3_int
1e0c0 36 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  64 sqlite3BtreeG
1e0d0 65 74 43 61 63 68 65 64 52 6f 77 69 64 28 42 74  etCachedRowid(Bt
1e0e0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1e0f0 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 63 61   return pCur->ca
1e100 63 68 65 64 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a  chedRowid;.}../*
1e110 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73  .** Close a curs
1e120 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f  or.  The read lo
1e130 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1e140 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61  se file is relea
1e150 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  sed.** when the 
1e160 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63  last cursor is c
1e170 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  losed..*/.int sq
1e180 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
1e190 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
1e1a0 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a  pCur){.  Btree *
1e1b0 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70  pBtree = pCur->p
1e1c0 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74  Btree;.  if( pBt
1e1d0 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ree ){.    int i
1e1e0 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  ;.    BtShared *
1e1f0 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
1e200 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1e210 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
1e220 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1e230 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72  ClearCursor(pCur
1e240 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
1e250 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  >pPrev ){.      
1e260 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  pCur->pPrev->pNe
1e270 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  xt = pCur->pNext
1e280 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e290 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
1e2a0 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
1e2b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
1e2c0 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
1e2d0 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70    pCur->pNext->p
1e2e0 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72  Prev = pCur->pPr
1e2f0 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ev;.    }.    fo
1e300 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e  r(i=0; i<=pCur->
1e310 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
1e320 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1e330 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b  Cur->apPage[i]);
1e340 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63  .    }.    unloc
1e350 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
1e360 42 74 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64  Bt);.    invalid
1e370 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
1e380 28 70 43 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73  (pCur);.    /* s
1e390 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
1e3a0 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ); */.    sqlite
1e3b0 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
1e3c0 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ee);.  }.  retur
1e3d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1e3e0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
1e3f0 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69  the BtCursor* gi
1e400 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
1e410 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a  ent has a valid.
1e420 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  ** BtCursor.info
1e430 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20   structure.  If 
1e440 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
1e450 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a  y valid, call.**
1e460 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
1e470 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e  ) to fill it in.
1e480 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  .**.** BtCursor.
1e490 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20  info is a cache 
1e4a0 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  of the informati
1e4b0 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  on in the curren
1e4c0 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67  t cell..** Using
1e4d0 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75   this cache redu
1e4e0 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ces the number o
1e4f0 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65  f calls to btree
1e500 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a  ParseCell()..**.
1e510 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20  ** 2007-06-25:  
1e520 54 68 65 72 65 20 69 73 20 61 20 62 75 67 20 69  There is a bug i
1e530 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20  n some versions 
1e540 6f 66 20 4d 53 56 43 20 74 68 61 74 20 63 61 75  of MSVC that cau
1e550 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c  se the.** compil
1e560 65 72 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e  er to crash when
1e570 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69   getCellInfo() i
1e580 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
1e590 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74   a macro..** But
1e5a0 20 74 68 65 72 65 20 69 73 20 61 20 6d 65 61 73   there is a meas
1e5b0 75 72 65 61 62 6c 65 20 73 70 65 65 64 20 61 64  ureable speed ad
1e5c0 76 61 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67  vantage to using
1e5d0 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63   the macro on gc
1e5e0 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20  c.** (when less 
1e5f0 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a  compiler optimiz
1e600 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20  ations like -Os 
1e610 6f 72 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20  or -O0 are used 
1e620 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69  and the.** compi
1e630 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67  ler is not doing
1e640 20 61 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e   agressive inlin
1e650 69 6e 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65  ing.)  So we use
1e660 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e   a real function
1e670 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64  .** for MSVC and
1e680 20 61 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65   a macro for eve
1e690 72 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54  rything else.  T
1e6a0 69 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a  icket #2457..*/.
1e6b0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
1e6c0 20 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73   static void ass
1e6d0 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  ertCellInfo(BtCu
1e6e0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20  rsor *pCur){.   
1e6f0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
1e700 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
1e710 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20  pCur->iPage;.   
1e720 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30   memset(&info, 0
1e730 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b  , sizeof(info));
1e740 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
1e750 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ell(pCur->apPage
1e760 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61  [iPage], pCur->a
1e770 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e  iIdx[iPage], &in
1e780 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  fo);.    assert(
1e790 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26   memcmp(&info, &
1e7a0 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65  pCur->info, size
1e7b0 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a  of(info))==0 );.
1e7c0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66    }.#else.  #def
1e7d0 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  ine assertCellIn
1e7e0 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23 69 66  fo(x).#endif.#if
1e7f0 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f  def _MSC_VER.  /
1e800 2a 20 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e  * Use a real fun
1e810 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f  ction in MSVC to
1e820 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67   work around bug
1e830 73 20 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c  s in that compil
1e840 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  er. */.  static 
1e850 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f  void getCellInfo
1e860 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1e870 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
1e880 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b  info.nSize==0 ){
1e890 0a 20 20 20 20 20 20 69 6e 74 20 69 50 61 67 65  .      int iPage
1e8a0 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
1e8b0 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65        btreeParse
1e8c0 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
1e8d0 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61  e[iPage],pCur->a
1e8e0 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75  iIdx[iPage],&pCu
1e8f0 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  r->info);.      
1e900 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1e910 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
1e920 20 20 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c        assertCell
1e930 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20  Info(pCur);.    
1e940 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69  }.  }.#else /* i
1e950 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a  f not _MSC_VER *
1e960 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d 61 63  /.  /* Use a mac
1e970 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20  ro in all other 
1e980 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74 68 61  compilers so tha
1e990 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  t the function i
1e9a0 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65  s inlined */.#de
1e9b0 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f  fine getCellInfo
1e9c0 28 70 43 75 72 29 20 20 20 20 20 20 20 20 20 20  (pCur)          
1e9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9f0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1ea00 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
1ea10 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20 20  Size==0 ){      
1ea20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea40 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1ea50 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
1ea60 43 75 72 2d 3e 69 50 61 67 65 3b 20 20 20 20 20  Cur->iPage;     
1ea70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1eaa0 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
1eab0 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
1eac0 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49  iPage],pCur->aiI
1ead0 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d  dx[iPage],&pCur-
1eae0 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20 20 20 70 43  >info); \.    pC
1eaf0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1eb00 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1eb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb30 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c           \.  }el
1eb40 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  se{             
1eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb80 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
1eb90 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
1eba0 43 75 72 29 3b 20 20 20 20 20 20 20 20 20 20 20  Cur);           
1ebb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebd0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d             \.  }
1ebe0 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f  .#endif /* _MSC_
1ebf0 56 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  VER */..#ifndef 
1ec00 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e  NDEBUG  /* The n
1ec10 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64  ext routine used
1ec20 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73   only within ass
1ec30 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1ec40 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e   */./*.** Return
1ec50 20 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76   true if the giv
1ec60 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76  en BtCursor is v
1ec70 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63  alid.  A valid c
1ec80 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20  ursor is one.** 
1ec90 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c  that is currentl
1eca0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  y pointing to a 
1ecb0 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d  row in a (non-em
1ecc0 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54  pty) table..** T
1ecd0 68 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63  his is a verific
1ece0 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73  ation routine is
1ecf0 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69   used only withi
1ed00 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
1ed10 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ments..*/.int sq
1ed20 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1ed30 49 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72  IsValid(BtCursor
1ed40 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
1ed50 6e 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e  n pCur && pCur->
1ed60 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1ed70 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ALID;.}.#endif /
1ed80 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a  * NDEBUG */../*.
1ed90 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f  ** Set *pSize to
1eda0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1edb0 20 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74   buffer needed t
1edc0 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65  o hold the value
1edd0 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66   of.** the key f
1ede0 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65  or the current e
1edf0 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75  ntry.  If the cu
1ee00 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
1ee10 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c  ting.** to a val
1ee20 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65  id entry, *pSize
1ee30 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a   is set to 0. .*
1ee40 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65  *.** For a table
1ee50 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59   with the INTKEY
1ee60 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20   flag set, this 
1ee70 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1ee80 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c  the key.** itsel
1ee90 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65  f, not the numbe
1eea0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
1eeb0 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e key..**.** The
1eec0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73   caller must pos
1eed0 69 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72  ition the cursor
1eee0 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69   prior to invoki
1eef0 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
1ef00 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  .** .** This rou
1ef10 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tine cannot fail
1ef20 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72 65 74  .  It always ret
1ef30 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  urns SQLITE_OK. 
1ef40 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
1ef50 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43  BtreeKeySize(BtC
1ef60 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
1ef70 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65   *pSize){.  asse
1ef80 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1ef90 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1efa0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1efb0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
1efc0 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
1efd0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1efe0 49 44 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  ID );.  if( pCur
1eff0 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
1f000 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  _VALID ){.    *p
1f010 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Size = 0;.  }els
1f020 65 7b 0a 20 20 20 20 67 65 74 43 65 6c 6c 49 6e  e{.    getCellIn
1f030 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 2a 70  fo(pCur);.    *p
1f040 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66  Size = pCur->inf
1f050 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 72 65  o.nKey;.  }.  re
1f060 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f070 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53  }../*.** Set *pS
1f080 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ize to the numbe
1f090 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61  r of bytes of da
1f0a0 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20  ta in the entry 
1f0b0 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75  the.** cursor cu
1f0c0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
1f0d0 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  o..**.** The cal
1f0e0 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74  ler must guarant
1f0f0 65 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ee that the curs
1f100 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
1f110 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20  o a non-NULL.** 
1f120 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e  valid entry.  In
1f130 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
1f140 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64  e calling proced
1f150 75 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74  ure must guarant
1f160 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  ee.** that the c
1f170 75 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72  ursor has Cursor
1f180 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  .eState==CURSOR_
1f190 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69  VALID..**.** Fai
1f1a0 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73  lure is not poss
1f1b0 69 62 6c 65 2e 20 20 54 68 69 73 20 66 75 6e 63  ible.  This func
1f1c0 74 69 6f 6e 20 61 6c 77 61 79 73 20 72 65 74 75  tion always retu
1f1d0 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
1f1e0 2a 20 49 74 20 6d 69 67 68 74 20 6a 75 73 74 20  * It might just 
1f1f0 61 73 20 77 65 6c 6c 20 62 65 20 61 20 70 72 6f  as well be a pro
1f200 63 65 64 75 72 65 20 28 72 65 74 75 72 6e 69 6e  cedure (returnin
1f210 67 20 76 6f 69 64 29 20 62 75 74 20 77 65 20 63  g void) but we c
1f220 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72 65  ontinue.** to re
1f230 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
1f240 72 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 20  result code for 
1f250 68 69 73 74 6f 72 69 63 61 6c 20 72 65 61 73 6f  historical reaso
1f260 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ns..*/.int sqlit
1f270 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28  e3BtreeDataSize(
1f280 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1f290 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61  u32 *pSize){.  a
1f2a0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1f2b0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1f2c0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1f2d0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1f2e0 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65  VALID );.  getCe
1f2f0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1f300 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
1f310 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 72 65 74  nfo.nData;.  ret
1f320 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1f330 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
1f340 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
1f350 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
1f360 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
1f370 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  e (parameter.** 
1f380 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63  ovfl), this func
1f390 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70  tion finds the p
1f3a0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
1f3b0 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
1f3c0 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69  he .** linked li
1f3d0 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70  st of overflow p
1f3e0 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c  ages. If possibl
1f3f0 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61  e, it uses the a
1f400 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f  uto-vacuum.** po
1f410 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69  inter-map data i
1f420 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e  nstead of readin
1f430 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  g the content of
1f440 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f   page ovfl to do
1f450 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61   so. .**.** If a
1f460 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61  n error occurs a
1f470 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1f480 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
1f490 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a   Otherwise:.**.*
1f4a0 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
1f4b0 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76  r of the next ov
1f4c0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
1f4d0 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69  he linked list i
1f4e0 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f  s .** written to
1f4f0 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20   *pPgnoNext. If 
1f500 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65  page ovfl is the
1f510 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74   last page in it
1f520 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73  s linked .** lis
1f530 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73  t, *pPgnoNext is
1f540 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a   set to zero. .*
1f550 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69  *.** If ppPage i
1f560 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20  s not NULL, and 
1f570 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
1f580 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63  he MemPage objec
1f590 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  t corresponding.
1f5a0 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  ** to page numbe
1f5b0 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61  r pOvfl was obta
1f5c0 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61  ined, then *ppPa
1f5d0 67 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ge is set to poi
1f5e0 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65  nt to that.** re
1f5f0 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74  ference. It is t
1f600 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
1f610 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
1f620 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50  to call releaseP
1f630 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50  age().** on *ppP
1f640 61 67 65 20 74 6f 20 66 72 65 65 20 74 68 65 20  age to free the 
1f650 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f  reference. In no
1f660 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f   reference was o
1f670 62 74 61 69 6e 65 64 20 28 62 65 63 61 75 73 65  btained (because
1f680 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  .** the pointer-
1f690 6d 61 70 20 77 61 73 20 75 73 65 64 20 74 6f 20  map was used to 
1f6a0 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65  obtain the value
1f6b0 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29   for *pPgnoNext)
1f6c0 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67  , then.** *ppPag
1f6d0 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  e is set to zero
1f6e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f6f0 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
1f700 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1f710 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f720 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1f730 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f  file */.  Pgno o
1f740 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vfl,            
1f750 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
1f760 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
1f770 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50  number */.  MemP
1f780 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
1f790 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1f7a0 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20   MemPage handle 
1f7b0 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f  (may be NULL) */
1f7c0 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65  .  Pgno *pPgnoNe
1f7d0 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  xt              
1f7e0 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65  /* OUT: Next ove
1f7f0 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
1f800 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e  r */.){.  Pgno n
1f810 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  ext = 0;.  MemPa
1f820 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20  ge *pPage = 0;. 
1f830 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1f840 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
1f850 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1f860 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1f870 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f  ;.  assert(pPgno
1f880 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20  Next);..#ifndef 
1f890 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1f8a0 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20  VACUUM.  /* Try 
1f8b0 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74  to find the next
1f8c0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
1f8d0 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67  rflow list using
1f8e0 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61   the.  ** autova
1f8f0 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70  cuum pointer-map
1f900 20 70 61 67 65 73 2e 20 47 75 65 73 73 20 74 68   pages. Guess th
1f910 61 74 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  at the next page
1f920 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76   in .  ** the ov
1f930 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70  erflow list is p
1f940 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c  age number (ovfl
1f950 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67 75 65  +1). If that gue
1f960 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f  ss turns .  ** o
1f970 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20  ut to be wrong, 
1f980 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61  fall back to loa
1f990 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66  ding the data of
1f9a0 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62   page .  ** numb
1f9b0 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72  er ovfl to deter
1f9c0 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61  mine the next pa
1f9d0 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a  ge number..  */.
1f9e0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
1f9f0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
1fa00 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f  o pgno;.    Pgno
1fa10 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31   iGuess = ovfl+1
1fa20 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  ;.    u8 eType;.
1fa30 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d  .    while( PTRM
1fa40 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
1fa50 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73  Guess) || iGuess
1fa60 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
1fa70 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1fa80 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20    iGuess++;.    
1fa90 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65 73  }..    if( iGues
1faa0 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75 6e  s<=btreePagecoun
1fab0 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  t(pBt) ){.      
1fac0 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
1fad0 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79  Bt, iGuess, &eTy
1fae0 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20  pe, &pgno);.    
1faf0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1fb00 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54  _OK && eType==PT
1fb10 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26  RMAP_OVERFLOW2 &
1fb20 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a  & pgno==ovfl ){.
1fb30 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69          next = i
1fb40 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72  Guess;.        r
1fb50 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
1fb60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1fb70 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
1fb80 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20  ert( next==0 || 
1fb90 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1fba0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1fbb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1fbc0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
1fbd0 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67  pBt, ovfl, &pPag
1fbe0 65 2c 20 30 2c 20 28 70 70 50 61 67 65 3d 3d 30  e, 0, (ppPage==0
1fbf0 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ));.    assert( 
1fc00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
1fc10 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20   pPage==0 );.   
1fc20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1fc30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74  OK ){.      next
1fc40 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61 67   = get4byte(pPag
1fc50 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d  e->aData);.    }
1fc60 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65  .  }..  *pPgnoNe
1fc70 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28  xt = next;.  if(
1fc80 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a   ppPage ){.    *
1fc90 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a  ppPage = pPage;.
1fca0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c    }else{.    rel
1fcb0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
1fcc0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72  .  }.  return (r
1fcd0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f  c==SQLITE_DONE ?
1fce0 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29   SQLITE_OK : rc)
1fcf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  ;.}../*.** Copy 
1fd00 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
1fd10 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72  er to a page, or
1fd20 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20   from a page to 
1fd30 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  a buffer..**.** 
1fd40 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f  pPayload is a po
1fd50 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73 74  inter to data st
1fd60 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65  ored on database
1fd70 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a   page pDbPage..*
1fd80 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f  * If argument eO
1fd90 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  p is false, then
1fda0 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
1fdb0 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a  data are copied.
1fdc0 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64  ** from pPayload
1fdd0 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70   to the buffer p
1fde0 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42 75  ointed at by pBu
1fdf0 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72 75  f. If eOp is tru
1fe00 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74  e,.** then sqlit
1fe10 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
1fe20 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50  s called on pDbP
1fe30 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79  age and nByte by
1fe40 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61  tes.** of data a
1fe50 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74  re copied from t
1fe60 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20 74  he buffer pBuf t
1fe70 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a  o pPayload..**.*
1fe80 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1fe90 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
1fea0 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e  ss, otherwise an
1feb0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
1fec0 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50  static int copyP
1fed0 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a  ayload(.  void *
1fee0 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20  pPayload,       
1fef0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1ff00 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  o page data */. 
1ff10 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
1ff20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1ff30 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
1ff40 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20  */.  int nByte, 
1ff50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ff60 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1ff70 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69  s to copy */.  i
1ff80 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20  nt eOp,         
1ff90 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e           /* 0 ->
1ffa0 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c   copy from page,
1ffb0 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61   1 -> copy to pa
1ffc0 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ge */.  DbPage *
1ffd0 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20 20  pDbPage         
1ffe0 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
1fff0 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f  ning pPayload */
20000 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b  .){.  if( eOp ){
20010 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74  .    /* Copy dat
20020 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f  a from buffer to
20030 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20 6f   page (a write o
20040 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
20050 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
20060 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
20070 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
20080 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
20090 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
200a0 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
200b0 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c  (pPayload, pBuf,
200c0 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65   nByte);.  }else
200d0 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
200e0 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20  ta from page to 
200f0 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20 6f  buffer (a read o
20100 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
20110 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50   memcpy(pBuf, pP
20120 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a  ayload, nByte);.
20130 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
20140 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
20150 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
20160 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f  s used to read o
20170 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c  r overwrite payl
20180 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  oad information.
20190 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79  ** for the entry
201a0 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20 63   that the pCur c
201b0 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
201c0 67 20 74 6f 2e 20 49 66 20 74 68 65 20 65 4f 70  g to. If the eOp
201d0 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
201e0 20 30 2c 20 74 68 69 73 20 69 73 20 61 20 72 65   0, this is a re
201f0 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 28 64 61  ad operation (da
20200 74 61 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a  ta copied into.*
20210 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 20  * buffer pBuf). 
20220 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  If it is non-zer
20230 6f 2c 20 61 20 77 72 69 74 65 20 28 64 61 74 61  o, a write (data
20240 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20   copied from.** 
20250 62 75 66 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a  buffer pBuf)..**
20260 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22  .** A total of "
20270 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20 72  amt" bytes are r
20280 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62  ead or written b
20290 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66  eginning at "off
202a0 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73  set"..** Data is
202b0 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d   read to or from
202c0 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
202d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74  ..**.** The cont
202e0 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f  ent being read o
202f0 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20  r written might 
20300 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61  appear on the ma
20310 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65  in page.** or be
20320 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f   scattered out o
20330 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  n multiple overf
20340 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a  low pages..**.**
20350 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72   If the BtCursor
20360 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  .isIncrblobHandl
20370 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61  e flag is set, a
20380 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  nd the current.*
20390 2a 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75  * cursor entry u
203a0 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ses one or more 
203b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
203c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
203d0 20 61 6c 6c 6f 63 61 74 65 73 20 73 70 61 63 65   allocates space
203e0 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20   for and lazily 
203f0 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20 6f 76  popluates the ov
20400 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
20410 20 0a 2a 2a 20 63 61 63 68 65 20 61 72 72 61 79   .** cache array
20420 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72   (BtCursor.aOver
20430 66 6c 6f 77 29 2e 20 53 75 62 73 65 71 75 65 6e  flow). Subsequen
20440 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73  t calls use this
20450 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d 61 6b  .** cache to mak
20460 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65  e seeking to the
20470 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74   supplied offset
20480 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e   more efficient.
20490 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f  .**.** Once an o
204a0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
204b0 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
204c0 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d   allocated, it m
204d0 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  ay be.** invalid
204e0 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68  ated if some oth
204f0 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65 73  er cursor writes
20500 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62   to the same tab
20510 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65  le, or if.** the
20520 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64   cursor is moved
20530 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
20540 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  row. Additionall
20550 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  y, in auto-vacuu
20560 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66  m.** mode, the f
20570 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20  ollowing events 
20580 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61  may invalidate a
20590 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  n overflow page-
205a0 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  list cache..**.*
205b0 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65  *   * An increme
205c0 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20  ntal vacuum,.** 
205d0 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20    * A commit in 
205e0 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c  auto_vacuum="ful
205f0 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20  l" mode,.**   * 
20600 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65  Creating a table
20610 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f   (may require mo
20620 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77  ving an overflow
20630 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69   page)..*/.stati
20640 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c  c int accessPayl
20650 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
20660 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
20670 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
20680 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
20690 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66  from */.  u32 of
206a0 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f  fset,          /
206b0 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20  * Begin reading 
206c0 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61  this far into pa
206d0 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61  yload */.  u32 a
206e0 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
206f0 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e  /* Read this man
20700 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73  y bytes */.  uns
20710 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66  igned char *pBuf
20720 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62  , /* Write the b
20730 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62  ytes into this b
20740 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20  uffer */ .  int 
20750 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20  eOp             
20760 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64   /* zero to read
20770 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72  . non-zero to wr
20780 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  ite. */.){.  uns
20790 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79  igned char *aPay
207a0 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  load;.  int rc =
207b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33   SQLITE_OK;.  u3
207c0 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49  2 nKey;.  int iI
207d0 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  dx = 0;.  MemPag
207e0 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
207f0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
20800 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70  age]; /* Btree p
20810 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65  age of current e
20820 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72  ntry */.  BtShar
20830 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
20840 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
20850 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74        /* Btree t
20860 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e  his cursor belon
20870 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65  gs to */..  asse
20880 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61  rt( pPage );.  a
20890 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
208a0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
208b0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
208c0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
208d0 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e  >iPage]<pPage->n
208e0 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
208f0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
20900 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67  ex(pCur) );..  g
20910 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
20920 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70  ;.  aPayload = p
20930 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20  Cur->info.pCell 
20940 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65  + pCur->info.nHe
20950 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28  ader;.  nKey = (
20960 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20  pPage->intKey ? 
20970 30 20 3a 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  0 : (int)pCur->i
20980 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66  nfo.nKey);..  if
20990 28 20 4e 45 56 45 52 28 6f 66 66 73 65 74 2b 61  ( NEVER(offset+a
209a0 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e  mt > nKey+pCur->
209b0 69 6e 66 6f 2e 6e 44 61 74 61 29 20 0a 20 20 20  info.nData) .   
209c0 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75  || &aPayload[pCu
209d0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20  r->info.nLocal] 
209e0 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  > &pPage->aData[
209f0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d  pBt->usableSize]
20a00 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79  .  ){.    /* Try
20a10 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77  ing to read or w
20a20 72 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e  rite past the en
20a30 64 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73  d of the data is
20a40 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
20a50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
20a60 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
20a70 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
20a80 64 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61  data must be rea
20a90 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f  d/written to/fro
20aa0 6d 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65  m the btree page
20ab0 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66   itself. */.  if
20ac0 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69  ( offset<pCur->i
20ad0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
20ae0 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
20af0 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e     if( a+offset>
20b00 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
20b10 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70  l ){.      a = p
20b20 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
20b30 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d   - offset;.    }
20b40 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61  .    rc = copyPa
20b50 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b  yload(&aPayload[
20b60 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61  offset], pBuf, a
20b70 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44  , eOp, pPage->pD
20b80 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73  bPage);.    offs
20b90 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66  et = 0;.    pBuf
20ba0 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d   += a;.    amt -
20bb0 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = a;.  }else{.  
20bc0 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72    offset -= pCur
20bd0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
20be0 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
20bf0 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
20c00 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33   ){.    const u3
20c10 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74  2 ovflSize = pBt
20c20 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
20c30 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74  ;  /* Bytes cont
20c40 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67  ent per ovfl pag
20c50 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65  e */.    Pgno ne
20c60 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78  xtPage;..    nex
20c70 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
20c80 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d  (&aPayload[pCur-
20c90 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a  >info.nLocal]);.
20ca0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20cb0 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
20cc0 20 20 2f 2a 20 49 66 20 74 68 65 20 69 73 49 6e    /* If the isIn
20cd0 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61  crblobHandle fla
20ce0 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65  g is set and the
20cf0 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66   BtCursor.aOverf
20d00 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73  low[].    ** has
20d10 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
20d20 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74  ted, allocate it
20d30 20 6e 6f 77 2e 20 54 68 65 20 61 72 72 61 79 20   now. The array 
20d40 69 73 20 73 69 7a 65 64 20 61 74 0a 20 20 20 20  is sized at.    
20d50 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72  ** one entry for
20d60 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70   each overflow p
20d70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
20d80 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 0a 20  low chain. The. 
20d90 20 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65     ** page numbe
20da0 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  r of the first o
20db0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
20dc0 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66  stored in aOverf
20dd0 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65  low[0],.    ** e
20de0 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30  tc. A value of 0
20df0 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f   in the aOverflo
20e00 77 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e 73 20  w[] array means 
20e10 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a  "not yet known".
20e20 20 20 20 20 2a 2a 20 28 74 68 65 20 63 61 63 68      ** (the cach
20e30 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75  e is lazily popu
20e40 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20  lated)..    */. 
20e50 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49     if( pCur->isI
20e60 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26  ncrblobHandle &&
20e70 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f   !pCur->aOverflo
20e80 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  w ){.      int n
20e90 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e  Ovfl = (pCur->in
20ea0 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72  fo.nPayload-pCur
20eb0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76  ->info.nLocal+ov
20ec0 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69  flSize-1)/ovflSi
20ed0 7a 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  ze;.      pCur->
20ee0 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e  aOverflow = (Pgn
20ef0 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  o *)sqlite3Mallo
20f00 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e  cZero(sizeof(Pgn
20f10 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20  o)*nOvfl);.     
20f20 20 2f 2a 20 6e 4f 76 66 6c 20 69 73 20 61 6c 77   /* nOvfl is alw
20f30 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20 20 49  ays positive.  I
20f40 66 20 69 74 20 77 65 72 65 20 7a 65 72 6f 2c 20  f it were zero, 
20f50 66 65 74 63 68 50 61 79 6c 6f 61 64 20 77 6f 75  fetchPayload wou
20f60 6c 64 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a  ld have.      **
20f70 20 62 65 65 6e 20 75 73 65 64 20 69 6e 73 74 65   been used inste
20f80 61 64 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ad of this routi
20f90 6e 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ne. */.      if(
20fa0 20 41 4c 57 41 59 53 28 6e 4f 76 66 6c 29 20 26   ALWAYS(nOvfl) &
20fb0 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  & !pCur->aOverfl
20fc0 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ow ){.        rc
20fd0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
20fe0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
20ff0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76      /* If the ov
21000 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
21010 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20   cache has been 
21020 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
21030 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66  e.    ** entry f
21040 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71  or the first req
21050 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70  uired overflow p
21060 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b  age is valid, sk
21070 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  ip.    ** direct
21080 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f  ly to it..    */
21090 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61  .    if( pCur->a
210a0 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72  Overflow && pCur
210b0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73  ->aOverflow[offs
210c0 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a  et/ovflSize] ){.
210d0 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66        iIdx = (of
210e0 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a  fset/ovflSize);.
210f0 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
21100 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
21110 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66  [iIdx];.      of
21120 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f  fset = (offset%o
21130 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  vflSize);.    }.
21140 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72 28  #endif..    for(
21150 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   ; rc==SQLITE_OK
21160 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78   && amt>0 && nex
21170 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a  tPage; iIdx++){.
21180 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21190 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
211a0 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72      /* If requir
211b0 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65  ed, populate the
211c0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
211d0 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  ist cache. */.  
211e0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
211f0 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
21200 20 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d     assert(!pCur-
21210 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
21220 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   || pCur->aOverf
21230 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50  low[iIdx]==nextP
21240 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43  age);.        pC
21250 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
21260 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a  dx] = nextPage;.
21270 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a        }.#endif..
21280 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74        if( offset
21290 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  >=ovflSize ){.  
212a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c        /* The onl
212b0 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64  y reason to read
212c0 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f   this page is to
212d0 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65   obtain the page
212e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
212f0 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  er for the next 
21300 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
21310 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20  flow chain. The 
21320 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
21330 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75  data is not requ
21340 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74  ired. So first t
21350 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65  ry to lookup the
21360 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20   overflow.      
21370 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63    ** page-list c
21380 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68  ache, if any, th
21390 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  en fall back to 
213a0 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  the getOverflowP
213b0 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a  age().        **
213c0 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20   function..     
213d0 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
213e0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
213f0 4f 42 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  OB.        if( p
21400 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26  Cur->aOverflow &
21410 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  & pCur->aOverflo
21420 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20  w[iIdx+1] ){.   
21430 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
21440 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
21450 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20  w[iIdx+1];.     
21460 20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69     } else .#endi
21470 66 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  f.          rc =
21480 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
21490 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20  (pBt, nextPage, 
214a0 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20  0, &nextPage);. 
214b0 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d         offset -=
214c0 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20   ovflSize;.     
214d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
214e0 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20  /* Need to read 
214f0 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72  this page proper
21500 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20  ly. It contains 
21510 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20  some of the.    
21520 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20      ** range of 
21530 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69  data that is bei
21540 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29  ng read (eOp==0)
21550 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70   or written (eOp
21560 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f  !=0)..        */
21570 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
21580 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
21590 45 41 44 0a 20 20 20 20 20 20 20 20 73 71 6c 69  EAD.        sqli
215a0 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 23 65  te3_file *fd;.#e
215b0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e 74  ndif.        int
215c0 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20   a = amt;.      
215d0 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74    if( a + offset
215e0 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20   > ovflSize ){. 
215f0 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66           a = ovf
21600 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  lSize - offset;.
21610 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65          }..#ifde
21620 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
21630 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
21640 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20        /* If all 
21650 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
21660 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20 20  e true:.        
21670 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
21680 31 29 20 74 68 69 73 20 69 73 20 61 20 72 65 61  1) this is a rea
21690 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64  d operation, and
216a0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 32   .        **   2
216b0 29 20 64 61 74 61 20 69 73 20 72 65 71 75 69 72  ) data is requir
216c0 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72  ed from the star
216d0 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66 6c  t of this overfl
216e0 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20 20  ow page, and.   
216f0 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68 65       **   3) the
21700 20 64 61 74 61 62 61 73 65 20 69 73 20 66 69 6c   database is fil
21710 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20  e-backed, and.  
21720 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68        **   4) th
21730 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77  ere is no open w
21740 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
21750 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  , and.        **
21760 20 20 20 35 29 20 74 68 65 20 64 61 74 61 62 61     5) the databa
21770 73 65 20 69 73 20 6e 6f 74 20 61 20 57 41 4c 20  se is not a WAL 
21780 64 61 74 61 62 61 73 65 2c 0a 20 20 20 20 20 20  database,.      
21790 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
217a0 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62 65  then data can be
217b0 20 72 65 61 64 20 64 69 72 65 63 74 6c 79 20 66   read directly f
217c0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
217d0 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20   file into the. 
217e0 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74         ** output
217f0 20 62 75 66 66 65 72 2c 20 62 79 70 61 73 73 69   buffer, bypassi
21800 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  ng the page-cach
21810 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54 68  e altogether. Th
21820 69 73 20 73 70 65 65 64 73 0a 20 20 20 20 20 20  is speeds.      
21830 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20    ** up loading 
21840 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20 74 68  large records th
21850 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65  at span many ove
21860 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 20  rflow pages..   
21870 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
21880 69 66 28 20 65 4f 70 3d 3d 30 20 20 20 20 20 20  if( eOp==0      
21890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218b0 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f         /* (1) */
218c0 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f 66 66  .         && off
218d0 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20 20  set==0          
218e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21900 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20  /* (2) */.      
21910 20 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61     && pBt->inTra
21920 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
21930 52 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20  READ            
21940 20 20 20 20 20 20 20 20 20 2f 2a 20 28 34 29 20           /* (4) 
21950 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  */.         && (
21960 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  fd = sqlite3Page
21970 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65  rFile(pBt->pPage
21980 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20  r))->pMethods   
21990 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20    /* (3) */.    
219a0 20 20 20 20 20 26 26 20 70 42 74 2d 3e 70 50 61       && pBt->pPa
219b0 67 65 31 2d 3e 61 44 61 74 61 5b 31 39 5d 3d 3d  ge1->aData[19]==
219c0 30 78 30 31 20 20 20 20 20 20 20 20 20 20 20 20  0x01            
219d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 35             /* (5
219e0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a  ) */.        ){.
219f0 20 20 20 20 20 20 20 20 20 20 75 38 20 61 53 61            u8 aSa
21a00 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20  ve[4];.         
21a10 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70   u8 *aWrite = &p
21a20 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20  Buf[-4];.       
21a30 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c     memcpy(aSave,
21a40 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20   aWrite, 4);.   
21a50 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
21a60 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57  te3OsRead(fd, aW
21a70 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29  rite, a+4, (i64)
21a80 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e  pBt->pageSize*(n
21a90 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20  extPage-1));.   
21aa0 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
21ab0 3d 20 67 65 74 34 62 79 74 65 28 61 57 72 69 74  = get4byte(aWrit
21ac0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  e);.          me
21ad0 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61 53 61  mcpy(aWrite, aSa
21ae0 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  ve, 4);.        
21af0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
21b00 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
21b10 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
21b20 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e;.          rc 
21b30 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  = sqlite3PagerAc
21b40 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65  quire(pBt->pPage
21b50 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44  r, nextPage, &pD
21b60 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20  bPage,.         
21b70 20 20 20 20 20 28 65 4f 70 3d 3d 30 20 3f 20 50       (eOp==0 ? P
21b80 41 47 45 52 5f 41 43 51 55 49 52 45 5f 52 45 41  AGER_ACQUIRE_REA
21b90 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20  DONLY : 0).     
21ba0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
21bb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21bc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
21bd0 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71     aPayload = sq
21be0 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
21bf0 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  a(pDbPage);.    
21c00 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
21c10 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79   = get4byte(aPay
21c20 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20  load);.         
21c30 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
21c40 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
21c50 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61  fset+4], pBuf, a
21c60 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b  , eOp, pDbPage);
21c70 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
21c80 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
21c90 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
21ca0 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b       offset = 0;
21cb0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
21cc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
21cd0 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20  mt -= a;.       
21ce0 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
21cf0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
21d00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21d10 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20  OK && amt>0 ){. 
21d20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21d30 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
21d40 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
21d50 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61  }../*.** Read pa
21d60 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73  rt of the key as
21d70 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
21d80 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63  rsor pCur.  Exac
21d90 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74  tly.** "amt" byt
21da0 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
21db0 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  fered into pBuf[
21dc0 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
21dd0 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
21de0 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68  ffset"..**.** Th
21df0 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
21e00 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20 69  sure that pCur i
21e10 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  s pointing to a 
21e20 76 61 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20  valid row.** in 
21e30 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
21e40 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
21e50 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
21e60 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
21e70 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
21e80 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
21e90 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
21ea0 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
21eb0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
21ec0 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
21ed0 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
21ee0 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42  qlite3BtreeKey(B
21ef0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
21f00 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
21f10 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
21f20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
21f30 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
21f40 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
21f50 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
21f60 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
21f70 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
21f80 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
21f90 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
21fa0 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e] );.  assert( 
21fb0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
21fc0 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
21fd0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
21fe0 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72  e]->nCell );.  r
21ff0 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c  eturn accessPayl
22000 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
22010 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64  , amt, (unsigned
22020 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b   char*)pBuf, 0);
22030 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
22040 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
22050 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
22060 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
22070 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
22080 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
22090 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75  nsfered into pBu
220a0 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
220b0 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
220c0 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
220d0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
220e0 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
220f0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
22100 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
22110 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
22120 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
22130 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
22140 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
22150 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
22160 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
22170 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42  lite3BtreeData(B
22180 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
22190 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
221a0 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
221b0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e  .  int rc;..#ifn
221c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
221d0 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20  INCRBLOB.  if ( 
221e0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
221f0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
22200 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
22210 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e  E_ABORT;.  }.#en
22220 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63  dif..  assert( c
22230 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
22240 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
22250 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
22260 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
22270 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22280 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
22290 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
222a0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
222b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
222c0 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
222d0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
222e0 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73  Page] );.    ass
222f0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
22300 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
22310 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
22320 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
22330 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73  ;.    rc = acces
22340 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
22350 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66  ffset, amt, pBuf
22360 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
22370 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22380 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
22390 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f   to payload info
223a0 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
223b0 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
223c0 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20  .** pCur cursor 
223d0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
223e0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
223f0 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
22400 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69   of.** the key i
22410 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64  f skipKey==0 and
22420 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
22430 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64  e beginning of d
22440 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65  ata if.** skipKe
22450 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62 65  y==1.  The numbe
22460 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76  r of bytes of av
22470 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74 61  ailable key/data
22480 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69   is written.** i
22490 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a  nto *pAmt.  If *
224a0 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68  pAmt==0, then th
224b0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
224c0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20   will not be.** 
224d0 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
224e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
224f0 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ine is an optimi
22500 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63  zation.  It is c
22510 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e  ommon for the en
22520 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20  tire key.** and 
22530 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74  data to fit on t
22540 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e  he local page an
22550 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  d for there to b
22560 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  e no overflow.**
22570 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68   pages.  When th
22580 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72  at is so, this r
22590 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73  outine can be us
225a0 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ed to access the
225b0 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61  .** key and data
225c0 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20   without making 
225d0 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20  a copy.  If the 
225e0 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20  key and/or data 
225f0 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f  spills.** onto o
22600 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74  verflow pages, t
22610 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  hen accessPayloa
22620 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64  d() must be used
22630 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a   to reassemble.*
22640 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61  * the key/data a
22650 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20  nd copy it into 
22660 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62  a preallocated b
22670 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uffer..**.** The
22680 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
22690 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
226a0 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79  e looks directly
226b0 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64   into the cached
226c0 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20  .** page of the 
226d0 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64  database.  The d
226e0 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65  ata might change
226f0 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78   or move the nex
22700 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74  t time.** any bt
22710 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63  ree routine is c
22720 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
22730 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
22740 63 68 61 72 20 2a 66 65 74 63 68 50 61 79 6c 6f  char *fetchPaylo
22750 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ad(.  BtCursor *
22760 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75  pCur,      /* Cu
22770 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
22780 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66   entry to read f
22790 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41  rom */.  int *pA
227a0 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  mt,           /*
227b0 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
227c0 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
227d0 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 69  ytes here */.  i
227e0 6e 74 20 73 6b 69 70 4b 65 79 20 20 20 20 20 20  nt skipKey      
227f0 20 20 20 20 2f 2a 20 72 65 61 64 20 62 65 67 69      /* read begi
22800 6e 6e 69 6e 67 20 61 74 20 64 61 74 61 20 69 66  nning at data if
22810 20 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f   this is true */
22820 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
22830 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20  har *aPayload;. 
22840 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
22850 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 75  .  u32 nKey;.  u
22860 33 32 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73  32 nLocal;..  as
22870 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26  sert( pCur!=0 &&
22880 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
22890 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
228a0 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20  pCur->iPage]);. 
228b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
228c0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
228d0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
228e0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
228f0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 70 50 61  x(pCur) );.  pPa
22900 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
22910 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
22920 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22930 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
22940 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  e]<pPage->nCell 
22950 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  );.  if( NEVER(p
22960 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
22970 3d 30 29 20 29 7b 0a 20 20 20 20 62 74 72 65 65  =0) ){.    btree
22980 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
22990 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
229a0 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78  ge], pCur->aiIdx
229b0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20  [pCur->iPage],. 
229c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229d0 20 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a    &pCur->info);.
229e0 20 20 7d 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d    }.  aPayload =
229f0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c   pCur->info.pCel
22a00 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d  l;.  aPayload +=
22a10 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61   pCur->info.nHea
22a20 64 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65  der;.  if( pPage
22a30 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
22a40 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  nKey = 0;.  }els
22a50 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 28 69  e{.    nKey = (i
22a60 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  nt)pCur->info.nK
22a70 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b  ey;.  }.  if( sk
22a80 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 50 61  ipKey ){.    aPa
22a90 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20  yload += nKey;. 
22aa0 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72     nLocal = pCur
22ab0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20  ->info.nLocal - 
22ac0 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nKey;.  }else{. 
22ad0 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72     nLocal = pCur
22ae0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
22af0 20 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 63 61     assert( nLoca
22b00 6c 3c 3d 6e 4b 65 79 20 29 3b 0a 20 20 7d 0a 20  l<=nKey );.  }. 
22b10 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b   *pAmt = nLocal;
22b20 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79 6c 6f  .  return aPaylo
22b30 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f  ad;.}.../*.** Fo
22b40 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
22b50 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
22b60 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e  point to, return
22b70 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65   as.** many byte
22b80 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20  s of the key or 
22b90 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69  data as are avai
22ba0 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63  lable on the loc
22bb0 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67  al.** b-tree pag
22bc0 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75  e.  Write the nu
22bd0 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
22be0 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41  e bytes into *pA
22bf0 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  mt..**.** The po
22c00 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69  inter returned i
22c10 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68  s ephemeral.  Th
22c20 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d  e key/data may m
22c30 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73  ove.** or be des
22c40 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65  troyed on the ne
22c50 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42  xt call to any B
22c60 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a  tree routine,.**
22c70 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73   including calls
22c80 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65   from other thre
22c90 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  ads against the 
22ca0 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48  same cache..** H
22cb0 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e  ence, a mutex on
22cc0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68   the BtShared sh
22cd0 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69  ould be held pri
22ce0 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a  or to calling.**
22cf0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
22d00 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
22d10 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67  nes is used to g
22d20 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20  et quick access 
22d30 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a  to key and data.
22d40 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  ** in the common
22d50 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f   case where no o
22d60 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
22d70 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74  e used..*/.const
22d80 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
22d90 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 43 75  reeKeyFetch(BtCu
22da0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
22db0 2a 70 41 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20  *pAmt){.  const 
22dc0 76 6f 69 64 20 2a 70 20 3d 20 30 3b 0a 20 20 61  void *p = 0;.  a
22dd0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
22de0 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
22df0 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
22e00 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
22e10 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
22e20 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20  (pCur) );.  if( 
22e30 41 4c 57 41 59 53 28 70 43 75 72 2d 3e 65 53 74  ALWAYS(pCur->eSt
22e40 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
22e50 44 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 63  D) ){.    p = (c
22e60 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68  onst void*)fetch
22e70 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41  Payload(pCur, pA
22e80 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  mt, 0);.  }.  re
22e90 74 75 72 6e 20 70 3b 0a 7d 0a 63 6f 6e 73 74 20  turn p;.}.const 
22ea0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72  void *sqlite3Btr
22eb0 65 65 44 61 74 61 46 65 74 63 68 28 42 74 43 75  eeDataFetch(BtCu
22ec0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
22ed0 2a 70 41 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20  *pAmt){.  const 
22ee0 76 6f 69 64 20 2a 70 20 3d 20 30 3b 0a 20 20 61  void *p = 0;.  a
22ef0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
22f00 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
22f10 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
22f20 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
22f30 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
22f40 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20  (pCur) );.  if( 
22f50 41 4c 57 41 59 53 28 70 43 75 72 2d 3e 65 53 74  ALWAYS(pCur->eSt
22f60 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
22f70 44 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 63  D) ){.    p = (c
22f80 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68  onst void*)fetch
22f90 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41  Payload(pCur, pA
22fa0 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65  mt, 1);.  }.  re
22fb0 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn p;.}.../*.*
22fc0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
22fd0 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20  r down to a new 
22fe0 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65  child page.  The
22ff0 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e   newPgno argumen
23000 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65  t is the.** page
23010 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63   number of the c
23020 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76  hild page to mov
23030 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  e to..**.** This
23040 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
23050 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  s SQLITE_CORRUPT
23060 20 69 66 20 74 68 65 20 70 61 67 65 2d 68 65 61   if the page-hea
23070 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20  der flags field 
23080 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68  of.** the new ch
23090 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f  ild page does no
230a0 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67  t match the flag
230b0 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70  s field of the p
230c0 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69  arent (i.e..** i
230d0 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65  f an intkey page
230e0 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 74   appears to be t
230f0 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e  he parent of a n
23100 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20  on-intkey page, 
23110 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61  or.** vice-versa
23120 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
23130 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43   moveToChild(BtC
23140 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
23150 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74   newPgno){.  int
23160 20 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70   rc;.  int i = p
23170 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65  Cur->iPage;.  Me
23180 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b  mPage *pNewPage;
23190 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
231a0 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20   = pCur->pBt;.. 
231b0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
231c0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
231d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
231e0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
231f0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
23200 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
23210 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  <BTCURSOR_MAX_DE
23220 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PTH );.  assert(
23230 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
23240 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  );.  if( pCur->i
23250 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f  Page>=(BTCURSOR_
23260 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a  MAX_DEPTH-1) ){.
23270 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
23280 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
23290 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e    }.  rc = getAn
232a0 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e  dInitPage(pBt, n
232b0 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67  ewPgno, &pNewPag
232c0 65 2c 20 28 70 43 75 72 2d 3e 77 72 46 6c 61 67  e, (pCur->wrFlag
232d0 3d 3d 30 29 29 3b 0a 20 20 69 66 28 20 72 63 20  ==0));.  if( rc 
232e0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70  ) return rc;.  p
232f0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d  Cur->apPage[i+1]
23300 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70   = pNewPage;.  p
23310 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20  Cur->aiIdx[i+1] 
23320 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  = 0;.  pCur->iPa
23330 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69  ge++;..  pCur->i
23340 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
23350 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
23360 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77   = 0;.  if( pNew
23370 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c  Page->nCell<1 ||
23380 20 70 4e 65 77 50 61 67 65 2d 3e 69 6e 74 4b 65   pNewPage->intKe
23390 79 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  y!=pCur->apPage[
233a0 69 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  i]->intKey ){.  
233b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
233c0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
233d0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
233e0 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f  E_OK;.}..#if 0./
233f0 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e  *.** Page pParen
23400 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c  t is an internal
23410 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65   (non-leaf) tree
23420 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63   page. This func
23430 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73  tion .** asserts
23440 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65   that page numbe
23450 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20  r iChild is the 
23460 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68  left-child if th
23470 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c  e iIdx'th.** cel
23480 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e  l in page pParen
23490 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69  t. Or, if iIdx i
234a0 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74  s equal to the t
234b0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a  otal number of.*
234c0 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  * cells in pPare
234d0 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75  nt, that page nu
234e0 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74  mber iChild is t
234f0 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f  he right-child o
23500 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a  f.** the page..*
23510 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  /.static void as
23520 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
23530 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
23540 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f  , int iIdx, Pgno
23550 20 69 43 68 69 6c 64 29 7b 0a 20 20 61 73 73 65   iChild){.  asse
23560 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e  rt( iIdx<=pParen
23570 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66  t->nCell );.  if
23580 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d  ( iIdx==pParent-
23590 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73  >nCell ){.    as
235a0 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28 26  sert( get4byte(&
235b0 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
235c0 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
235d0 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b  t+8])==iChild );
235e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
235f0 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28 66  sert( get4byte(f
23600 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  indCell(pParent,
23610 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20   iIdx))==iChild 
23620 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
23630 20 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 50    define assertP
23640 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a  arentIndex(x,y,z
23650 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ) .#endif../*.**
23660 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
23670 20 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e   up to the paren
23680 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43  t page..**.** pC
23690 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74  ur->idx is set t
236a0 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78  o the cell index
236b0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
236c0 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f  he pointer.** to
236d0 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
236e0 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49   coming from.  I
236f0 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20  f we are coming 
23700 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68  from the.** righ
23710 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67  t-most child pag
23720 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78  e then pCur->idx
23730 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d   is set to one m
23740 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ore than.** the 
23750 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64  largest cell ind
23760 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
23770 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28  id moveToParent(
23780 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
23790 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
237a0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
237b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
237c0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
237d0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
237e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
237f0 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>0 );.  assert
23800 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
23810 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 0a  Cur->iPage] );..
23820 20 20 2f 2a 20 55 50 44 41 54 45 3a 20 49 74 20    /* UPDATE: It 
23830 69 73 20 61 63 74 75 61 6c 6c 79 20 70 6f 73 73  is actually poss
23840 69 62 6c 65 20 66 6f 72 20 74 68 65 20 63 6f 6e  ible for the con
23850 64 69 74 69 6f 6e 20 74 65 73 74 65 64 20 62 79  dition tested by
23860 20 74 68 65 20 61 73 73 65 72 74 0a 20 20 2a 2a   the assert.  **
23870 20 62 65 6c 6f 77 20 74 6f 20 62 65 20 75 6e 74   below to be unt
23880 72 75 65 20 69 66 20 74 68 65 20 64 61 74 61 62  rue if the datab
23890 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72  ase file is corr
238a0 75 70 74 2e 20 54 68 69 73 20 63 61 6e 20 6f 63  upt. This can oc
238b0 63 75 72 20 69 66 0a 20 20 2a 2a 20 6f 6e 65 20  cur if.  ** one 
238c0 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 64 69 66  cursor has modif
238d0 69 65 64 20 70 61 67 65 20 70 50 61 72 65 6e 74  ied page pParent
238e0 20 77 68 69 6c 65 20 61 20 72 65 66 65 72 65 6e   while a referen
238f0 63 65 20 74 6f 20 69 74 20 69 73 20 68 65 6c 64  ce to it is held
23900 20 0a 20 20 2a 2a 20 62 79 20 61 20 73 65 63 6f   .  ** by a seco
23910 6e 64 20 63 75 72 73 6f 72 2e 20 57 68 69 63 68  nd cursor. Which
23920 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
23930 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   if a single pag
23940 65 20 69 73 20 6c 69 6e 6b 65 64 0a 20 20 2a 2a  e is linked.  **
23950 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20   into more than 
23960 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75 63  one b-tree struc
23970 74 75 72 65 20 69 6e 20 61 20 63 6f 72 72 75 70  ture in a corrup
23980 74 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a  t database.  */.
23990 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 50 61  #if 0.  assertPa
239a0 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70  rentIndex(.    p
239b0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
239c0 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
239d0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
239e0 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
239f0 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
23a00 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e  Cur->iPage]->pgn
23a10 6f 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  o.  );.#endif.  
23a20 74 65 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e  testcase( pCur->
23a30 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
23a40 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50  e-1] > pCur->apP
23a50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
23a60 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  1]->nCell );..  
23a70 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
23a80 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
23a90 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e  Page]);.  pCur->
23aa0 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d  iPage--;.  pCur-
23ab0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
23ac0 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
23ad0 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ey = 0;.}../*.**
23ae0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
23af0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
23b00 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74   root page of it
23b10 73 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  s b-tree structu
23b20 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  re..**.** If the
23b30 20 74 61 62 6c 65 20 68 61 73 20 61 20 76 69 72   table has a vir
23b40 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20  tual root page, 
23b50 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
23b60 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e  is moved to poin
23b70 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74  t.** to the virt
23b80 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e  ual root page in
23b90 73 74 65 61 64 20 6f 66 20 74 68 65 20 61 63 74  stead of the act
23ba0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41  ual root page. A
23bb0 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20   table has a.** 
23bc0 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
23bd0 65 20 77 68 65 6e 20 74 68 65 20 61 63 74 75 61  e when the actua
23be0 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74  l root page cont
23bf0 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e  ains no cells an
23c00 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63  d a .** single c
23c10 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20  hild page. This 
23c20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
23c30 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 72  with the table r
23c40 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 31 2e  ooted at page 1.
23c50 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d  .**.** If the b-
23c60 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69  tree structure i
23c70 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72  s empty, the cur
23c80 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 74  sor state is set
23c90 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49   to .** CURSOR_I
23ca0 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73  NVALID. Otherwis
23cb0 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  e, the cursor is
23cc0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
23cd0 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65   the first.** ce
23ce0 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68  ll located on th
23cf0 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75  e root (or virtu
23d00 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e  al root) page an
23d10 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  d the cursor sta
23d20 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  te.** is set to 
23d30 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a  CURSOR_VALID..**
23d40 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63  .** If this func
23d50 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63  tion returns suc
23d60 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61  cessfully, it ma
23d70 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 68 61  y be assumed tha
23d80 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65  t the.** page-he
23d90 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63  ader flags indic
23da0 61 74 65 20 74 68 61 74 20 74 68 65 20 5b 76 69  ate that the [vi
23db0 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65  rtual] root-page
23dc0 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65 64   is the expected
23dd0 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74   .** kind of b-t
23de0 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69  ree page (i.e. i
23df0 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74  f when opening t
23e00 68 65 20 63 75 72 73 6f 72 20 74 68 65 20 63 61  he cursor the ca
23e10 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20  ller did not.** 
23e20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66  specify a KeyInf
23e30 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20  o structure the 
23e40 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65  flags byte is se
23e50 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30  t to 0x05 or 0x0
23e60 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67  D,.** indicating
23e70 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c   a table b-tree,
23e80 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65   or if the calle
23e90 72 20 64 69 64 20 73 70 65 63 69 66 79 20 61 20  r did specify a 
23ea0 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75  KeyInfo .** stru
23eb0 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20  cture the flags 
23ec0 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30  byte is set to 0
23ed0 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64  x02 or 0x0A, ind
23ee0 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78  icating an index
23ef0 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a  .** b-tree)..*/.
23f00 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
23f10 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a  oRoot(BtCursor *
23f20 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pCur){.  MemPage
23f30 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72   *pRoot;.  int r
23f40 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
23f50 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72   Btree *p = pCur
23f60 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68  ->pBtree;.  BtSh
23f70 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
23f80 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
23f90 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
23fa0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
23fb0 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  t( CURSOR_INVALI
23fc0 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49  D < CURSOR_REQUI
23fd0 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
23fe0 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
23ff0 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55     < CURSOR_REQU
24000 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
24010 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c  ert( CURSOR_FAUL
24020 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51  T   > CURSOR_REQ
24030 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66  UIRESEEK );.  if
24040 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
24050 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
24060 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  EK ){.    if( pC
24070 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
24080 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
24090 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
240a0 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45  skipNext!=SQLITE
240b0 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 65 74  _OK );.      ret
240c0 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  urn pCur->skipNe
240d0 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  xt;.    }.    sq
240e0 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
240f0 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d  ursor(pCur);.  }
24100 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ..  if( pCur->iP
24110 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e  age>=0 ){.    in
24120 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  t i;.    for(i=1
24130 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
24140 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
24150 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
24160 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
24170 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67  }.    pCur->iPag
24180 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  e = 0;.  }else i
24190 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  f( pCur->pgnoRoo
241a0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72  t==0 ){.    pCur
241b0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
241c0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72  R_INVALID;.    r
241d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
241e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
241f0 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
24200 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  e(pBt, pCur->pgn
24210 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70  oRoot, &pCur->ap
24220 50 61 67 65 5b 30 5d 2c 20 70 43 75 72 2d 3e 77  Page[0], pCur->w
24230 72 46 6c 61 67 3d 3d 30 29 3b 0a 20 20 20 20 69  rFlag==0);.    i
24240 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
24250 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
24260 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
24270 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72  INVALID;.      r
24280 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
24290 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20      pCur->iPage 
242a0 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  = 0;..    /* If 
242b0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69  pCur->pKeyInfo i
242c0 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
242d0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74   the caller that
242e0 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75 72   opened this cur
242f0 73 6f 72 0a 20 20 20 20 2a 2a 20 65 78 70 65 63  sor.    ** expec
24300 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f  ted to open it o
24310 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  n an index b-tre
24320 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  e. Otherwise, if
24330 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 20   pKeyInfo is.   
24340 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61   ** NULL, the ca
24350 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20 74  ller expects a t
24360 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20  able b-tree. If 
24370 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
24380 63 61 73 65 2c 0a 20 20 20 20 2a 2a 20 72 65 74  case,.    ** ret
24390 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f  urn an SQLITE_CO
243a0 52 52 55 50 54 20 65 72 72 6f 72 2e 20 20 2a 2f  RRUPT error.  */
243b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
243c0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
243d0 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 43 75 72 2d  tKey==1 || pCur-
243e0 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
243f0 65 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ey==0 );.    if(
24400 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f   (pCur->pKeyInfo
24410 3d 3d 30 29 21 3d 70 43 75 72 2d 3e 61 70 50 61  ==0)!=pCur->apPa
24420 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b  ge[0]->intKey ){
24430 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
24440 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
24450 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  T;.    }.  }..  
24460 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
24470 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
24480 6f 66 20 74 68 65 20 63 6f 72 72 65 63 74 20 74  of the correct t
24490 79 70 65 2e 20 54 68 69 73 20 6d 75 73 74 20 62  ype. This must b
244a0 65 20 74 68 65 0a 20 20 2a 2a 20 63 61 73 65 20  e the.  ** case 
244b0 61 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 74  as the call to t
244c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  his function tha
244d0 74 20 6c 6f 61 64 65 64 20 74 68 65 20 72 6f 6f  t loaded the roo
244e0 74 2d 70 61 67 65 20 28 65 69 74 68 65 72 0a 20  t-page (either. 
244f0 20 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 6f 72   ** this call or
24500 20 61 20 70 72 65 76 69 6f 75 73 20 69 6e 76 6f   a previous invo
24510 63 61 74 69 6f 6e 29 20 77 6f 75 6c 64 20 68 61  cation) would ha
24520 76 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72  ve detected corr
24530 75 70 74 69 6f 6e 20 0a 20 20 2a 2a 20 69 66 20  uption .  ** if 
24540 74 68 65 20 61 73 73 75 6d 70 74 69 6f 6e 20 77  the assumption w
24550 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e  ere not true, an
24560 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  d it is not poss
24570 69 62 6c 65 20 66 6f 72 20 74 68 65 20 66 6c 61  ible for the fla
24580 67 73 20 0a 20 20 2a 2a 20 62 79 74 65 20 74 6f  gs .  ** byte to
24590 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
245a0 69 65 64 20 77 68 69 6c 65 20 74 68 69 73 20 63  ied while this c
245b0 75 72 73 6f 72 20 69 73 20 68 6f 6c 64 69 6e 67  ursor is holding
245c0 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20 2a   a reference.  *
245d0 2a 20 74 6f 20 74 68 65 20 70 61 67 65 2e 20 20  * to the page.  
245e0 2a 2f 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75  */.  pRoot = pCu
245f0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20  r->apPage[0];.  
24600 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70  assert( pRoot->p
24610 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52  gno==pCur->pgnoR
24620 6f 6f 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  oot );.  assert(
24630 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 20 26   pRoot->isInit &
24640 26 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  & (pCur->pKeyInf
24650 6f 3d 3d 30 29 3d 3d 70 52 6f 6f 74 2d 3e 69 6e  o==0)==pRoot->in
24660 74 4b 65 79 20 29 3b 0a 0a 20 20 70 43 75 72 2d  tKey );..  pCur-
24670 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20  >aiIdx[0] = 0;. 
24680 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
24690 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61  e = 0;.  pCur->a
246a0 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 43 75  tLast = 0;.  pCu
246b0 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
246c0 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  ;..  if( pRoot->
246d0 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f  nCell==0 && !pRo
246e0 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ot->leaf ){.    
246f0 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20  Pgno subpage;.  
24700 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e    if( pRoot->pgn
24710 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51  o!=1 ) return SQ
24720 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
24730 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d  T;.    subpage =
24740 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74   get4byte(&pRoot
24750 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68  ->aData[pRoot->h
24760 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
24770 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
24780 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
24790 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
247a0 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67  ild(pCur, subpag
247b0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
247c0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
247d0 28 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30  ((pRoot->nCell>0
247e0 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43  )?CURSOR_VALID:C
247f0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a  URSOR_INVALID);.
24800 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
24810 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
24820 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
24830 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  o the left-most 
24840 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
24850 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20  th the.** entry 
24860 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
24870 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
24880 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66  g..**.** The lef
24890 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74  t-most leaf is t
248a0 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
248b0 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74  smallest key - t
248c0 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61  he first.** in a
248d0 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
248e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
248f0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43  veToLeftmost(BtC
24900 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
24910 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
24920 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24930 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
24940 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
24950 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
24960 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
24970 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
24980 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
24990 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
249a0 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67  ITE_OK && !(pPag
249b0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
249c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e  [pCur->iPage])->
249d0 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65  leaf ){.    asse
249e0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
249f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
24a00 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
24a10 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
24a20 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
24a30 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
24a40 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20  r->iPage]));.   
24a50 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
24a60 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
24a70 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
24a80 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
24a90 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
24aa0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
24ab0 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
24ac0 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  th the.** page t
24ad0 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
24ae0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
24af0 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69  .  Notice the di
24b00 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77  fference.** betw
24b10 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  een moveToLeftmo
24b20 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52  st() and moveToR
24b30 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76  ightmost().  mov
24b40 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a  eToLeftmost().**
24b50 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d   finds the left-
24b60 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
24b70 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77  th the *entry* w
24b80 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67  hereas moveToRig
24b90 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  htmost().** find
24ba0 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
24bb0 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
24bc0 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a  he *page*..**.**
24bd0 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
24be0 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65  entry is the one
24bf0 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73   with the larges
24c00 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74  t key - the last
24c10 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e  .** key in ascen
24c20 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
24c30 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
24c40 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73  Rightmost(BtCurs
24c50 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
24c60 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
24c70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
24c80 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
24c90 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63   0;..  assert( c
24ca0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
24cb0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
24cc0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
24cd0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
24ce0 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
24cf0 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61  LITE_OK && !(pPa
24d00 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
24d10 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d  e[pCur->iPage])-
24d20 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e  >leaf ){.    pgn
24d30 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
24d40 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
24d50 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
24d60 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
24d70 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
24d80 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
24d90 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
24da0 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
24db0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
24dc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
24dd0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
24de0 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d  >iPage] = pPage-
24df0 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43  >nCell-1;.    pC
24e00 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
24e10 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61   0;.    pCur->va
24e20 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d  lidNKey = 0;.  }
24e30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24e40 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
24e50 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  sor to the first
24e60 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
24e70 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
24e80 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
24e90 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
24ea0 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
24eb0 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
24ec0 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
24ed0 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
24ee0 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
24ef0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
24f00 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
24f10 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a  First(BtCursor *
24f20 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
24f30 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
24f40 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
24f50 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
24f60 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
24f70 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
24f80 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
24f90 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
24fa0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
24fb0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
24fc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
24fd0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
24fe0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
24ff0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
25000 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
25010 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
25020 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
25030 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
25040 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
25050 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
25060 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
25070 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
25080 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20  >nCell>0 );.    
25090 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
250a0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65     rc = moveToLe
250b0 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
250c0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
250d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
250e0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
250f0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
25100 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
25110 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
25120 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
25130 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
25140 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
25150 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
25160 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
25170 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
25180 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
25190 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
251a0 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72  3BtreeLast(BtCur
251b0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
251c0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
251d0 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  . .  assert( cur
251e0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
251f0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
25200 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
25210 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
25220 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
25230 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
25240 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  sor already poin
25250 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ts to the last e
25260 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20 61 20  ntry, this is a 
25270 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20  no-op. */.  if( 
25280 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43  CURSOR_VALID==pC
25290 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20 70 43  ur->eState && pC
252a0 75 72 2d 3e 61 74 4c 61 73 74 20 29 7b 0a 23 69  ur->atLast ){.#i
252b0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
252c0 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c  G.    /* This bl
252d0 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73  ock serves to as
252e0 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
252f0 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f  cursor really do
25300 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a  es point .    **
25310 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
25320 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ry in the b-tree
25330 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  . */.    int ii;
25340 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
25350 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  i<pCur->iPage; i
25360 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
25370 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
25380 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ii]==pCur->apPag
25390 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  e[ii]->nCell );.
253a0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
253b0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
253c0 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72  ur->iPage]==pCur
253d0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
253e0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29  Page]->nCell-1 )
253f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
25400 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
25410 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b  >iPage]->leaf );
25420 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
25430 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
25440 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  }..  rc = moveTo
25450 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
25460 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25470 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f  ){.    if( CURSO
25480 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
25490 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
254a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
254b0 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
254c0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
254d0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
254e0 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
254f0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
25500 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
25510 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
25520 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
25530 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
25540 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
25550 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
25560 20 20 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61        pCur->atLa
25570 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f  st = rc==SQLITE_
25580 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20  OK ?1:0;.    }. 
25590 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
255a0 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
255b0 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74  ursor so that it
255c0 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e   points to an en
255d0 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79  try near the key
255e0 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62   .** specified b
255f0 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74  y pIdxKey or int
25600 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20  Key.   Return a 
25610 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a  success code..**
25620 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74  .** For INTKEY t
25630 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65  ables, the intKe
25640 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75  y parameter is u
25650 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a  sed.  pIdxKey .*
25660 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20  * must be NULL. 
25670 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65   For index table
25680 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73  s, pIdxKey is us
25690 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a  ed and intKey.**
256a0 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a   is ignored..**.
256b0 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d  ** If an exact m
256c0 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e  atch is not foun
256d0 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  d, then the curs
256e0 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  or is always.** 
256f0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
25700 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69   a leaf page whi
25710 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68  ch would hold th
25720 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a  e entry if it.**
25730 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20   were present.  
25740 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74  The cursor might
25750 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74   point to an ent
25760 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a  ry that comes.**
25770 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72   before or after
25780 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20   the key..**.** 
25790 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72  An integer is wr
257a0 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73  itten into *pRes
257b0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65   which is the re
257c0 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61  sult of.** compa
257d0 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74  ring the key wit
257e0 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77  h the entry to w
257f0 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20  hich the cursor 
25800 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e  is .** pointing.
25810 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66    The meaning of
25820 20 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69   the integer wri
25830 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52  tten into.** *pR
25840 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  es is as follows
25850 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  :.**.**     *pRe
25860 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72  s<0      The cur
25870 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
25880 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
25890 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
258a0 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61            is sma
258b0 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  ller than intKey
258c0 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74  /pIdxKey or if t
258d0 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
258e0 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  y.**            
258f0 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75        and the cu
25900 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72  rsor is therefor
25910 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20  e left point to 
25920 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  nothing..**.**  
25930 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20     *pRes==0     
25940 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
25950 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
25960 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
25970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25980 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
25990 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e   intKey/pIdxKey.
259a0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
259b0 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  >0      The curs
259c0 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
259d0 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
259e0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
259f0 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67           is larg
25a00 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70  er than intKey/p
25a10 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e  IdxKey..**.*/.in
25a20 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  t sqlite3BtreeMo
25a30 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20  vetoUnpacked(.  
25a40 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
25a50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
25a60 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76  cursor to be mov
25a70 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ed */.  Unpacked
25a80 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c  Record *pIdxKey,
25a90 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
25aa0 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20  ex key */.  i64 
25ab0 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20  intKey,         
25ac0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
25ad0 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62  e key */.  int b
25ae0 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20  iasRight,       
25af0 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
25b00 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20  bias the search 
25b10 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20  to the high end 
25b20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20  */.  int *pRes  
25b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25b40 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
25b50 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
25b60 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
25b70 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
25b80 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
25b90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
25ba0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
25bb0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
25bc0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
25bd0 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73  t( pRes );.  ass
25be0 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30  ert( (pIdxKey==0
25bf0 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  )==(pCur->pKeyIn
25c00 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  fo==0) );..  /* 
25c10 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
25c20 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f   already positio
25c30 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74  ned at the point
25c40 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20   we are trying. 
25c50 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20   ** to move to, 
25c60 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
25c70 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
25c80 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28  ny work */.  if(
25c90 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
25ca0 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 70  URSOR_VALID && p
25cb0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 0a  Cur->validNKey .
25cc0 20 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61     && pCur->apPa
25cd0 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20  ge[0]->intKey . 
25ce0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
25cf0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74  ->info.nKey==int
25d00 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
25d10 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  es = 0;.      re
25d20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
25d30 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
25d40 75 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70 43  ur->atLast && pC
25d50 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e  ur->info.nKey<in
25d60 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70  tKey ){.      *p
25d70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Res = -1;.      
25d80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25d90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
25da0 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
25db0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
25dc0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
25dd0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
25de0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
25df0 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
25e00 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
25e10 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
25e20 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
25e30 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
25e40 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69  r->iPage]->isIni
25e50 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
25e60 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
25e70 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70  SOR_INVALID || p
25e80 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
25e90 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e  ->iPage]->nCell>
25ea0 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
25eb0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
25ec0 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a  INVALID ){.    *
25ed0 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61  pRes = -1;.    a
25ee0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
25ef0 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
25f00 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
25f10 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
25f20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
25f30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
25f40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
25f50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c  age[0]->intKey |
25f60 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66  | pIdxKey );.  f
25f70 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20  or(;;){.    int 
25f80 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 3b 0a 20  lwr, upr, idx;. 
25f90 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a     Pgno chldPg;.
25fa0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
25fb0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
25fc0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
25fd0 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20      int c;..    
25fe0 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  /* pPage->nCell 
25ff0 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72 20  must be greater 
26000 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68  than zero. If th
26010 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70  is is the root-p
26020 61 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  age.    ** the c
26030 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65  ursor would have
26040 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62   been INVALID ab
26050 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72  ove and this for
26060 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a  (;;) loop.    **
26070 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69   not run. If thi
26080 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f  s is not the roo
26090 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  t-page, then the
260a0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72   moveToChild() r
260b0 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f  outine.    ** wo
260c0 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
260d0 20 64 65 74 65 63 74 65 64 20 64 62 20 63 6f 72   detected db cor
260e0 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72  ruption. Similar
260f0 6c 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20  ly, pPage must. 
26100 20 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67     ** be the rig
26110 68 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f  ht kind (index o
26120 72 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72  r table) of b-tr
26130 65 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69  ee page. Otherwi
26140 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65  se.    ** a move
26150 54 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76  ToChild() or mov
26160 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77  eToRoot() call w
26170 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65 63 74  ould have detect
26180 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  ed corruption.  
26190 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
261a0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  Page->nCell>0 );
261b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
261c0 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64  ge->intKey==(pId
261d0 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20  xKey==0) );.    
261e0 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72  lwr = 0;.    upr
261f0 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d   = pPage->nCell-
26200 31 3b 0a 20 20 20 20 69 66 28 20 62 69 61 73 52  1;.    if( biasR
26210 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 43  ight ){.      pC
26220 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
26230 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28 69  iPage] = (u16)(i
26240 64 78 20 3d 20 75 70 72 29 3b 0a 20 20 20 20 7d  dx = upr);.    }
26250 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72  else{.      pCur
26260 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
26270 61 67 65 5d 20 3d 20 28 75 31 36 29 28 69 64 78  age] = (u16)(idx
26280 20 3d 20 28 75 70 72 2b 6c 77 72 29 2f 32 29 3b   = (upr+lwr)/2);
26290 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 3b  .    }.    for(;
262a0 3b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43  ;){.      u8 *pC
262b0 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
262c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
262d0 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72   Pointer to curr
262e0 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67  ent cell in pPag
262f0 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65  e */..      asse
26300 72 74 28 20 69 64 78 3d 3d 70 43 75 72 2d 3e 61  rt( idx==pCur->a
26310 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
26320 5d 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  ] );.      pCur-
26330 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
26340 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66  .      pCell = f
26350 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
26360 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  dx) + pPage->chi
26370 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20  ldPtrSize;.     
26380 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
26390 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36  ey ){.        i6
263a0 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  4 nCellKey;.    
263b0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
263c0 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  asData ){.      
263d0 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
263e0 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b           pCell +
263f0 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 43  = getVarint32(pC
26400 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20  ell, dummy);.   
26410 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
26420 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20  etVarint(pCell, 
26430 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29  (u64*)&nCellKey)
26440 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
26450 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29  ellKey==intKey )
26460 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  {.          c = 
26470 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
26480 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e   if( nCellKey<in
26490 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
264a0 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    c = -1;.      
264b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
264c0 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
264d0 4b 65 79 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20  Key>intKey );.  
264e0 20 20 20 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a          c = +1;.
264f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26500 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
26510 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  y = 1;.        p
26520 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d  Cur->info.nKey =
26530 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
26540 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26550 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73  /* The maximum s
26560 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69  upported page-si
26570 7a 65 20 69 73 20 36 35 35 33 36 20 62 79 74 65  ze is 65536 byte
26580 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  s. This means th
26590 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  at.        ** th
265a0 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
265b0 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65 73   of record bytes
265c0 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e   stored on an in
265d0 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20  dex B-Tree.     
265e0 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c 65     ** page is le
265f0 73 73 20 74 68 61 6e 20 31 36 33 38 34 20 62 79  ss than 16384 by
26600 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20 73  tes and may be s
26610 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79 74  tored as a 2-byt
26620 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72  e.        ** var
26630 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d  int. This inform
26640 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
26650 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69   attempt to avoi
26660 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20  d parsing .     
26670 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
26680 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e   cell by checkin
26690 67 20 66 6f 72 20 74 68 65 20 63 61 73 65 73 20  g for the cases 
266a0 77 68 65 72 65 20 74 68 65 20 72 65 63 6f 72 64  where the record
266b0 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   is .        ** 
266c0 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20  stored entirely 
266d0 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65  within the b-tre
266e0 65 20 70 61 67 65 20 62 79 20 69 6e 73 70 65 63  e page by inspec
266f0 74 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a  ting the first .
26700 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74          ** 2 byt
26710 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a  es of the cell..
26720 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
26730 20 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70     int nCell = p
26740 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20  Cell[0];.       
26750 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67   if( nCell<=pPag
26760 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  e->max1bytePaylo
26770 61 64 0a 20 20 20 20 20 20 20 20 20 2f 2a 20 26  ad.         /* &
26780 26 20 28 70 43 65 6c 6c 2b 6e 43 65 6c 6c 29 3c  & (pCell+nCell)<
26790 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
267a0 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  */.        ){.  
267b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
267c0 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74  branch runs if t
267d0 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66  he record-size f
267e0 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c  ield of the cell
267f0 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20 20   is a.          
26800 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76  ** single byte v
26810 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65  arint and the re
26820 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72 65  cord fits entire
26830 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20  ly on the main. 
26840 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72           ** b-tr
26850 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  ee page.  */.   
26860 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
26870 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d   pCell+nCell+1==
26880 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
26890 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
268a0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
268b0 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
268c0 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31   (void*)&pCell[1
268d0 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  ], pIdxKey);.   
268e0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
268f0 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30  (pCell[1] & 0x80
26900 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  ) .          && 
26910 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c  (nCell = ((nCell
26920 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43 65  &0x7f)<<7) + pCe
26930 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d  ll[1])<=pPage->m
26940 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20  axLocal.        
26950 20 20 2f 2a 20 26 26 20 28 70 43 65 6c 6c 2b 6e    /* && (pCell+n
26960 43 65 6c 6c 2b 32 29 3c 3d 70 50 61 67 65 2d 3e  Cell+2)<=pPage->
26970 61 44 61 74 61 45 6e 64 20 2a 2f 0a 20 20 20 20  aDataEnd */.    
26980 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
26990 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73   /* The record-s
269a0 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20 32  ize field is a 2
269b0 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64   byte varint and
269c0 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20   the record .   
269d0 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65         ** fits e
269e0 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d  ntirely on the m
269f0 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e  ain b-tree page.
26a00 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74    */.          t
26a10 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e  estcase( pCell+n
26a20 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61  Cell+2==pPage->a
26a30 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20  DataEnd );.     
26a40 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33       c = sqlite3
26a50 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
26a60 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29  e(nCell, (void*)
26a70 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b  &pCell[2], pIdxK
26a80 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ey);.        }el
26a90 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
26aa0 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77   The record flow
26ab0 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20  s over onto one 
26ac0 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77  or more overflow
26ad0 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20   pages. In.     
26ae0 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73       ** this cas
26af0 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c  e the whole cell
26b00 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61 72   needs to be par
26b10 73 65 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c  sed, a buffer al
26b20 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20 20  located.        
26b30 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50    ** and accessP
26b40 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f  ayload() used to
26b50 20 72 65 74 72 69 65 76 65 20 74 68 65 20 72 65   retrieve the re
26b60 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20  cord into the.  
26b70 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65          ** buffe
26b80 72 20 62 65 66 6f 72 65 20 56 64 62 65 52 65 63  r before VdbeRec
26b90 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e  ordCompare() can
26ba0 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20   be called. */. 
26bb0 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70           void *p
26bc0 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
26bd0 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43     u8 * const pC
26be0 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20  ellBody = pCell 
26bf0 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  - pPage->childPt
26c00 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20  rSize;.         
26c10 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
26c20 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42  tr(pPage, pCellB
26c30 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  ody, &pCur->info
26c40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65  );.          nCe
26c50 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e  ll = (int)pCur->
26c60 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20  info.nKey;.     
26c70 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20       pCellKey = 
26c80 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e  sqlite3Malloc( n
26c90 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  Cell );.        
26ca0 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d    if( pCellKey==
26cb0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
26cc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
26cd0 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EM;.            
26ce0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
26cf0 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
26d00 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 61            rc = a
26d10 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
26d20 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e  r, 0, nCell, (un
26d30 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65  signed char*)pCe
26d40 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20  llKey, 0);.     
26d50 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
26d60 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
26d70 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
26d80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
26d90 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
26da0 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
26db0 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c           c = sql
26dc0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
26dd0 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65  mpare(nCell, pCe
26de0 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b  llKey, pIdxKey);
26df0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
26e00 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
26e10 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
26e20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
26e30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
26e40 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
26e50 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
26e60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
26e70 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20  r = idx;.       
26e80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
26e90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26ea0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
26eb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
26ec0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
26ed0 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
26ee0 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nish;.        }.
26ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
26f00 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c<0 ){.       
26f10 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20   lwr = idx+1;.  
26f20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26f30 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a     upr = idx-1;.
26f40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
26f50 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20 20  ( lwr>upr ){.   
26f60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26f70 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
26f80 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
26f90 65 5d 20 3d 20 28 75 31 36 29 28 69 64 78 20 3d  e] = (u16)(idx =
26fa0 20 28 6c 77 72 2b 75 70 72 29 2f 32 29 3b 0a 20   (lwr+upr)/2);. 
26fb0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
26fc0 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28   lwr==upr+1 || (
26fd0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
26fe0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29   !pPage->leaf) )
26ff0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
27000 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
27010 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
27020 61 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64  af ){.      chld
27030 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  Pg = 0;.    }els
27040 65 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65  e if( lwr>=pPage
27050 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ->nCell ){.     
27060 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79   chldPg = get4by
27070 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
27080 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
27090 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t+8]);.    }else
270a0 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
270b0 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
270c0 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b  ll(pPage, lwr));
270d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
270e0 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  hldPg==0 ){.    
270f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27100 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
27110 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
27120 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
27130 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ell );.      *pR
27140 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63  es = c;.      rc
27150 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
27160 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
27170 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20  finish;.    }.  
27180 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
27190 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
271a0 36 29 6c 77 72 3b 0a 20 20 20 20 70 43 75 72 2d  6)lwr;.    pCur-
271b0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
271c0 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
271d0 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 72 63  NKey = 0;.    rc
271e0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
271f0 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20  Cur, chldPg);.  
27200 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
27210 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
27220 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68   }.moveto_finish
27230 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
27240 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
27250 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73  TRUE if the curs
27260 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
27270 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f  ng at an entry o
27280 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  f the table..**.
27290 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20  ** TRUE will be 
272a0 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61  returned after a
272b0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
272c0 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65  BtreeNext() move
272d0 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61  s.** past the la
272e0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
272f0 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33  table or sqlite3
27300 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65  BtreePrev() move
27310 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69  s past.** the fi
27320 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45  rst entry.  TRUE
27330 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
27340 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  d if the table i
27350 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
27360 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28  sqlite3BtreeEof(
27370 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
27380 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74  .  /* TODO: What
27390 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
273a0 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55  s in CURSOR_REQU
273b0 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20  IRESEEK but all 
273c0 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20  table entries.  
273d0 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c  ** have been del
273e0 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77  eted? This API w
273f0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e  ill need to chan
27400 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ge to return an 
27410 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20  error code.  ** 
27420 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62  as well as the b
27430 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61  oolean result va
27440 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  lue..  */.  retu
27450 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44  rn (CURSOR_VALID
27460 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b  !=pCur->eState);
27470 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
27480 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
27490 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69  the next entry i
274a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
274b0 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   If.** successfu
274c0 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  l then set *pRes
274d0 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  =0.  If the curs
274e0 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64  or.** was alread
274f0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
27500 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
27510 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
27520 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ore.** this rout
27530 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ine was called, 
27540 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31  then set *pRes=1
27550 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
27560 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73  BtreeNext(BtCurs
27570 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
27580 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
27590 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d    int idx;.  Mem
275a0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
275b0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
275c0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
275d0 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
275e0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
275f0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Cur);.  if( rc!=
27600 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27610 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
27620 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d    assert( pRes!=
27630 30 20 29 3b 0a 20 20 69 66 28 20 43 55 52 53 4f  0 );.  if( CURSO
27640 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
27650 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a  >eState ){.    *
27660 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65  pRes = 1;.    re
27670 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27680 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
27690 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20  skipNext>0 ){.  
276a0 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
276b0 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20   = 0;.    *pRes 
276c0 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
276d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
276e0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
276f0 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20  = 0;..  pPage = 
27700 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
27710 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78  r->iPage];.  idx
27720 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78   = ++pCur->aiIdx
27730 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
27740 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
27750 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20  isInit );..  /* 
27760 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
27770 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c  file is corrupt,
27780 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
27790 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66  for the value of
277a0 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65   idx .  ** to be
277b0 20 69 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54   invalid here. T
277c0 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63  his can only occ
277d0 75 72 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63  ur if a second c
277e0 75 72 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20  ursor modifies. 
277f0 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77 68 69   ** the page whi
27800 6c 65 20 63 75 72 73 6f 72 20 70 43 75 72 20 69  le cursor pCur i
27810 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65  s holding a refe
27820 72 65 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69  rence to it. Whi
27830 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79  ch can.  ** only
27840 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 64   happen if the d
27850 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75  atabase is corru
27860 70 74 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  pt in such a way
27870 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a   as to link the.
27880 20 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d    ** page into m
27890 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74  ore than one b-t
278a0 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a  ree structure. *
278b0 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 64  /.  testcase( id
278c0 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x>pPage->nCell )
278d0 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ;..  pCur->info.
278e0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
278f0 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
27900 3b 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61  ;.  if( idx>=pPa
27910 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
27920 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
27930 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
27940 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
27950 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
27960 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
27970 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a  hdrOffset+8]));.
27980 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
27990 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
279a0 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
279b0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ost(pCur);.     
279c0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
279d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
279e0 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20   }.    do{.     
279f0 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
27a00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ==0 ){.        *
27a10 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
27a20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
27a30 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
27a40 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
27a50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
27a60 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
27a70 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
27a80 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
27a90 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
27aa0 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65  age];.    }while
27ab0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
27ac0 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67  ur->iPage]>=pPag
27ad0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
27ae0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69  *pRes = 0;.    i
27af0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
27b00 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
27b10 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
27b20 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20  pCur, pRes);.   
27b30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
27b40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
27b50 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
27b60 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d  c;.  }.  *pRes =
27b70 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   0;.  if( pPage-
27b80 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74  >leaf ){.    ret
27b90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
27ba0 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f   }.  rc = moveTo
27bb0 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
27bc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
27bd0 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20  ./*.** Step the 
27be0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61  cursor to the ba
27bf0 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  ck to the previo
27c00 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  us entry in the 
27c10 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a  database.  If.**
27c20 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e   successful then
27c30 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49   set *pRes=0.  I
27c40 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  f the cursor.** 
27c50 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  was already poin
27c60 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73  ting to the firs
27c70 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
27c80 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
27c90 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
27ca0 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
27cb0 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a  set *pRes=1..*/.
27cc0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
27cd0 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f  Previous(BtCurso
27ce0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
27cf0 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
27d00 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
27d10 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
27d20 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
27d30 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
27d40 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
27d50 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
27d60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
27d70 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
27d80 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61    }.  pCur->atLa
27d90 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 43 55  st = 0;.  if( CU
27da0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
27db0 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
27dc0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
27dd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27de0 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  K;.  }.  if( pCu
27df0 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b  r->skipNext<0 ){
27e00 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e  .    pCur->skipN
27e10 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52  ext = 0;.    *pR
27e20 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
27e30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
27e40 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  }.  pCur->skipNe
27e50 78 74 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65  xt = 0;..  pPage
27e60 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
27e70 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
27e80 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
27e90 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21  sInit );.  if( !
27ea0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
27eb0 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75     int idx = pCu
27ec0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
27ed0 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20  Page];.    rc = 
27ee0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
27ef0 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  , get4byte(findC
27f00 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29  ell(pPage, idx))
27f10 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
27f20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
27f30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
27f40 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
27f50 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pCur);.  }else{
27f60 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72  .    while( pCur
27f70 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
27f80 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  age]==0 ){.     
27f90 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
27fa0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
27fb0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
27fc0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
27fd0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
27fe0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
27ff0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
28000 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
28010 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
28020 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66   }.    pCur->inf
28030 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
28040 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
28050 20 3d 20 30 3b 0a 0a 20 20 20 20 70 43 75 72 2d   = 0;..    pCur-
28060 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
28070 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65  ge]--;.    pPage
28080 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
28090 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
280a0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
280b0 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  Key && !pPage->l
280c0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
280d0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  = sqlite3BtreePr
280e0 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65  evious(pCur, pRe
280f0 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
28100 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
28110 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
28120 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65   *pRes = 0;.  re
28130 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
28140 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
28150 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
28160 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
28170 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65  .** The new page
28180 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69   is marked as di
28190 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20  rty.  (In other 
281a0 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61  words, sqlite3Pa
281b0 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61  gerWrite().** ha
281c0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
281d0 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77  alled on the new
281e0 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77   page.)  The new
281f0 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a   page has also.*
28200 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65  * been reference
28210 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e  d and the callin
28220 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73  g routine is res
28230 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c  ponsible for cal
28240 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ling.** sqlite3P
28250 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74  agerUnref() on t
28260 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e  he new page when
28270 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a   it is done..**.
28280 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
28290 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
282a0 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20  ess.  Any other 
282b0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64  return value ind
282c0 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72  icates.** an err
282d0 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64  or.  *ppPage and
282e0 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65   *pPgno are unde
282f0 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65  fined in the eve
28300 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a  nt of an error..
28310 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65  ** Do not invoke
28320 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
28330 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20  ef() on *ppPage 
28340 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  if an error is r
28350 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
28360 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70  f the "nearby" p
28370 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
28380 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72  0, then an effor
28390 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a  t is made to .**
283a0 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63   locate a page c
283b0 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65  lose to the page
283c0 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22   number "nearby"
283d0 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  .  This can be u
283e0 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74  sed in an.** att
283f0 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c  empt to keep rel
28400 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65  ated pages close
28410 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69   to each other i
28420 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
28430 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e  ile,.** which in
28440 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64   turn can make d
28450 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66  atabase access f
28460 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aster..**.** If 
28470 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65  the eMode parame
28480 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45  ter is BTALLOC_E
28490 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61  XACT and the nea
284a0 72 62 79 20 70 61 67 65 20 65 78 69 73 74 73 0a  rby page exists.
284b0 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  ** anywhere on t
284c0 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
284d0 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  en it is guarant
284e0 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e  eed to be return
284f0 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65  ed.  If.** eMode
28500 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74   is BTALLOC_LT t
28510 68 65 6e 20 74 68 65 20 70 61 67 65 20 72 65 74  hen the page ret
28520 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65  urned will be le
28530 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
28540 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66  .** to nearby if
28550 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 20 65   any such page e
28560 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65  xists.  If eMode
28570 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20   is BTALLOC_ANY 
28580 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72  then there.** ar
28590 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e  e no restriction
285a0 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20  s on which page 
285b0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
285c0 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
285d0 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20  ateBtreePage(.  
285e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
285f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
28600 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
28610 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
28620 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72  /* Store pointer
28630 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   to the allocate
28640 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  d page here */. 
28650 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20   Pgno *pPgno,   
28660 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
28670 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
28680 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   here */.  Pgno 
28690 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20 20 20  nearby,         
286a0 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
286b0 61 20 70 61 67 65 20 6e 65 61 72 20 74 68 69 73  a page near this
286c0 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f   one */.  u8 eMo
286d0 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  de              
286e0 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43   /* BTALLOC_EXAC
286f0 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f  T, BTALLOC_LT, o
28700 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f  r BTALLOC_ANY */
28710 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
28720 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b  Page1;.  int rc;
28730 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a  .  u32 n;     /*
28740 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
28750 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
28760 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20   */.  u32 k;    
28770 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
28780 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e  aves on the trun
28790 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  k of the freelis
287a0 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
287b0 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65  pTrunk = 0;.  Me
287c0 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e  mPage *pPrevTrun
287d0 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78  k = 0;.  Pgno mx
287e0 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74  Page;     /* Tot
287f0 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  al size of the d
28800 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
28810 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
28820 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
28830 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
28840 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54  ssert( eMode==BT
28850 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65  ALLOC_ANY || (ne
28860 61 72 62 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f  arby>0 && IfNotO
28870 6d 69 74 41 56 28 70 42 74 2d 3e 61 75 74 6f 56  mitAV(pBt->autoV
28880 61 63 75 75 6d 29 29 20 29 3b 0a 20 20 70 50 61  acuum)) );.  pPa
28890 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
288a0 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74  1;.  mxPage = bt
288b0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
288c0 29 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74  );.  n = get4byt
288d0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
288e0 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73  [36]);.  testcas
288f0 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29  e( n==mxPage-1 )
28900 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67  ;.  if( n>=mxPag
28910 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
28920 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
28930 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  KPT;.  }.  if( n
28940 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  >0 ){.    /* The
28950 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20  re are pages on 
28960 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52  the freelist.  R
28970 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73  euse one of thos
28980 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20  e pages. */.    
28990 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20  Pgno iTrunk;.   
289a0 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d   u8 searchList =
289b0 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72   0; /* If the fr
289c0 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20  ee-list must be 
289d0 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65  searched for 'ne
289e0 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20  arby' */.    .  
289f0 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42    /* If eMode==B
28a00 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64  TALLOC_EXACT and
28a10 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20   a query of the 
28a20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
28a30 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68  ** shows that th
28a40 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
28a50 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20  is somewhere on 
28a60 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
28a70 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65  hen.    ** the e
28a80 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20  ntire-list will 
28a90 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
28aa0 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  that page..    *
28ab0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
28ac0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
28ad0 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d  .    if( eMode==
28ae0 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b  BTALLOC_EXACT ){
28af0 0a 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62  .      if( nearb
28b00 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  y<=mxPage ){.   
28b10 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20       u8 eType;. 
28b20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
28b30 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20  earby>0 );.     
28b40 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
28b50 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
28b60 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
28b70 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79  pGet(pBt, nearby
28b80 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20  , &eType, 0);.  
28b90 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
28ba0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
28bb0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
28bc0 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
28bd0 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68            search
28be0 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  List = 1;.      
28bf0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
28c00 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65 3d  }else if( eMode=
28c10 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20  =BTALLOC_LE ){. 
28c20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
28c30 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
28c40 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  f..    /* Decrem
28c50 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73  ent the free-lis
28c60 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65  t count by 1. Se
28c70 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20  t iTrunk to the 
28c80 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20  index of the.   
28c90 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c   ** first free-l
28ca0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
28cb0 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e  iPrevTrunk is in
28cc0 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a  itially 1..    *
28cd0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
28ce0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
28cf0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
28d00 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
28d10 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62  rn rc;.    put4b
28d20 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
28d30 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20  ta[36], n-1);.. 
28d40 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77     /* The code w
28d50 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20  ithin this loop 
28d60 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65  is run only once
28d70 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c   if the 'searchL
28d80 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20  ist' variable.  
28d90 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65    ** is not true
28da0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
28db0 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61  runs once for ea
28dc0 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e  ch trunk-page on
28dd0 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65   the.    ** free
28de0 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20  -list until the 
28df0 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73  page 'nearby' is
28e00 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d   located (eMode=
28e10 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a  =BTALLOC_EXACT).
28e20 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20      ** or until 
28e30 61 20 70 61 67 65 20 6c 65 73 73 20 74 68 61 6e  a page less than
28e40 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
28e50 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41  ated (eMode==BTA
28e60 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a  LLOC_LT).    */.
28e70 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70      do {.      p
28e80 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75  PrevTrunk = pTru
28e90 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  nk;.      if( pP
28ea0 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
28eb0 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
28ec0 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
28ed0 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  k->aData[0]);.  
28ee0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28ef0 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
28f00 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
28f10 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20  ata[32]);.      
28f20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
28f30 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  ( iTrunk==mxPage
28f40 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54   );.      if( iT
28f50 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a 20  runk>mxPage ){. 
28f60 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
28f70 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
28f80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
28f90 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
28fa0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72  GetPage(pBt, iTr
28fb0 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 2c  unk, &pTrunk, 0,
28fc0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
28fd0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
28fe0 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
28ff0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
29000 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
29010 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
29020 73 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30  ssert( pTrunk!=0
29030 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
29040 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21  ( pTrunk->aData!
29050 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 6b 20 3d  =0 );..      k =
29060 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
29070 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 20 2f 2a  k->aData[4]); /*
29080 20 23 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20   # of leaves on 
29090 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
290a0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  */.      if( k==
290b0 30 20 26 26 20 21 73 65 61 72 63 68 4c 69 73 74  0 && !searchList
290c0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
290d0 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20  he trunk has no 
290e0 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c  leaves and the l
290f0 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67  ist is not being
29100 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20   searched. .    
29110 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63      ** So extrac
29120 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  t the trunk page
29130 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20   itself and use 
29140 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20  it as the newly 
29150 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  .        ** allo
29160 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20  cated page */.  
29170 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
29180 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20  revTrunk==0 );. 
29190 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
291a0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
291b0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
291c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
291d0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
291e0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
291f0 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
29200 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
29210 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d  Trunk;.        m
29220 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
29230 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
29240 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
29250 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
29260 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
29270 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
29280 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
29290 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e  LLOCATE: %d trun
292a0 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65  k - %d free page
292b0 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e  s left\n", *pPgn
292c0 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20  o, n-1));.      
292d0 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32  }else if( k>(u32
292e0 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  )(pBt->usableSiz
292f0 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20  e/4 - 2) ){.    
29300 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
29310 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67  k is out of rang
29320 65 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72  e.  Database cor
29330 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ruption */.     
29340 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
29350 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
29360 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
29370 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66  locate_page;.#if
29380 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
29390 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
293a0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72    }else if( sear
293b0 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20  chList .        
293c0 20 20 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d      && (nearby==
293d0 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e  iTrunk || (iTrun
293e0 6b 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64  k<nearby && eMod
293f0 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20  e==BTALLOC_LE)) 
29400 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
29410 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73    /* The list is
29420 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20   being searched 
29430 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70  and this trunk p
29440 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a  age is the page.
29450 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c          ** to al
29460 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65  locate, regardle
29470 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74  ss of whether it
29480 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20   has leaves..   
29490 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
294a0 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b  *pPgno = iTrunk;
294b0 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
294c0 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
294d0 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
294e0 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
294f0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
29500 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
29510 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
29520 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
29530 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
29540 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
29550 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d  }.        if( k=
29560 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
29570 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
29580 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
29590 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
295a0 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
295b0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
295c0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
295d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
295e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
295f0 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d  rite(pPrevTrunk-
29600 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
29610 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
29620 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29630 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
29640 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
29650 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
29660 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
29670 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  py(&pPrevTrunk->
29680 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
29690 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
296a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
296b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
296c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
296d0 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69  nk page is requi
296e0 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  red by the calle
296f0 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e  r but it contain
29700 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
29710 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65  pointers to free
29720 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68  -list leaves. Th
29730 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63  e first leaf bec
29740 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20  omes a trunk.   
29750 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
29760 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20  n this case..   
29770 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
29780 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
29790 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  wTrunk;.        
297a0 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b    Pgno iNewTrunk
297b0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
297c0 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a  unk->aData[8]);.
297d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e            if( iN
297e0 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29  ewTrunk>mxPage )
297f0 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  { .            r
29800 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
29810 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
29820 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
29830 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
29840 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29850 20 20 20 74 65 73 74 63 61 73 65 28 20 69 4e 65     testcase( iNe
29860 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29  wTrunk==mxPage )
29870 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
29880 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
29890 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70  t, iNewTrunk, &p
298a0 4e 65 77 54 72 75 6e 6b 2c 20 30 2c 20 30 29 3b  NewTrunk, 0, 0);
298b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
298c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
298d0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
298e0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
298f0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
29900 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
29910 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
29920 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50  (pNewTrunk->pDbP
29930 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
29940 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29950 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
29960 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
29970 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
29980 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
29990 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
299a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
299b0 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54     memcpy(&pNewT
299c0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
299d0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
299e0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
299f0 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54   put4byte(&pNewT
29a00 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
29a10 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
29a20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
29a30 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54  k->aData[8], &pT
29a40 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c  runk->aData[12],
29a50 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20   (k-1)*4);.     
29a60 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
29a70 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
29a80 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65         if( !pPre
29a90 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
29aa0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
29ab0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
29ac0 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44  eable(pPage1->pD
29ad0 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20  bPage) );.      
29ae0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
29af0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
29b00 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
29b10 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
29b20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
29b30 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
29b40 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
29b50 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
29b60 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
29b70 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
29b80 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
29b90 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  age;.           
29ba0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
29bb0 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  ut4byte(&pPrevTr
29bc0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69  unk->aData[0], i
29bd0 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
29be0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
29bf0 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
29c00 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
29c10 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
29c20 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
29c30 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
29c40 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
29c50 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
29c60 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20  se if( k>0 ){.  
29c70 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74        /* Extract
29c80 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65   a leaf from the
29c90 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20   trunk */.      
29ca0 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20    u32 closest;. 
29cb0 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67         Pgno iPag
29cc0 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67  e;.        unsig
29cd0 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20  ned char *aData 
29ce0 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b  = pTrunk->aData;
29cf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61  .        if( nea
29d00 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  rby>0 ){.       
29d10 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20     u32 i;.      
29d20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
29d30 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
29d40 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
29d50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
29d60 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b  for(i=0; i<k; i+
29d70 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
29d80 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
29d90 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d  te(&aData[8+i*4]
29da0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
29db0 20 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61 72   if( iPage<=near
29dc0 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  by ){.          
29dd0 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
29de0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i;.             
29df0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
29e00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29e10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29e20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29e30 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20       int dist;. 
29e40 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20             dist 
29e50 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33  = sqlite3AbsInt3
29e60 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74  2(get4byte(&aDat
29e70 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b  a[8]) - nearby);
29e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
29e90 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=1; i<k; i++){
29ea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
29eb0 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41  nt d2 = sqlite3A
29ec0 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65  bsInt32(get4byte
29ed0 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20  (&aData[8+i*4]) 
29ee0 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20  - nearby);.     
29ef0 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c           if( d2<
29f00 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  dist ){.        
29f10 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
29f20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = i;.           
29f30 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a       dist = d2;.
29f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
29f50 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
29f60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29f70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29f80 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
29f90 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
29fa0 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
29fb0 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  yte(&aData[8+clo
29fc0 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20  sest*4]);.      
29fd0 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67    testcase( iPag
29fe0 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  e==mxPage );.   
29ff0 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d       if( iPage>m
2a000 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
2a010 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2a020 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2a030 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2a040 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2a050 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a060 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65   testcase( iPage
2a070 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
2a080 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c      if( !searchL
2a090 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ist .         ||
2a0a0 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20   (iPage==nearby 
2a0b0 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79  || (iPage<nearby
2a0c0 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c   && eMode==BTALL
2a0d0 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20  OC_LE)) .       
2a0e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
2a0f0 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20  t noContent;.   
2a100 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
2a110 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  iPage;.         
2a120 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
2a130 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25  E: %d was leaf %
2a140 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b  d of %d on trunk
2a150 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20   %d".           
2a160 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65        ": %d more
2a170 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a   free pages\n",.
2a180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a190 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74   *pPgno, closest
2a1a0 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70  +1, k, pTrunk->p
2a1b0 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
2a1c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2a1d0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
2a1e0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2a1f0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
2a200 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63  ) goto end_alloc
2a210 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2a220 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c      if( closest<
2a230 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  k-1 ){.         
2a240 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61     memcpy(&aData
2a250 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26  [8+closest*4], &
2a260 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29  aData[4+k*4], 4)
2a270 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2a280 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
2a290 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  (&aData[4], k-1)
2a2a0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f  ;.          noCo
2a2b0 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65  ntent = !btreeGe
2a2c0 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c  tHasContent(pBt,
2a2d0 20 2a 70 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20   *pPgno);.      
2a2e0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
2a2f0 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  tPage(pBt, *pPgn
2a300 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e  o, ppPage, noCon
2a310 74 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  tent, 0);.      
2a320 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2a330 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2a340 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2a350 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
2a360 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
2a370 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2a380 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2a390 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2a3a0 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
2a3b0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2a3c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
2a3d0 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68            search
2a3e0 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
2a3f0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2a400 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2a410 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  revTrunk);.     
2a420 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b   pPrevTrunk = 0;
2a430 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61  .    }while( sea
2a440 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  rchList );.  }el
2a450 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65  se{.    /* There
2a460 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e   are no pages on
2a470 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73   the freelist, s
2a480 6f 20 61 70 70 65 6e 64 20 61 20 6e 65 77 20 70  o append a new p
2a490 61 67 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  age to the.    *
2a4a0 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  * database image
2a4b0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2a4c0 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61  Normally, new pa
2a4d0 67 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  ges allocated by
2a4e0 20 74 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20   this block can 
2a4f0 62 65 20 72 65 71 75 65 73 74 65 64 20 66 72 6f  be requested fro
2a500 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  m the.    ** pag
2a510 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68  er layer with th
2a520 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66  e 'no-content' f
2a530 6c 61 67 20 73 65 74 2e 20 54 68 69 73 20 70 72  lag set. This pr
2a540 65 76 65 6e 74 73 20 74 68 65 20 70 61 67 65 72  events the pager
2a550 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79  .    ** from try
2a560 69 6e 67 20 74 6f 20 72 65 61 64 20 74 68 65 20  ing to read the 
2a570 70 61 67 65 73 20 63 6f 6e 74 65 6e 74 20 66 72  pages content fr
2a580 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76 65 72  om disk. However
2a590 2c 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  , if the.    ** 
2a5a0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
2a5b0 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
2a5c0 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  run one or more 
2a5d0 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
2a5e0 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70 73 2c  um.    ** steps,
2a5f0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 77   then the page w
2a600 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 61  e are about to a
2a610 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e 74  llocate may cont
2a620 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20  ain content.    
2a630 2a 2a 20 74 68 61 74 20 69 73 20 72 65 71 75 69  ** that is requi
2a640 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  red in the event
2a650 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20   of a rollback. 
2a660 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 64 6f  In this case, do
2a670 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20  .    ** not set 
2a680 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66  the no-content f
2a690 6c 61 67 2e 20 54 68 69 73 20 63 61 75 73 65 73  lag. This causes
2a6a0 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 6c 6f   the pager to lo
2a6b0 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20  ad and journal. 
2a6c0 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
2a6d0 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 62  t page content b
2a6e0 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e  efore overwritin
2a6f0 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  g it..    **.   
2a700 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
2a710 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74  e pager will not
2a720 20 61 63 74 75 61 6c 6c 79 20 61 74 74 65 6d 70   actually attemp
2a730 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75  t to load or jou
2a740 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e  rnal .    ** con
2a750 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 70 61 67  tent for any pag
2a760 65 20 74 68 61 74 20 72 65 61 6c 6c 79 20 64 6f  e that really do
2a770 65 73 20 6c 69 65 20 70 61 73 74 20 74 68 65 20  es lie past the 
2a780 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62  end of the datab
2a790 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ase.    ** file 
2a7a0 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68 65 20  on disk. So the 
2a7b0 65 66 66 65 63 74 73 20 6f 66 20 64 69 73 61 62  effects of disab
2a7c0 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74  ling the no-cont
2a7d0 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ent optimization
2a7e0 0a 20 20 20 20 2a 2a 20 68 65 72 65 20 61 72 65  .    ** here are
2a7f0 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f   confined to tho
2a800 73 65 20 70 61 67 65 73 20 74 68 61 74 20 6c 69  se pages that li
2a810 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 65 6e  e between the en
2a820 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
2a830 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 61  database image a
2a840 6e 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  nd the end of th
2a850 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2a860 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
2a870 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d  bNoContent = (0=
2a880 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74  =IfNotOmitAV(pBt
2a890 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 29 3b  ->bDoTruncate));
2a8a0 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
2a8b0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
2a8c0 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
2a8d0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
2a8e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2a8f0 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  pBt->nPage++;.  
2a900 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
2a910 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
2a920 41 47 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e  AGE(pBt) ) pBt->
2a930 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65  nPage++;..#ifnde
2a940 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2a950 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
2a960 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
2a970 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47   && PTRMAP_ISPAG
2a980 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67  E(pBt, pBt->nPag
2a990 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  e) ){.      /* I
2a9a0 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20  f *pPgno refers 
2a9b0 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  to a pointer-map
2a9c0 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20   page, allocate 
2a9d0 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20  two new pages.  
2a9e0 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e      ** at the en
2a9f0 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  d of the file in
2aa00 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68  stead of one. Th
2aa10 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65  e first allocate
2aa20 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  d page.      ** 
2aa30 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f  becomes a new po
2aa40 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
2aa50 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73  the second is us
2aa60 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
2aa70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2aa80 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20   MemPage *pPg = 
2aa90 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  0;.      TRACE((
2aaa0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
2aab0 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28  om end of file (
2aac0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
2aad0 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65  )\n", pBt->nPage
2aae0 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ));.      assert
2aaf0 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45  ( pBt->nPage!=PE
2ab00 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2ab10 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63  pBt) );.      rc
2ab20 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2ab30 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c  pBt, pBt->nPage,
2ab40 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e   &pPg, bNoConten
2ab50 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 0);.      if(
2ab60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2ab70 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
2ab80 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2ab90 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pPg->pDbPage);.
2aba0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2abb0 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
2abc0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
2abd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2abe0 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a    pBt->nPage++;.
2abf0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
2ac00 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
2ac10 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20  TE_PAGE(pBt) ){ 
2ac20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a  pBt->nPage++; }.
2ac30 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2ac40 20 70 75 74 34 62 79 74 65 28 32 38 20 2b 20 28   put4byte(28 + (
2ac50 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d  u8*)pBt->pPage1-
2ac60 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61  >aData, pBt->nPa
2ac70 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20  ge);.    *pPgno 
2ac80 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20  = pBt->nPage;.. 
2ac90 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
2aca0 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
2acb0 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
2acc0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
2acd0 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
2ace0 70 70 50 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65  ppPage, bNoConte
2acf0 6e 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  nt, 0);.    if( 
2ad00 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2ad10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2ad20 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
2ad30 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
2ad40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2ad50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2ad60 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
2ad70 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ge);.    }.    T
2ad80 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
2ad90 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
2ada0 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  file\n", *pPgno)
2adb0 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
2adc0 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
2add0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2ade0 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74   );..end_allocat
2adf0 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73  e_page:.  releas
2ae00 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
2ae10 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
2ae20 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20  evTrunk);.  if( 
2ae30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2ae40 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2ae50 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
2ae60 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  t((*ppPage)->pDb
2ae70 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20  Page)>1 ){.     
2ae80 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
2ae90 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Page);.      ret
2aea0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2aeb0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
2aec0 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73     (*ppPage)->is
2aed0 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Init = 0;.  }els
2aee0 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  e{.    *ppPage =
2aef0 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
2af00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2af10 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
2af20 73 77 72 69 74 65 61 62 6c 65 28 28 2a 70 70 50  swriteable((*ppP
2af30 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 20 29  age)->pDbPage) )
2af40 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2af50 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2af60 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
2af70 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20   add page iPage 
2af80 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2af90 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20  file free-list. 
2afa0 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65  .** It is assume
2afb0 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  d that the page 
2afc0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
2afd0 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65   part of the fre
2afe0 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  e-list..**.** Th
2aff0 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  e value passed a
2b000 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
2b010 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
2b020 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e  nction is option
2b030 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61  al..** If the ca
2b040 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20  ller happens to 
2b050 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74  have a pointer t
2b060 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62  o the MemPage ob
2b070 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70  ject .** corresp
2b080 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69  onding to page i
2b090 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d  Page handy, it m
2b0a0 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68  ay pass it as th
2b0b0 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20  e second value. 
2b0c0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
2b0d0 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e  t may pass NULL.
2b0e0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e  .**.** If a poin
2b0f0 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65  ter to a MemPage
2b100 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65   object is passe
2b110 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
2b120 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73  argument,.** its
2b130 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
2b140 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20   is not altered 
2b150 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
2b160 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2b170 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72  freePage2(BtShar
2b180 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65  ed *pBt, MemPage
2b190 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f   *pMemPage, Pgno
2b1a0 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61   iPage){.  MemPa
2b1b0 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20  ge *pTrunk = 0; 
2b1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b1d0 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  * Free-list trun
2b1e0 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  k page */.  Pgno
2b1f0 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20   iTrunk = 0;    
2b200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b210 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
2b220 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  f free-list trun
2b230 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d  k page */ .  Mem
2b240 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
2b250 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20  Bt->pPage1;     
2b260 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65   /* Local refere
2b270 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f  nce to page 1 */
2b280 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2b290 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2b2a0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62         /* Page b
2b2b0 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20  eing freed. May 
2b2c0 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e  be NULL. */.  in
2b2d0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
2b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2f0 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
2b300 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b   */.  int nFree;
2b310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
2b330 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  tial number of p
2b340 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73  ages on free-lis
2b350 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
2b360 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2b370 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
2b380 3b 0a 20 20 61 73 73 65 72 74 28 20 69 50 61 67  ;.  assert( iPag
2b390 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>1 );.  assert(
2b3a0 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d   !pMemPage || pM
2b3b0 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50  emPage->pgno==iP
2b3c0 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d  age );..  if( pM
2b3d0 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50  emPage ){.    pP
2b3e0 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a  age = pMemPage;.
2b3f0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
2b400 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61  Ref(pPage->pDbPa
2b410 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
2b420 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50    pPage = btreeP
2b430 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69  ageLookup(pBt, i
2b440 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Page);.  }..  /*
2b450 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Increment the f
2b460 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f  ree page count o
2b470 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63  n pPage1 */.  rc
2b480 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2b490 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
2b4a0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
2b4b0 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f  ) goto freepage_
2b4c0 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67  out;.  nFree = g
2b4d0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
2b4e0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70  >aData[36]);.  p
2b4f0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
2b500 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65  >aData[36], nFre
2b510 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74  e+1);..  if( pBt
2b520 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
2b530 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29  _SECURE_DELETE )
2b540 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
2b550 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70  secure_delete op
2b560 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c  tion is enabled,
2b570 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77   then.    ** alw
2b580 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72  ays fully overwr
2b590 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
2b5a0 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
2b5b0 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  os..    */.    i
2b5c0 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28 28  f( (!pPage && ((
2b5d0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
2b5e0 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70  e(pBt, iPage, &p
2b5f0 50 61 67 65 2c 20 30 2c 20 30 29 29 21 3d 30 29  Page, 0, 0))!=0)
2b600 20 29 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20   ).     ||      
2b610 20 20 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c        ((rc = sql
2b620 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2b630 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21  Page->pDbPage))!
2b640 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0).    ){.     
2b650 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
2b660 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  ut;.    }.    me
2b670 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74  mset(pPage->aDat
2b680 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74  a, 0, pPage->pBt
2b690 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  ->pageSize);.  }
2b6a0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  ..  /* If the da
2b6b0 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
2b6c0 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69  auto-vacuum, wri
2b6d0 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  te an entry in t
2b6e0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
2b6f0 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
2b700 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
2b710 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   free..  */.  if
2b720 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
2b730 7b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  {.    ptrmapPut(
2b740 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d  pBt, iPage, PTRM
2b750 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20  AP_FREEPAGE, 0, 
2b760 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &rc);.    if( rc
2b770 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
2b780 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
2b790 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74  Now manipulate t
2b7a0 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61  he actual databa
2b7b0 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72  se free-list str
2b7c0 75 63 74 75 72 65 2e 20 54 68 65 72 65 20 61 72  ucture. There ar
2b7d0 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69  e two.  ** possi
2b7e0 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65  bilities. If the
2b7f0 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75   free-list is cu
2b800 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f  rrently empty, o
2b810 72 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20  r if the first. 
2b820 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69   ** trunk page i
2b830 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
2b840 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68  is full, then th
2b850 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63  is page will bec
2b860 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66  ome a.  ** new f
2b870 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
2b880 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  age. Otherwise, 
2b890 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  it will become a
2b8a0 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a   leaf of the.  *
2b8b0 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  * first trunk pa
2b8c0 67 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ge in the curren
2b8d0 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69  t free-list. Thi
2b8e0 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66  s block tests if
2b8f0 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73   it.  ** is poss
2b900 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20  ible to add the 
2b910 70 61 67 65 20 61 73 20 61 20 6e 65 77 20 66 72  page as a new fr
2b920 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20  ee-list leaf..  
2b930 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d  */.  if( nFree!=
2b940 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65  0 ){.    u32 nLe
2b950 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  af;             
2b960 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75     /* Initial nu
2b970 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c  mber of leaf cel
2b980 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  ls on trunk page
2b990 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20   */..    iTrunk 
2b9a0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2b9b0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a  e1->aData[32]);.
2b9c0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
2b9d0 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e  tPage(pBt, iTrun
2b9e0 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 2c 20 30  k, &pTrunk, 0, 0
2b9f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2ba00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ba10 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
2ba20 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
2ba30 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74 65  nLeaf = get4byte
2ba40 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
2ba50 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4]);.    assert(
2ba60 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
2ba70 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  >32 );.    if( n
2ba80 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42 74 2d  Leaf > (u32)pBt-
2ba90 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
2baa0 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  2 ){.      rc = 
2bab0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2bac0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
2bad0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2bae0 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61    }.    if( nLea
2baf0 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e 75 73  f < (u32)pBt->us
2bb00 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29  ableSize/4 - 8 )
2bb10 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68  {.      /* In th
2bb20 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73  is case there is
2bb30 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75   room on the tru
2bb40 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72  nk page to inser
2bb50 74 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  t the page.     
2bb60 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20   ** being freed 
2bb70 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20  as a new leaf.. 
2bb80 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2bb90 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 74   Note that the t
2bba0 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74  runk page is not
2bbb0 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74   really full unt
2bbc0 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20  il it contains. 
2bbd0 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
2bbe0 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73  ze/4 - 2 entries
2bbf0 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65  , not usableSize
2bc00 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61  /4 - 8 entries a
2bc10 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 20 20  s we have.      
2bc20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64  ** coded.  But d
2bc30 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65  ue to a coding e
2bc40 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73  rror in versions
2bc50 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72   of SQLite prior
2bc60 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36   to.      ** 3.6
2bc70 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20 77 69  .0, databases wi
2bc80 74 68 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  th freelist trun
2bc90 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20  k pages holding 
2bca0 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20  more than.      
2bcb0 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
2bcc0 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c  - 8 entries will
2bcd0 20 62 65 20 72 65 70 6f 72 74 65 64 20 61 73 20   be reported as 
2bce0 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64  corrupt.  In ord
2bcf0 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d  er.      ** to m
2bd00 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64  aintain backward
2bd10 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s compatibility 
2bd20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69  with older versi
2bd30 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20  ons of SQLite,. 
2bd40 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20       ** we will 
2bd50 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 73 74  continue to rest
2bd60 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20  rict the number 
2bd70 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73  of entries to us
2bd80 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20  ableSize/4 - 8. 
2bd90 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e       ** for now.
2bda0 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20    At some point 
2bdb0 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 28 6f  in the future (o
2bdc0 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73  nce everyone has
2bdd0 20 75 70 67 72 61 64 65 64 0a 20 20 20 20 20 20   upgraded.      
2bde0 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c  ** to 3.6.0 or l
2bdf0 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20  ater) we should 
2be00 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20  consider fixing 
2be10 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20  the conditional 
2be20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74  above.      ** t
2be30 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65 53 69  o read "usableSi
2be40 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20  ze/4-2" instead 
2be50 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34  of "usableSize/4
2be60 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  -8"..      */.  
2be70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2be80 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
2be90 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
2bea0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2beb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2bec0 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  put4byte(&pTrunk
2bed0 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61  ->aData[4], nLea
2bee0 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75  f+1);.        pu
2bef0 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
2bf00 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d  aData[8+nLeaf*4]
2bf10 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
2bf20 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20 28    if( pPage && (
2bf30 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
2bf40 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
2bf50 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  E)==0 ){.       
2bf60 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44     sqlite3PagerD
2bf70 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e  ontWrite(pPage->
2bf80 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2bf90 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
2bfa0 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74   btreeSetHasCont
2bfb0 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b  ent(pBt, iPage);
2bfc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54  .      }.      T
2bfd0 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
2bfe0 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75  : %d leaf on tru
2bff0 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50  nk page %d\n",pP
2c000 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b  age->pgno,pTrunk
2c010 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
2c020 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
2c030 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
2c040 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c  /* If control fl
2c050 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ows to this poin
2c060 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e  t, then it was n
2c070 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  ot possible to a
2c080 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  dd the.  ** the 
2c090 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
2c0a0 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65 20   as a leaf page 
2c0b0 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72 75  of the first tru
2c0c0 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  nk in the free-l
2c0d0 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62  ist..  ** Possib
2c0e0 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ly because the f
2c0f0 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74  ree-list is empt
2c100 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62  y, or possibly b
2c110 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a  ecause the .  **
2c120 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20   first trunk in 
2c130 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
2c140 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61   full. Either wa
2c150 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  y, the page bein
2c160 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c  g freed.  ** wil
2c170 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
2c180 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67   first trunk pag
2c190 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e in the free-li
2c1a0 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
2c1b0 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54  Page==0 && SQLIT
2c1c0 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65  E_OK!=(rc = btre
2c1d0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
2c1e0 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 2c 20  age, &pPage, 0, 
2c1f0 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  0)) ){.    goto 
2c200 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2c210 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
2c220 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
2c230 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
2c240 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c250 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
2c260 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
2c270 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
2c280 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a  aData, iTrunk);.
2c290 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
2c2a0 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b  e->aData[4], 0);
2c2b0 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
2c2c0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
2c2d0 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28  iPage);.  TRACE(
2c2e0 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
2c2f0 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72  new trunk page r
2c300 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20  eplacing %d\n", 
2c310 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72  pPage->pgno, iTr
2c320 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65  unk));..freepage
2c330 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67  _out:.  if( pPag
2c340 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  e ){.    pPage->
2c350 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  isInit = 0;.  }.
2c360 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2c370 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  age);.  releaseP
2c380 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
2c390 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74  eturn rc;.}.stat
2c3a0 69 63 20 76 6f 69 64 20 66 72 65 65 50 61 67 65  ic void freePage
2c3b0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
2c3c0 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66   int *pRC){.  if
2c3d0 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45  ( (*pRC)==SQLITE
2c3e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  _OK ){.    *pRC 
2c3f0 3d 20 66 72 65 65 50 61 67 65 32 28 70 50 61 67  = freePage2(pPag
2c400 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70  e->pBt, pPage, p
2c410 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d  Page->pgno);.  }
2c420 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
2c430 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
2c440 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2c450 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c  h the given Cell
2c460 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c470 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67  clearCell(MemPag
2c480 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e  e *pPage, unsign
2c490 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b  ed char *pCell){
2c4a0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2c4b0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
2c4c0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
2c4d0 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b    Pgno ovflPgno;
2c4e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
2c4f0 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76   nOvfl;.  u32 ov
2c500 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61  flPageSize;..  a
2c510 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2c520 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
2c530 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
2c540 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
2c550 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
2c560 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20  , &info);.  if( 
2c570 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d  info.iOverflow==
2c580 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
2c590 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e  SQLITE_OK;  /* N
2c5a0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
2c5b0 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74  . Return without
2c5c0 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
2c5d0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 65  */.  }.  if( pCe
2c5e0 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll+info.iOverflo
2c5f0 77 2b 33 20 3e 20 70 50 61 67 65 2d 3e 61 44 61  w+3 > pPage->aDa
2c600 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  ta+pPage->maskPa
2c610 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
2c620 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2c630 42 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65  BKPT;  /* Cell e
2c640 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20  xtends past end 
2c650 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20  of page */.  }. 
2c660 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34   ovflPgno = get4
2c670 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
2c680 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20  .iOverflow]);.  
2c690 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
2c6a0 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20  bleSize > 4 );. 
2c6b0 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20   ovflPageSize = 
2c6c0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2c6d0 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28  - 4;.  nOvfl = (
2c6e0 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20  info.nPayload - 
2c6f0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76  info.nLocal + ov
2c700 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f  flPageSize - 1)/
2c710 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20  ovflPageSize;.  
2c720 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f  assert( ovflPgno
2c730 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29  ==0 || nOvfl>0 )
2c740 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c  ;.  while( nOvfl
2c750 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69  -- ){.    Pgno i
2c760 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65  Next = 0;.    Me
2c770 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
2c780 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67  ;.    if( ovflPg
2c790 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f  no<2 || ovflPgno
2c7a0 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28  >btreePagecount(
2c7b0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
2c7c0 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61   0 is not a lega
2c7d0 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  l page number an
2c7e0 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20  d page 1 cannot 
2c7f0 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20  be an .      ** 
2c800 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54  overflow page. T
2c810 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c  herefore if ovfl
2c820 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74  Pgno<2 or past t
2c830 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20  he end of the . 
2c840 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65       ** file the
2c850 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
2c860 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20  e corrupt. */.  
2c870 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2c880 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2c890 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f      }.    if( nO
2c8a0 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  vfl ){.      rc 
2c8b0 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
2c8c0 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c  e(pBt, ovflPgno,
2c8d0 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29   &pOvfl, &iNext)
2c8e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
2c8f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2c900 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76  }..    if( ( pOv
2c910 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20  fl || ((pOvfl = 
2c920 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
2c930 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21  pBt, ovflPgno))!
2c940 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20 73 71  =0) ).     && sq
2c950 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
2c960 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44  fcount(pOvfl->pD
2c970 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b  bPage)!=1.    ){
2c980 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20  .      /* There 
2c990 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79  is no reason any
2c9a0 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68   cursor should h
2c9b0 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69  ave an outstandi
2c9c0 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20  ng reference .  
2c9d0 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65      ** to an ove
2c9e0 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e  rflow page belon
2c9f0 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74  ging to a cell t
2ca00 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c  hat is being del
2ca10 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20  eted/updated..  
2ca20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65      ** So if the
2ca30 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74  re exists more t
2ca40 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63  han one referenc
2ca50 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20  e to this page, 
2ca60 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a  then it .      *
2ca70 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c  * must not reall
2ca80 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  y be an overflow
2ca90 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 64 61   page and the da
2caa0 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63  tabase must be c
2cab0 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a  orrupt. .      *
2cac0 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20  * It is helpful 
2cad0 74 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 62  to detect this b
2cae0 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72  efore calling fr
2caf0 65 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20  eePage2(), as . 
2cb00 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65       ** freePage
2cb10 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65  2() may zero the
2cb20 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69   page contents i
2cb30 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20  f secure-delete 
2cb40 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  mode is.      **
2cb50 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69   enabled. If thi
2cb60 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67  s 'overflow' pag
2cb70 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
2cb80 61 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a  a page that the.
2cb90 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20        ** caller 
2cba0 69 73 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  is iterating thr
2cbb0 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e  ough or using in
2cbc0 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c   some other way,
2cbd0 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63   this.      ** c
2cbe0 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69  an be problemati
2cbf0 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  c..      */.    
2cc00 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2cc10 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2cc20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2cc30 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c  = freePage2(pBt,
2cc40 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f   pOvfl, ovflPgno
2cc50 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
2cc60 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20  ( pOvfl ){.     
2cc70 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
2cc80 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67  ef(pOvfl->pDbPag
2cc90 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
2cca0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2ccb0 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d  ;.    ovflPgno =
2ccc0 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65   iNext;.  }.  re
2ccd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2cce0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
2ccf0 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63  the byte sequenc
2cd00 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  e used to repres
2cd10 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61  ent a cell on pa
2cd20 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20  ge pPage.** and 
2cd30 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20  write that byte 
2cd40 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43  sequence into pC
2cd50 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77  ell[].  Overflow
2cd60 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c   pages are.** al
2cd70 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c  located and fill
2cd80 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61  ed in as necessa
2cd90 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  ry.  The calling
2cda0 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73   procedure.** is
2cdb0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
2cdc0 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66   making sure suf
2cdd0 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61  ficient space ha
2cde0 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
2cdf0 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e  .** for pCell[].
2ce00 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
2ce10 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20   pCell does not 
2ce20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74  necessary need t
2ce30 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70  o point to the p
2ce40 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61  Page->aData.** a
2ce50 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68  rea.  pCell migh
2ce60 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20  t point to some 
2ce70 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  temporary storag
2ce80 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c  e.  The cell wil
2ce90 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63  l.** be construc
2cea0 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70  ted in this temp
2ceb0 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20  orary area then 
2cec0 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67  copied into pPag
2ced0 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65  e->aData.** late
2cee0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2cef0 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d   fillInCell(.  M
2cf00 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
2cf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2cf20 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
2cf30 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c  ontains the cell
2cf40 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
2cf50 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20  har *pCell,     
2cf60 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65       /* Complete
2cf70 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c   text of the cel
2cf80 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  l */.  const voi
2cf90 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65  d *pKey, i64 nKe
2cfa0 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79  y,    /* The key
2cfb0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
2cfc0 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74   *pData,int nDat
2cfd0 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  a,   /* The data
2cfe0 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c   */.  int nZero,
2cff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d000 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65       /* Extra ze
2d010 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70 65  ro bytes to appe
2d020 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20  nd to pData */. 
2d030 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20   int *pnSize    
2d040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d050 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69  /* Write cell si
2d060 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ze here */.){.  
2d070 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  int nPayload;.  
2d080 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a  const u8 *pSrc;.
2d090 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72    int nSrc, n, r
2d0a0 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65  c;.  int spaceLe
2d0b0 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ft;.  MemPage *p
2d0c0 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  Ovfl = 0;.  MemP
2d0d0 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20  age *pToRelease 
2d0e0 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  = 0;.  unsigned 
2d0f0 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20  char *pPrior;.  
2d100 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2d110 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61  Payload;.  BtSha
2d120 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
2d130 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67  ->pBt;.  Pgno pg
2d140 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e  noOvfl = 0;.  in
2d150 74 20 6e 48 65 61 64 65 72 3b 0a 20 20 43 65 6c  t nHeader;.  Cel
2d160 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61  lInfo info;..  a
2d170 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2d180 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
2d190 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
2d1a0 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e  .  /* pPage is n
2d1b0 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
2d1c0 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70  riteable since p
2d1d0 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75  Cell might be au
2d1e0 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66  xiliary.  ** buf
2d1f0 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69  fer space that i
2d200 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20  s separate from 
2d210 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72  the pPage buffer
2d220 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72   area */.  asser
2d230 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e  t( pCell<pPage->
2d240 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d  aData || pCell>=
2d250 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
2d260 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
2d270 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
2d280 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2d290 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
2d2a0 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ge) );..  /* Fil
2d2b0 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  l in the header.
2d2c0 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20   */.  nHeader = 
2d2d0 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  0;.  if( !pPage-
2d2e0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65  >leaf ){.    nHe
2d2f0 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20  ader += 4;.  }. 
2d300 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
2d310 61 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  ata ){.    nHead
2d320 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28  er += putVarint(
2d330 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
2d340 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20   nData+nZero);. 
2d350 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74   }else{.    nDat
2d360 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20  a = nZero = 0;. 
2d370 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20   }.  nHeader += 
2d380 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
2d390 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34  [nHeader], *(u64
2d3a0 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 62 74 72 65  *)&nKey);.  btre
2d3b0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
2d3c0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
2d3d0 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e  o);.  assert( in
2d3e0 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61  fo.nHeader==nHea
2d3f0 64 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  der );.  assert(
2d400 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79   info.nKey==nKey
2d410 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e   );.  assert( in
2d420 66 6f 2e 6e 44 61 74 61 3d 3d 28 75 33 32 29 28  fo.nData==(u32)(
2d430 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a  nData+nZero) );.
2d440 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20    .  /* Fill in 
2d450 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  the payload */. 
2d460 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74   nPayload = nDat
2d470 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28  a + nZero;.  if(
2d480 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
2d490 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61  {.    pSrc = pDa
2d4a0 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e  ta;.    nSrc = n
2d4b0 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20  Data;.    nData 
2d4c0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20  = 0;.  }else{ . 
2d4d0 20 20 20 69 66 28 20 4e 45 56 45 52 28 6e 4b 65     if( NEVER(nKe
2d4e0 79 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20  y>0x7fffffff || 
2d4f0 70 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20  pKey==0) ){.    
2d500 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d510 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2d520 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
2d530 20 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20   += (int)nKey;. 
2d540 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a     pSrc = pKey;.
2d550 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29      nSrc = (int)
2d560 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53  nKey;.  }.  *pnS
2d570 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65  ize = info.nSize
2d580 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20  ;.  spaceLeft = 
2d590 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70  info.nLocal;.  p
2d5a0 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c  Payload = &pCell
2d5b0 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72  [nHeader];.  pPr
2d5c0 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66  ior = &pCell[inf
2d5d0 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20  o.iOverflow];.. 
2d5e0 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64   while( nPayload
2d5f0 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70  >0 ){.    if( sp
2d600 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69  aceLeft==0 ){.#i
2d610 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2d620 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2d630 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d     Pgno pgnoPtrm
2d640 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f  ap = pgnoOvfl; /
2d650 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * Overflow page 
2d660 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
2d670 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  y page */.      
2d680 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
2d690 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64  uum ){.        d
2d6a0 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e  o{.          pgn
2d6b0 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20  oOvfl++;.       
2d6c0 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20   } while( .     
2d6d0 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41       PTRMAP_ISPA
2d6e0 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  GE(pBt, pgnoOvfl
2d6f0 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50  ) || pgnoOvfl==P
2d700 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2d710 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29  (pBt) .        )
2d720 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
2d730 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  .      rc = allo
2d740 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
2d750 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f  t, &pOvfl, &pgno
2d760 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  Ovfl, pgnoOvfl, 
2d770 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
2d780 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2d790 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
2d7a0 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
2d7b0 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
2d7c0 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  , and the second
2d7d0 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20   or subsequent. 
2d7e0 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
2d7f0 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61   page is being a
2d800 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e  llocated, add an
2d810 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f   entry to the po
2d820 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20  inter-map.      
2d830 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ** for that page
2d840 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a   now. .      **.
2d850 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73        ** If this
2d860 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76   is the first ov
2d870 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
2d880 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61  n write a partia
2d890 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a  l entry .      *
2d8a0 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  * to the pointer
2d8b0 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74  -map. If we writ
2d8c0 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69  e nothing to thi
2d8d0 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c  s pointer-map sl
2d8e0 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ot,.      ** the
2d8f0 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63  n the optimistic
2d900 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20   overflow chain 
2d910 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c  processing in cl
2d920 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20  earCell().      
2d930 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70  ** may misinterp
2d940 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61  ret the uninitia
2d950 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e 64  lized values and
2d960 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20   delete the.    
2d970 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73    ** wrong pages
2d980 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
2d990 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  se..      */.   
2d9a0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
2d9b0 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51  Vacuum && rc==SQ
2d9c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d9d0 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70     u8 eType = (p
2d9e0 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50  gnoPtrmap?PTRMAP
2d9f0 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41  _OVERFLOW2:PTRMA
2da00 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20  P_OVERFLOW1);.  
2da10 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
2da20 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65  pBt, pgnoOvfl, e
2da30 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70  Type, pgnoPtrmap
2da40 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20  , &rc);.        
2da50 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2da60 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2da70 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20  pOvfl);.        
2da80 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
2da90 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
2daa0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
2dab0 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
2dac0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2dad0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
2dae0 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
2daf0 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
2db00 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69   than pPrior poi
2db10 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
2db20 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20  a area.      ** 
2db30 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
2db40 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
2db50 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
2db60 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
2db70 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c    assert( pToRel
2db80 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ease==0 || sqlit
2db90 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2dba0 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70  le(pToRelease->p
2dbb0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
2dbc0 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69    /* If pPrior i
2dbd0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  s part of the da
2dbe0 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65  ta area of pPage
2dbf0 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
2dc00 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20   pPage.      ** 
2dc10 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
2dc20 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  le */.      asse
2dc30 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65  rt( pPrior<pPage
2dc40 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f  ->aData || pPrio
2dc50 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  r>=&pPage->aData
2dc60 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
2dc70 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
2dc80 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2dc90 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2dca0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
2dcb0 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
2dcc0 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20  , pgnoOvfl);.   
2dcd0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2dce0 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
2dcf0 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70    pToRelease = p
2dd00 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69  Ovfl;.      pPri
2dd10 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74  or = pOvfl->aDat
2dd20 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  a;.      put4byt
2dd30 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20  e(pPrior, 0);.  
2dd40 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26      pPayload = &
2dd50 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b  pOvfl->aData[4];
2dd60 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74  .      spaceLeft
2dd70 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
2dd80 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  ze - 4;.    }.  
2dd90 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a    n = nPayload;.
2dda0 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c      if( n>spaceL
2ddb0 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c  eft ) n = spaceL
2ddc0 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  eft;..    /* If 
2ddd0 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
2dde0 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79  t zero than pPay
2ddf0 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f  load points into
2de00 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
2de10 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
2de20 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
2de30 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
2de40 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
2de50 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  /.    assert( pT
2de60 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73  oRelease==0 || s
2de70 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2de80 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73  teable(pToReleas
2de90 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
2dea0 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f      /* If pPaylo
2deb0 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ad is part of th
2dec0 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70  e data area of p
2ded0 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20  Page, then make 
2dee0 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a  sure pPage.    *
2def0 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  * is still write
2df00 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65  able */.    asse
2df10 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61  rt( pPayload<pPa
2df20 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61  ge->aData || pPa
2df30 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61  yload>=&pPage->a
2df40 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
2df50 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
2df60 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
2df70 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
2df80 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
2df90 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b     if( nSrc>0 ){
2dfa0 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72  .      if( n>nSr
2dfb0 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20  c ) n = nSrc;.  
2dfc0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
2dfd0 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
2dfe0 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
2dff0 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
2e000 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
2e010 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20  yload, 0, n);.  
2e020 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
2e030 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c   -= n;.    pPayl
2e040 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53  oad += n;.    pS
2e050 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72  rc += n;.    nSr
2e060 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63  c -= n;.    spac
2e070 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20  eLeft -= n;.    
2e080 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20  if( nSrc==0 ){. 
2e090 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74       nSrc = nDat
2e0a0 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  a;.      pSrc = 
2e0b0 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  pData;.    }.  }
2e0c0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
2e0d0 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65  ToRelease);.  re
2e0e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2e0f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
2e100 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72  the i-th cell fr
2e110 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20  om pPage.  This 
2e120 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20  routine effects 
2e130 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54  pPage only..** T
2e140 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
2e150 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20  is not freed or 
2e160 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74  deallocated.  It
2e170 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
2e180 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  .** the cell con
2e190 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f  tent has been co
2e1a0 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65  pied someplace e
2e1b0 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lse.  This routi
2e1c0 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76  ne just.** remov
2e1d0 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  es the reference
2e1e0 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f   to the cell fro
2e1f0 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22  m pPage..**.** "
2e200 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20  sz" must be the 
2e210 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
2e220 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a  in the cell..*/.
2e230 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70  static void drop
2e240 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
2e250 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e  age, int idx, in
2e260 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b  t sz, int *pRC){
2e270 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20  .  u32 pc;      
2e280 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
2e290 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20  cell content of 
2e2a0 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  cell being delet
2e2b0 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  ed */.  u8 *data
2e2c0 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65  ;       /* pPage
2e2d0 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20  ->aData */.  u8 
2e2e0 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  *ptr;        /* 
2e2f0 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74  Used to move byt
2e300 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e  es around within
2e310 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20   data[] */.  u8 
2e320 2a 65 6e 64 50 74 72 3b 20 20 20 20 20 2f 2a 20  *endPtr;     /* 
2e330 45 6e 64 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20  End of loop */. 
2e340 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2e350 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63   /* The return c
2e360 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  ode */.  int hdr
2e370 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;        /* Begi
2e380 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 68 65 61  nning of the hea
2e390 64 65 72 2e 20 20 30 20 6d 6f 73 74 20 70 61 67  der.  0 most pag
2e3a0 65 73 2e 20 20 31 30 30 20 70 61 67 65 20 31 20  es.  100 page 1 
2e3b0 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29  */..  if( *pRC )
2e3c0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65   return;..  asse
2e3d0 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64  rt( idx>=0 && id
2e3e0 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
2e3f0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d  ;.  assert( sz==
2e400 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  cellSize(pPage, 
2e410 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  idx) );.  assert
2e420 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2e430 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
2e440 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
2e450 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2e460 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
2e470 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
2e480 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
2e490 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26  aData;.  ptr = &
2e4a0 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b  pPage->aCellIdx[
2e4b0 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67  2*idx];.  pc = g
2e4c0 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20  et2byte(ptr);.  
2e4d0 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
2e4e0 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63 61  Offset;.  testca
2e4f0 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74 65  se( pc==get2byte
2e500 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29  (&data[hdr+5]) )
2e510 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63  ;.  testcase( pc
2e520 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d  +sz==pPage->pBt-
2e530 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
2e540 20 69 66 28 20 70 63 20 3c 20 28 75 33 32 29 67   if( pc < (u32)g
2e550 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
2e560 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e  r+5]) || pc+sz >
2e570 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
2e580 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a  bleSize ){.    *
2e590 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
2e5a0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72  RUPT_BKPT;.    r
2e5b0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20  eturn;.  }.  rc 
2e5c0 3d 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67  = freeSpace(pPag
2e5d0 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66  e, pc, sz);.  if
2e5e0 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43  ( rc ){.    *pRC
2e5f0 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
2e600 6e 3b 0a 20 20 7d 0a 20 20 65 6e 64 50 74 72 20  n;.  }.  endPtr 
2e610 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49  = &pPage->aCellI
2e620 64 78 5b 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c  dx[2*pPage->nCel
2e630 6c 20 2d 20 32 5d 3b 0a 20 20 61 73 73 65 72 74  l - 2];.  assert
2e640 28 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f  ( (SQLITE_PTR_TO
2e650 5f 49 4e 54 28 70 74 72 29 26 31 29 3d 3d 30 20  _INT(ptr)&1)==0 
2e660 29 3b 20 20 2f 2a 20 70 74 72 20 69 73 20 61 6c  );  /* ptr is al
2e670 77 61 79 73 20 32 2d 62 79 74 65 20 61 6c 69 67  ways 2-byte alig
2e680 6e 65 64 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ned */.  while( 
2e690 70 74 72 3c 65 6e 64 50 74 72 20 29 7b 0a 20 20  ptr<endPtr ){.  
2e6a0 20 20 2a 28 75 31 36 2a 29 70 74 72 20 3d 20 2a    *(u16*)ptr = *
2e6b0 28 75 31 36 2a 29 26 70 74 72 5b 32 5d 3b 0a 20  (u16*)&ptr[2];. 
2e6c0 20 20 20 70 74 72 20 2b 3d 20 32 3b 0a 20 20 7d     ptr += 2;.  }
2e6d0 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  .  pPage->nCell-
2e6e0 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  -;.  put2byte(&d
2e6f0 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67  ata[hdr+3], pPag
2e700 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61  e->nCell);.  pPa
2e710 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a  ge->nFree += 2;.
2e720 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
2e730 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50  a new cell on pP
2e740 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65  age at cell inde
2e750 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f  x "i".  pCell po
2e760 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63  ints to the.** c
2e770 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65  ontent of the ce
2e780 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ll..**.** If the
2e790 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69   cell content wi
2e7a0 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61  ll fit on the pa
2e7b0 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20  ge, then put it 
2e7c0 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a  there.  If it.**
2e7d0 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74   will not fit, t
2e7e0 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  hen make a copy 
2e7f0 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
2e800 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69  ent into pTemp i
2e810 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f  f.** pTemp is no
2e820 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c  t null.  Regardl
2e830 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c  ess of pTemp, al
2e840 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74  locate a new ent
2e850 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e  ry.** in pPage->
2e860 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b  apOvfl[] and mak
2e870 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68  e it point to th
2e880 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28  e cell content (
2e890 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65  either.** in pTe
2e8a0 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  mp or the origin
2e8b0 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c  al pCell) and al
2e8c0 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e  so record its in
2e8d0 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74  dex. .** Allocat
2e8e0 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ing a new entry 
2e8f0 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b  in pPage->aCell[
2e900 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a  ] implies that .
2e910 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ** pPage->nOverf
2e920 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  low is increment
2e930 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b  ed..**.** If nSk
2e940 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ip is non-zero, 
2e950 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79  then do not copy
2e960 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70   the first nSkip
2e970 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a   bytes of the.**
2e980 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65   cell. The calle
2e990 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65  r will overwrite
2e9a0 20 74 68 65 6d 20 61 66 74 65 72 20 74 68 69 73   them after this
2e9b0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
2e9c0 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69  s. If.** nSkip i
2e9d0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
2e9e0 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70   pCell may not p
2e9f0 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c  oint to an inval
2ea00 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  id memory locati
2ea10 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c  on .** (but pCel
2ea20 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79  l+nSkip is alway
2ea30 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61  s valid)..*/.sta
2ea40 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43  tic void insertC
2ea50 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
2ea60 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65  pPage,   /* Page
2ea70 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61   into which we a
2ea80 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20  re copying */.  
2ea90 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20  int i,          
2eaa0 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65    /* New cell be
2eab0 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63  comes the i-th c
2eac0 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20  ell of the page 
2ead0 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
2eae0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
2eaf0 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c  t of the new cel
2eb00 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20  l */.  int sz,  
2eb10 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
2eb20 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20  s of content in 
2eb30 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
2eb40 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
2eb50 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61  Temp storage spa
2eb60 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66  ce for pCell, if
2eb70 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e   needed */.  Pgn
2eb80 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f  o iChild,      /
2eb90 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72  * If non-zero, r
2eba0 65 70 6c 61 63 65 20 66 69 72 73 74 20 34 20 62  eplace first 4 b
2ebb0 79 74 65 73 20 77 69 74 68 20 74 68 69 73 20 76  ytes with this v
2ebc0 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  alue */.  int *p
2ebd0 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  RC          /* R
2ebe0 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 72 65  ead and write re
2ebf0 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68  turn code from h
2ec00 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
2ec10 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  idx = 0;      /*
2ec20 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
2ec30 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  new cell content
2ec40 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
2ec50 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
2ec60 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2ec70 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20  r */.  int end; 
2ec80 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2ec90 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
2eca0 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  last cell pointe
2ecb0 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  r in data[] */. 
2ecc0 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20   int ins;       
2ecd0 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64     /* Index in d
2ece0 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20  ata[] where new 
2ecf0 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20  cell pointer is 
2ed00 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e  inserted */.  in
2ed10 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  t cellOffset;   
2ed20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66 69  /* Address of fi
2ed30 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  rst cell pointer
2ed40 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
2ed50 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
2ed60 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74    /* The content
2ed70 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61   of the whole pa
2ed80 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b  ge */.  u8 *ptr;
2ed90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2eda0 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66  d for moving inf
2edb0 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20  ormation around 
2edc0 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75  in data[] */.  u
2edd0 38 20 2a 65 6e 64 50 74 72 3b 20 20 20 20 20 20  8 *endPtr;      
2ede0 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c   /* End of the l
2edf0 6f 6f 70 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 53  oop */..  int nS
2ee00 6b 69 70 20 3d 20 28 69 43 68 69 6c 64 20 3f 20  kip = (iChild ? 
2ee10 34 20 3a 20 30 29 3b 0a 0a 20 20 69 66 28 20 2a  4 : 0);..  if( *
2ee20 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  pRC ) return;.. 
2ee30 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
2ee40 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   i<=pPage->nCell
2ee50 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  +pPage->nOverflo
2ee60 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  w );.  assert( p
2ee70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f  Page->nCell<=MX_
2ee80 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
2ee90 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67   && MX_CELL(pPag
2eea0 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 20 29  e->pBt)<=10921 )
2eeb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2eec0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72  e->nOverflow<=Ar
2eed0 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
2eee0 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65  pOvfl) );.  asse
2eef0 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 70 50  rt( ArraySize(pP
2ef00 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41 72  age->apOvfl)==Ar
2ef10 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
2ef20 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65  iOvfl) );.  asse
2ef30 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2ef40 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2ef50 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f  t->mutex) );.  /
2ef60 2a 20 54 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c  * The cell shoul
2ef70 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69  d normally be si
2ef80 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20  zed correctly.  
2ef90 48 6f 77 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f  However, when mo
2efa0 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66  ving a.  ** malf
2efb0 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20  ormed cell from 
2efc0 61 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20 61  a leaf page to a
2efd0 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 2c  n interior page,
2efe0 20 69 66 20 74 68 65 20 63 65 6c 6c 20 73 69 7a   if the cell siz
2eff0 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f  e.  ** wanted to
2f000 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 20   be less than 4 
2f010 62 75 74 20 67 6f 74 20 72 6f 75 6e 64 65 64 20  but got rounded 
2f020 75 70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c  up to 4 on the l
2f030 65 61 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20  eaf, then size. 
2f040 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c 65 73   ** might be les
2f050 73 20 74 68 61 6e 20 38 20 28 6c 65 61 66 2d 73  s than 8 (leaf-s
2f060 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f  ize + pointer) o
2f070 6e 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e  n the interior n
2f080 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a  ode.  Hence.  **
2f090 20 74 68 65 20 74 65 72 6d 20 61 66 74 65 72 20   the term after 
2f0a0 74 68 65 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f  the || in the fo
2f0b0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29  llowing assert()
2f0c0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  . */.  assert( s
2f0d0 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  z==cellSizePtr(p
2f0e0 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20  Page, pCell) || 
2f0f0 28 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64  (sz==8 && iChild
2f100 3e 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  >0) );.  if( pPa
2f110 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c  ge->nOverflow ||
2f120 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72   sz+2>pPage->nFr
2f130 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54  ee ){.    if( pT
2f140 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  emp ){.      mem
2f150 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c  cpy(pTemp+nSkip,
2f160 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a   pCell+nSkip, sz
2f170 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70  -nSkip);.      p
2f180 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20  Cell = pTemp;.  
2f190 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69    }.    if( iChi
2f1a0 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34  ld ){.      put4
2f1b0 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69  byte(pCell, iChi
2f1c0 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  ld);.    }.    j
2f1d0 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66   = pPage->nOverf
2f1e0 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  low++;.    asser
2f1f0 74 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f  t( j<(int)(sizeo
2f200 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29  f(pPage->apOvfl)
2f210 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  /sizeof(pPage->a
2f220 70 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20  pOvfl[0])) );.  
2f230 20 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b    pPage->apOvfl[
2f240 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20  j] = pCell;.    
2f250 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d  pPage->aiOvfl[j]
2f260 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d 65 6c   = (u16)i;.  }el
2f270 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  se{.    int rc =
2f280 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2f290 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
2f2a0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
2f2b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f2c0 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
2f2d0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
2f2e0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  }.    assert( sq
2f2f0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2f300 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
2f310 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74  Page) );.    dat
2f320 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
2f330 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74  ;.    cellOffset
2f340 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
2f350 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20  fset;.    end = 
2f360 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
2f370 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
2f380 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65   ins = cellOffse
2f390 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 72 63 20  t + 2*i;.    rc 
2f3a0 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  = allocateSpace(
2f3b0 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29  pPage, sz, &idx)
2f3c0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 20  ;.    if( rc ){ 
2f3d0 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72  *pRC = rc; retur
2f3e0 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20  n; }.    /* The 
2f3f0 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29 20  allocateSpace() 
2f400 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74 65  routine guarante
2f410 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
2f420 20 74 77 6f 20 70 72 6f 70 65 72 74 69 65 73 0a   two properties.
2f430 20 20 20 20 2a 2a 20 69 66 20 69 74 20 72 65 74      ** if it ret
2f440 75 72 6e 73 20 73 75 63 63 65 73 73 20 2a 2f 0a  urns success */.
2f450 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 20      assert( idx 
2f460 3e 3d 20 65 6e 64 2b 32 20 29 3b 0a 20 20 20 20  >= end+2 );.    
2f470 61 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20 3c  assert( idx+sz <
2f480 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42  = (int)pPage->pB
2f490 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
2f4a0 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  .    pPage->nCel
2f4b0 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  l++;.    pPage->
2f4c0 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32  nFree -= (u16)(2
2f4d0 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63   + sz);.    memc
2f4e0 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b  py(&data[idx+nSk
2f4f0 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  ip], pCell+nSkip
2f500 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20  , sz-nSkip);.   
2f510 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20   if( iChild ){. 
2f520 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 64       put4byte(&d
2f530 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64  ata[idx], iChild
2f540 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 74 72  );.    }.    ptr
2f550 20 3d 20 26 64 61 74 61 5b 65 6e 64 5d 3b 0a 20   = &data[end];. 
2f560 20 20 20 65 6e 64 50 74 72 20 3d 20 26 64 61 74     endPtr = &dat
2f570 61 5b 69 6e 73 5d 3b 0a 20 20 20 20 61 73 73 65  a[ins];.    asse
2f580 72 74 28 20 28 53 51 4c 49 54 45 5f 50 54 52 5f  rt( (SQLITE_PTR_
2f590 54 4f 5f 49 4e 54 28 70 74 72 29 26 31 29 3d 3d  TO_INT(ptr)&1)==
2f5a0 30 20 29 3b 20 20 2f 2a 20 70 74 72 20 69 73 20  0 );  /* ptr is 
2f5b0 61 6c 77 61 79 73 20 32 2d 62 79 74 65 20 61 6c  always 2-byte al
2f5c0 69 67 6e 65 64 20 2a 2f 0a 20 20 20 20 77 68 69  igned */.    whi
2f5d0 6c 65 28 20 70 74 72 3e 65 6e 64 50 74 72 20 29  le( ptr>endPtr )
2f5e0 7b 0a 20 20 20 20 20 20 2a 28 75 31 36 2a 29 70  {.      *(u16*)p
2f5f0 74 72 20 3d 20 2a 28 75 31 36 2a 29 26 70 74 72  tr = *(u16*)&ptr
2f600 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 20  [-2];.      ptr 
2f610 2d 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  -= 2;.    }.    
2f620 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  put2byte(&data[i
2f630 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70  ns], idx);.    p
2f640 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50  ut2byte(&data[pP
2f650 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33  age->hdrOffset+3
2f660 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29  ], pPage->nCell)
2f670 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2f680 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2f690 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
2f6a0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2f6b0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
2f6c0 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e  cell may contain
2f6d0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
2f6e0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
2f6f0 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20  If so, write.   
2f700 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20     ** the entry 
2f710 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
2f720 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
2f730 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20  ointer map..    
2f740 20 20 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61    */.      ptrma
2f750 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67  pPutOvflPtr(pPag
2f760 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a  e, pCell, pRC);.
2f770 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
2f780 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
2f790 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f  list of cells to
2f7a0 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 70 61   a page.  The pa
2f7b0 67 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69  ge should be ini
2f7c0 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a  tially empty..**
2f7d0 20 54 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67   The cells are g
2f7e0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74  uaranteed to fit
2f7f0 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   on the page..*/
2f800 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
2f810 65 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d  emblePage(.  Mem
2f820 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f  Page *pPage,   /
2f830 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 62 65  * The page to be
2f840 20 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20   assemblied */. 
2f850 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20   int nCell,     
2f860 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
2f870 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64   of cells to add
2f880 20 74 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f   to this page */
2f890 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20  .  u8 **apCell, 
2f8a0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73       /* Pointers
2f8b0 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20   to cell bodies 
2f8c0 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a 65 20  */.  u16 *aSize 
2f8d0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20         /* Sizes 
2f8e0 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a  of the cells */.
2f8f0 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
2f900 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2f910 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a  ounter */.  u8 *
2f920 70 43 65 6c 6c 70 74 72 3b 20 20 20 20 20 2f 2a  pCellptr;     /*
2f930 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74   Address of next
2f940 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
2f950 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b  .  int cellbody;
2f960 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
2f970 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64  of next cell bod
2f980 79 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73  y */.  u8 * cons
2f990 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  t data = pPage->
2f9a0 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  aData;          
2f9b0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
2f9c0 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 20   data for pPage 
2f9d0 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68  */.  const int h
2f9e0 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
2f9f0 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
2fa00 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65   /* Offset of he
2fa10 61 64 65 72 20 6f 6e 20 70 50 61 67 65 20 2a 2f  ader on pPage */
2fa20 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 55 73  .  const int nUs
2fa30 61 62 6c 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  able = pPage->pB
2fa40 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f  t->usableSize; /
2fa50 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66  * Usable size of
2fa60 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65   page */..  asse
2fa70 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
2fa80 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73  flow==0 );.  ass
2fa90 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2faa0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2fab0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2fac0 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30  assert( nCell>=0
2fad0 20 26 26 20 6e 43 65 6c 6c 3c 3d 28 69 6e 74 29   && nCell<=(int)
2fae0 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
2faf0 42 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  Bt).            
2fb00 26 26 20 28 69 6e 74 29 4d 58 5f 43 45 4c 4c 28  && (int)MX_CELL(
2fb10 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39  pPage->pBt)<=109
2fb20 32 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  21);.  assert( s
2fb30 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2fb40 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2fb50 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  bPage) );..  /* 
2fb60 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70  Check that the p
2fb70 61 67 65 20 68 61 73 20 6a 75 73 74 20 62 65 65  age has just bee
2fb80 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a 65 72 6f  n zeroed by zero
2fb90 50 61 67 65 28 29 20 2a 2f 0a 20 20 61 73 73 65  Page() */.  asse
2fba0 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
2fbb0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2fbc0 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f   get2byteNotZero
2fbd0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3d 3d  (&data[hdr+5])==
2fbe0 6e 55 73 61 62 6c 65 20 29 3b 0a 0a 20 20 70 43  nUsable );..  pC
2fbf0 65 6c 6c 70 74 72 20 3d 20 26 70 50 61 67 65 2d  ellptr = &pPage-
2fc00 3e 61 43 65 6c 6c 49 64 78 5b 6e 43 65 6c 6c 2a  >aCellIdx[nCell*
2fc10 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64 79 20 3d  2];.  cellbody =
2fc20 20 6e 55 73 61 62 6c 65 3b 0a 20 20 66 6f 72 28   nUsable;.  for(
2fc30 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30 3b  i=nCell-1; i>=0;
2fc40 20 69 2d 2d 29 7b 0a 20 20 20 20 75 31 36 20 73   i--){.    u16 s
2fc50 7a 20 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20  z = aSize[i];.  
2fc60 20 20 70 43 65 6c 6c 70 74 72 20 2d 3d 20 32 3b    pCellptr -= 2;
2fc70 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 2d 3d  .    cellbody -=
2fc80 20 73 7a 3b 0a 20 20 20 20 70 75 74 32 62 79 74   sz;.    put2byt
2fc90 65 28 70 43 65 6c 6c 70 74 72 2c 20 63 65 6c 6c  e(pCellptr, cell
2fca0 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63 70  body);.    memcp
2fcb0 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79  y(&data[cellbody
2fcc0 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a  ], apCell[i], sz
2fcd0 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74  );.  }.  put2byt
2fce0 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20  e(&data[hdr+3], 
2fcf0 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79  nCell);.  put2by
2fd00 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
2fd10 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50   cellbody);.  pP
2fd20 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 6e  age->nFree -= (n
2fd30 43 65 6c 6c 2a 32 20 2b 20 6e 55 73 61 62 6c 65  Cell*2 + nUsable
2fd40 20 2d 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20   - cellbody);.  
2fd50 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28  pPage->nCell = (
2fd60 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a  u16)nCell;.}../*
2fd70 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
2fd80 67 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 74  g parameters det
2fd90 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20  ermine how many 
2fda0 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67  adjacent pages g
2fdb0 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69  et involved.** i
2fdc0 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70  n a balancing op
2fdd0 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20  eration.  NN is 
2fde0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65  the number of ne
2fdf0 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
2fe00 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65  r side.** of the
2fe10 20 70 61 67 65 20 74 68 61 74 20 70 61 72 74 69   page that parti
2fe20 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61  cipate in the ba
2fe30 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f  lancing operatio
2fe40 6e 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a  n.  NB is the.**
2fe50 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
2fe60 20 70 61 67 65 73 20 74 68 61 74 20 70 61 72 74   pages that part
2fe70 69 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69  icipate, includi
2fe80 6e 67 20 74 68 65 20 74 61 72 67 65 74 20 70 61  ng the target pa
2fe90 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69  ge and.** NN nei
2fea0 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
2feb0 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   side..**.** The
2fec0 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f   minimum value o
2fed0 66 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f  f NN is 1 (of co
2fee0 75 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69  urse).  Increasi
2fef0 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a  ng NN above 1.**
2ff00 20 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76   (to 2 or 3) giv
2ff10 65 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72  es a modest impr
2ff20 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43  ovement in SELEC
2ff30 54 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72  T and DELETE per
2ff40 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65  formance.** in e
2ff50 78 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61  xchange for a la
2ff60 72 67 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e  rger degradation
2ff70 20 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55   in INSERT and U
2ff80 50 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63  PDATE performanc
2ff90 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  e..** The value 
2ffa0 6f 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f  of NN appears to
2ffb0 20 67 69 76 65 20 74 68 65 20 62 65 73 74 20 72   give the best r
2ffc0 65 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a  esults overall..
2ffd0 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20  */.#define NN 1 
2ffe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2fff0 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f  umber of neighbo
30000 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  rs on either sid
30010 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64  e of pPage */.#d
30020 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31  efine NB (NN*2+1
30030 29 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20  )      /* Total 
30040 70 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69  pages involved i
30050 6e 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f  n the balance */
30060 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
30070 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
30080 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  NCE./*.** This v
30090 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63  ersion of balanc
300a0 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20  e() handles the 
300b0 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63  common special c
300c0 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e  ase where.** a n
300d0 65 77 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e  ew entry is bein
300e0 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68  g inserted on th
300f0 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d  e extreme right-
30100 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72  end of the.** tr
30110 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72  ee, in other wor
30120 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77  ds, when the new
30130 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f   entry will beco
30140 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a  me the largest.*
30150 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  * entry in the t
30160 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65  ree..**.** Inste
30170 61 64 20 6f 66 20 74 72 79 69 6e 67 20 74 6f 20  ad of trying to 
30180 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69  balance the 3 ri
30190 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61  ght-most leaf pa
301a0 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a  ges, just add.**
301b0 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74   a new page to t
301c0 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
301d0 64 65 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f  de and put the o
301e0 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a  ne new entry in.
301f0 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20 54  ** that page.  T
30200 68 69 73 20 6c 65 61 76 65 73 20 74 68 65 20 72  his leaves the r
30210 69 67 68 74 20 73 69 64 65 20 6f 66 20 74 68 65  ight side of the
30220 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a   tree somewhat.*
30230 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42  * unbalanced.  B
30240 75 74 20 6f 64 64 73 20 61 72 65 20 74 68 61 74  ut odds are that
30250 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65   we will be inse
30260 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65  rting new entrie
30270 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  s.** at the end 
30280 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20  soon afterwards 
30290 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d  so the nearly em
302a0 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75  pty page will qu
302b0 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70  ickly.** fill up
302c0 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a  .  On average..*
302d0 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68  *.** pPage is th
302e0 65 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63  e leaf page whic
302f0 68 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d  h is the right-m
30300 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ost page in the 
30310 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74  tree..** pParent
30320 20 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20   is its parent. 
30330 20 70 50 61 67 65 20 6d 75 73 74 20 68 61 76 65   pPage must have
30340 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c   a single overfl
30350 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63  ow entry.** whic
30360 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69  h is also the ri
30370 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f  ght-most entry o
30380 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  n the page..**.*
30390 2a 20 54 68 65 20 70 53 70 61 63 65 20 62 75 66  * The pSpace buf
303a0 66 65 72 20 69 73 20 75 73 65 64 20 74 6f 20 73  fer is used to s
303b0 74 6f 72 65 20 61 20 74 65 6d 70 6f 72 61 72 79  tore a temporary
303c0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64 69 76   copy of the div
303d0 69 64 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61  ider.** cell tha
303e0 74 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  t will be insert
303f0 65 64 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e  ed into pParent.
30400 20 53 75 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e   Such a cell con
30410 73 69 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20  sists of a 4.** 
30420 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
30430 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 76   followed by a v
30440 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69  ariable length i
30450 6e 74 65 67 65 72 2e 20 49 6e 20 6f 74 68 65 72  nteger. In other
30460 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f  .** words, at mo
30470 73 74 20 31 33 20 62 79 74 65 73 2e 20 48 65 6e  st 13 bytes. Hen
30480 63 65 20 74 68 65 20 70 53 70 61 63 65 20 62 75  ce the pSpace bu
30490 66 66 65 72 20 6d 75 73 74 20 62 65 20 61 74 0a  ffer must be at.
304a0 2a 2a 20 6c 65 61 73 74 20 31 33 20 62 79 74 65  ** least 13 byte
304b0 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  s in size..*/.st
304c0 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
304d0 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a  _quick(MemPage *
304e0 70 50 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65  pParent, MemPage
304f0 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 53 70   *pPage, u8 *pSp
30500 61 63 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ace){.  BtShared
30510 20 2a 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 50   *const pBt = pP
30520 61 67 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20  age->pBt;    /* 
30530 42 2d 54 72 65 65 20 44 61 74 61 62 61 73 65 20  B-Tree Database 
30540 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  */.  MemPage *pN
30550 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
30560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
30570 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  ly allocated pag
30580 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
30590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
305a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
305b0 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
305c0 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20  Pgno pgnoNew;   
305d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
305e0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
305f0 62 65 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a  ber of pNew */..
30600 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
30610 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
30620 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
30630 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
30640 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
30650 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  able(pParent->pD
30660 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
30670 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
30680 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a  flow==1 );..  /*
30690 20 54 68 69 73 20 65 72 72 6f 72 20 63 6f 6e 64   This error cond
306a0 69 74 69 6f 6e 20 69 73 20 6e 6f 77 20 63 61 75  ition is now cau
306b0 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61  ght prior to rea
306c0 63 68 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  ching this funct
306d0 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ion */.  if( pPa
306e0 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 20 72  ge->nCell==0 ) r
306f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
30700 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a  RUPT_BKPT;..  /*
30710 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
30720 70 61 67 65 2e 20 54 68 69 73 20 70 61 67 65 20  page. This page 
30730 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
30740 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66  right-sibling of
30750 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61   .  ** pPage. Ma
30760 6b 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ke the parent pa
30770 67 65 20 77 72 69 74 61 62 6c 65 2c 20 73 6f 20  ge writable, so 
30780 74 68 61 74 20 74 68 65 20 6e 65 77 20 64 69 76  that the new div
30790 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d  ider cell.  ** m
307a0 61 79 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20  ay be inserted. 
307b0 49 66 20 62 6f 74 68 20 74 68 65 73 65 20 6f 70  If both these op
307c0 65 72 61 74 69 6f 6e 73 20 61 72 65 20 73 75 63  erations are suc
307d0 63 65 73 73 66 75 6c 2c 20 70 72 6f 63 65 65 64  cessful, proceed
307e0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c  ..  */.  rc = al
307f0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
30800 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e  pBt, &pNew, &pgn
30810 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 0a 20 20  oNew, 0, 0);..  
30820 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30830 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20 2a 70 4f  K ){..    u8 *pO
30840 75 74 20 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b  ut = &pSpace[4];
30850 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
30860 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30   pPage->apOvfl[0
30870 5d 3b 0a 20 20 20 20 75 31 36 20 73 7a 43 65 6c  ];.    u16 szCel
30880 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  l = cellSizePtr(
30890 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
308a0 20 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20     u8 *pStop;.. 
308b0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
308c0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
308d0 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65  le(pNew->pDbPage
308e0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
308f0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
30900 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  ==(PTF_INTKEY|PT
30910 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c  F_LEAFDATA|PTF_L
30920 45 41 46 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f  EAF) );.    zero
30930 50 61 67 65 28 70 4e 65 77 2c 20 50 54 46 5f 49  Page(pNew, PTF_I
30940 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41  NTKEY|PTF_LEAFDA
30950 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20  TA|PTF_LEAF);.  
30960 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70    assemblePage(p
30970 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20  New, 1, &pCell, 
30980 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f  &szCell);..    /
30990 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
309a0 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
309b0 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65  base, update the
309c0 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 20   pointer map.   
309d0 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73   ** with entries
309e0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67   for the new pag
309f0 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74  e, and any point
30a00 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20  er from the .   
30a10 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20   ** cell on the 
30a20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66  page to an overf
30a30 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 65 69 74  low page. If eit
30a40 68 65 72 20 6f 66 20 74 68 65 73 65 0a 20 20 20  her of these.   
30a50 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 66   ** operations f
30a60 61 69 6c 73 2c 20 74 68 65 20 72 65 74 75 72 6e  ails, the return
30a70 20 63 6f 64 65 20 69 73 20 73 65 74 2c 20 62 75   code is set, bu
30a80 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20  t the contents. 
30a90 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 72     ** of the par
30aa0 65 6e 74 20 70 61 67 65 20 61 72 65 20 73 74 69  ent page are sti
30ab0 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 62  ll manipulated b
30ac0 79 20 74 68 68 20 63 6f 64 65 20 62 65 6c 6f 77  y thh code below
30ad0 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 69 73  ..    ** That is
30ae0 20 4f 6b 2c 20 61 74 20 74 68 69 73 20 70 6f 69   Ok, at this poi
30af0 6e 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  nt the parent pa
30b00 67 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ge is guaranteed
30b10 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6d 61   to.    ** be ma
30b20 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 52  rked as dirty. R
30b30 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f  eturning an erro
30b40 72 20 63 6f 64 65 20 77 69 6c 6c 20 63 61 75 73  r code will caus
30b50 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  e a.    ** rollb
30b60 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79  ack, undoing any
30b70 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f   changes made to
30b80 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
30b90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
30ba0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
30bb0 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
30bc0 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50  (pBt, pgnoNew, P
30bd0 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61  TRMAP_BTREE, pPa
30be0 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29  rent->pgno, &rc)
30bf0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 43 65  ;.      if( szCe
30c00 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61  ll>pNew->minLoca
30c10 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 74 72  l ){.        ptr
30c20 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 4e  mapPutOvflPtr(pN
30c30 65 77 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b  ew, pCell, &rc);
30c40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
30c50 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20   .    /* Create 
30c60 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 74  a divider cell t
30c70 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 70 50  o insert into pP
30c80 61 72 65 6e 74 2e 20 54 68 65 20 64 69 76 69 64  arent. The divid
30c90 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 63  er cell.    ** c
30ca0 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34 2d 62  onsists of a 4-b
30cb0 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  yte page number 
30cc0 28 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72  (the page number
30cd0 20 6f 66 20 70 50 61 67 65 29 20 61 6e 64 0a 20   of pPage) and. 
30ce0 20 20 20 2a 2a 20 61 20 76 61 72 69 61 62 6c 65     ** a variable
30cf0 20 6c 65 6e 67 74 68 20 6b 65 79 20 76 61 6c 75   length key valu
30d00 65 20 28 77 68 69 63 68 20 6d 75 73 74 20 62 65  e (which must be
30d10 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20   the same value 
30d20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61  as the.    ** la
30d30 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 70 50 61  rgest key on pPa
30d40 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ge)..    **.    
30d50 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68 65 20 6c  ** To find the l
30d60 61 72 67 65 73 74 20 6b 65 79 20 76 61 6c 75 65  argest key value
30d70 20 6f 6e 20 70 50 61 67 65 2c 20 66 69 72 73 74   on pPage, first
30d80 20 66 69 6e 64 20 74 68 65 20 72 69 67 68 74 2d   find the right-
30d90 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63 65 6c  most .    ** cel
30da0 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54 68 65 20  l on pPage. The 
30db0 66 69 72 73 74 20 74 77 6f 20 66 69 65 6c 64 73  first two fields
30dc0 20 6f 66 20 74 68 69 73 20 63 65 6c 6c 20 61 72   of this cell ar
30dd0 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 65  e the .    ** re
30de0 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61 20 76  cord-length (a v
30df0 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69  ariable length i
30e00 6e 74 65 67 65 72 20 61 74 20 6d 6f 73 74 20 33  nteger at most 3
30e10 32 2d 62 69 74 73 20 69 6e 20 73 69 7a 65 29 0a  2-bits in size).
30e20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6b      ** and the k
30e30 65 79 20 76 61 6c 75 65 20 28 61 20 76 61 72 69  ey value (a vari
30e40 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65  able length inte
30e50 67 65 72 2c 20 6d 61 79 20 68 61 76 65 20 61 6e  ger, may have an
30e60 79 20 76 61 6c 75 65 29 2e 0a 20 20 20 20 2a 2a  y value)..    **
30e70 20 54 68 65 20 66 69 72 73 74 20 6f 66 20 74 68   The first of th
30e80 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f  e while(...) loo
30e90 70 73 20 62 65 6c 6f 77 20 73 6b 69 70 73 20 6f  ps below skips o
30ea0 76 65 72 20 74 68 65 20 72 65 63 6f 72 64 2d 6c  ver the record-l
30eb0 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66 69 65  ength.    ** fie
30ec0 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 77  ld. The second w
30ed0 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63  hile(...) loop c
30ee0 6f 70 69 65 73 20 74 68 65 20 6b 65 79 20 76 61  opies the key va
30ef0 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 20  lue from the.   
30f00 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67   ** cell on pPag
30f10 65 20 69 6e 74 6f 20 74 68 65 20 70 53 70 61 63  e into the pSpac
30f20 65 20 62 75 66 66 65 72 2e 0a 20 20 20 20 2a 2f  e buffer..    */
30f30 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  .    pCell = fin
30f40 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61  dCell(pPage, pPa
30f50 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20  ge->nCell-1);.  
30f60 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c    pStop = &pCell
30f70 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [9];.    while( 
30f80 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30  (*(pCell++)&0x80
30f90 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70  ) && pCell<pStop
30fa0 20 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20   );.    pStop = 
30fb0 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77  &pCell[9];.    w
30fc0 68 69 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b  hile( ((*(pOut++
30fd0 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26  ) = *(pCell++))&
30fe0 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70  0x80) && pCell<p
30ff0 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Stop );..    /* 
31000 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64  Insert the new d
31010 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f  ivider cell into
31020 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20   pParent. */.   
31030 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72   insertCell(pPar
31040 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d 3e 6e 43  ent, pParent->nC
31050 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20 28 69 6e  ell, pSpace, (in
31060 74 29 28 70 4f 75 74 2d 70 53 70 61 63 65 29 2c  t)(pOut-pSpace),
31070 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31080 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  0, pPage->pgno, 
31090 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  &rc);..    /* Se
310a0 74 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  t the right-chil
310b0 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 70 50 61  d pointer of pPa
310c0 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rent to point to
310d0 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a   the new page. *
310e0 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  /.    put4byte(&
310f0 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
31100 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
31110 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a  t+8], pgnoNew);.
31120 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73    .    /* Releas
31130 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  e the reference 
31140 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  to the new page.
31150 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73 65 50   */.    releaseP
31160 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a  age(pNew);.  }..
31170 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
31180 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
31190 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
311a0 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a  E */..#if 0./*.*
311b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
311c0 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62  does not contrib
311d0 75 74 65 20 61 6e 79 74 68 69 6e 67 20 74 6f 20  ute anything to 
311e0 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  the operation of
311f0 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69 74 20 69   SQLite..** it i
31200 73 20 73 6f 6d 65 74 69 6d 65 73 20 61 63 74 69  s sometimes acti
31210 76 61 74 65 64 20 74 65 6d 70 6f 72 61 72 69 6c  vated temporaril
31220 79 20 77 68 69 6c 65 20 64 65 62 75 67 67 69 6e  y while debuggin
31230 67 20 63 6f 64 65 20 72 65 73 70 6f 6e 73 69 62  g code responsib
31240 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65 74 74 69  le .** for setti
31250 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  ng pointer-map e
31260 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ntries..*/.stati
31270 63 20 69 6e 74 20 70 74 72 6d 61 70 43 68 65 63  c int ptrmapChec
31280 6b 50 61 67 65 73 28 4d 65 6d 50 61 67 65 20 2a  kPages(MemPage *
31290 2a 61 70 50 61 67 65 2c 20 69 6e 74 20 6e 50 61  *apPage, int nPa
312a0 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  ge){.  int i, j;
312b0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50  .  for(i=0; i<nP
312c0 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50  age; i++){.    P
312d0 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38 20 65 3b  gno n;.    u8 e;
312e0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
312f0 61 67 65 20 3d 20 61 70 50 61 67 65 5b 69 5d 3b  age = apPage[i];
31300 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
31310 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
31320 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
31330 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20  ge->isInit );.. 
31340 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50     for(j=0; j<pP
31350 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b 29  age->nCell; j++)
31360 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f  {.      CellInfo
31370 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 75 38 20   info;.      u8 
31380 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20 20 20 20  *z;.     .      
31390 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  z = findCell(pPa
313a0 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20 62 74  ge, j);.      bt
313b0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
313c0 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e 66 6f 29  pPage, z, &info)
313d0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f  ;.      if( info
313e0 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  .iOverflow ){.  
313f0 20 20 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20        Pgno ovfl 
31400 3d 20 67 65 74 34 62 79 74 65 28 26 7a 5b 69 6e  = get4byte(&z[in
31410 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
31420 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 47 65          ptrmapGe
31430 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 65 2c  t(pBt, ovfl, &e,
31440 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73   &n);.        as
31450 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  sert( n==pPage->
31460 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41  pgno && e==PTRMA
31470 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 3b 0a 20  P_OVERFLOW1 );. 
31480 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
31490 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
314a0 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 63 68  .        Pgno ch
314b0 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 7a  ild = get4byte(z
314c0 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  );.        ptrma
314d0 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c  pGet(pBt, child,
314e0 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20   &e, &n);.      
314f0 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61    assert( n==pPa
31500 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50  ge->pgno && e==P
31510 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20  TRMAP_BTREE );. 
31520 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
31530 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
31540 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  f ){.      Pgno 
31550 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  child = get4byte
31560 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
31570 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
31580 38 5d 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61  8]);.      ptrma
31590 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c  pGet(pBt, child,
315a0 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20   &e, &n);.      
315b0 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65  assert( n==pPage
315c0 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52  ->pgno && e==PTR
315d0 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20  MAP_BTREE );.   
315e0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
315f0 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  1;.}.#endif../*.
31600 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
31610 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 70 79   is used to copy
31620 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
31630 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65   the b-tree node
31640 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20 70   stored .** on p
31650 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67  age pFrom to pag
31660 65 20 70 54 6f 2e 20 49 66 20 70 61 67 65 20 70  e pTo. If page p
31670 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20 61 20 6c  From was not a l
31680 65 61 66 20 70 61 67 65 2c 20 74 68 65 6e 0a 2a  eaf page, then.*
31690 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  * the pointer-ma
316a0 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 65 61  p entries for ea
316b0 63 68 20 63 68 69 6c 64 20 70 61 67 65 20 61 72  ch child page ar
316c0 65 20 75 70 64 61 74 65 64 20 73 6f 20 74 68 61  e updated so tha
316d0 74 20 74 68 65 0a 2a 2a 20 70 61 72 65 6e 74 20  t the.** parent 
316e0 70 61 67 65 20 73 74 6f 72 65 64 20 69 6e 20 74  page stored in t
316f0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69  he pointer map i
31700 73 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70  s page pTo. If p
31710 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65 64 0a 2a  From contained.*
31720 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77 69 74 68  * any cells with
31730 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   overflow page p
31740 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e 20 74 68  ointers, then th
31750 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
31760 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65  pointer.** map e
31770 6e 74 72 69 65 73 20 61 72 65 20 61 6c 73 6f 20  ntries are also 
31780 75 70 64 61 74 65 64 20 73 6f 20 74 68 61 74 20  updated so that 
31790 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
317a0 69 73 20 70 61 67 65 20 70 54 6f 2e 0a 2a 2a 0a  is page pTo..**.
317b0 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69 73 20 63  ** If pFrom is c
317c0 75 72 72 65 6e 74 6c 79 20 63 61 72 72 79 69 6e  urrently carryin
317d0 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63  g any overflow c
317e0 65 6c 6c 73 20 28 65 6e 74 72 69 65 73 20 69 6e  ells (entries in
317f0 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   the.** MemPage.
31800 61 70 4f 76 66 6c 5b 5d 20 61 72 72 61 79 29 2c  apOvfl[] array),
31810 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 63 6f   they are not co
31820 70 69 65 64 20 74 6f 20 70 54 6f 2e 20 0a 2a 2a  pied to pTo. .**
31830 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72  .** Before retur
31840 6e 69 6e 67 2c 20 70 61 67 65 20 70 54 6f 20 69  ning, page pTo i
31850 73 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20  s reinitialized 
31860 75 73 69 6e 67 20 62 74 72 65 65 49 6e 69 74 50  using btreeInitP
31870 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  age()..**.** The
31880 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20   performance of 
31890 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
318a0 20 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e 20 49   not critical. I
318b0 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62  t is only used b
318c0 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61 6e 63  y .** the balanc
318d0 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20 61 6e  e_shallower() an
318e0 64 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  d balance_deeper
318f0 28 29 20 70 72 6f 63 65 64 75 72 65 73 2c 20 6e  () procedures, n
31900 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77 68 69  either of.** whi
31910 63 68 20 61 72 65 20 63 61 6c 6c 65 64 20 6f 66  ch are called of
31920 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d 61 6c  ten under normal
31930 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2e 0a   circumstances..
31940 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
31950 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 4d  opyNodeContent(M
31960 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c 20 4d  emPage *pFrom, M
31970 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20 69 6e 74  emPage *pTo, int
31980 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a   *pRC){.  if( (*
31990 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  pRC)==SQLITE_OK 
319a0 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
319b0 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 46  * const pBt = pF
319c0 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20 20 75 38  rom->pBt;.    u8
319d0 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d 20 3d   * const aFrom =
319e0 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a 20   pFrom->aData;. 
319f0 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 54     u8 * const aT
31a00 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61 3b 0a  o = pTo->aData;.
31a10 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 46      int const iF
31a20 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d 2d 3e  romHdr = pFrom->
31a30 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 69  hdrOffset;.    i
31a40 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48 64 72 20  nt const iToHdr 
31a50 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d 31  = ((pTo->pgno==1
31a60 29 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a 20 20  ) ? 100 : 0);.  
31a70 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e    int rc;.    in
31a80 74 20 69 44 61 74 61 3b 0a 20 20 0a 20 20 0a 20  t iData;.  .  . 
31a90 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
31aa0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20  ->isInit );.    
31ab0 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 6e  assert( pFrom->n
31ac0 46 72 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b 0a  Free>=iToHdr );.
31ad0 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 32      assert( get2
31ae0 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f  byte(&aFrom[iFro
31af0 6d 48 64 72 2b 35 5d 29 20 3c 3d 20 28 69 6e 74  mHdr+5]) <= (int
31b00 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
31b10 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f   );.  .    /* Co
31b20 70 79 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f  py the b-tree no
31b30 64 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  de content from 
31b40 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70 61  page pFrom to pa
31b50 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20 20 20 69  ge pTo. */.    i
31b60 44 61 74 61 20 3d 20 67 65 74 32 62 79 74 65 28  Data = get2byte(
31b70 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b  &aFrom[iFromHdr+
31b80 35 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  5]);.    memcpy(
31b90 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26 61 46  &aTo[iData], &aF
31ba0 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42 74 2d  rom[iData], pBt-
31bb0 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69 44 61 74  >usableSize-iDat
31bc0 61 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  a);.    memcpy(&
31bd0 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26 61 46  aTo[iToHdr], &aF
31be0 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c 20 70  rom[iFromHdr], p
31bf0 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  From->cellOffset
31c00 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65 6c   + 2*pFrom->nCel
31c10 6c 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65  l);.  .    /* Re
31c20 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 20  initialize page 
31c30 70 54 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20  pTo so that the 
31c40 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
31c50 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72  MemPage structur
31c60 65 0a 20 20 20 20 2a 2a 20 6d 61 74 63 68 20 74  e.    ** match t
31c70 68 65 20 6e 65 77 20 64 61 74 61 2e 20 54 68 65  he new data. The
31c80 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
31c90 6f 66 20 70 54 6f 20 63 61 6e 20 61 63 74 75 61  of pTo can actua
31ca0 6c 6c 79 20 66 61 69 6c 20 75 6e 64 65 72 0a 20  lly fail under. 
31cb0 20 20 20 2a 2a 20 66 61 69 72 6c 79 20 6f 62 73     ** fairly obs
31cc0 63 75 72 65 20 63 69 72 63 75 6d 73 74 61 6e 63  cure circumstanc
31cd0 65 73 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20  es, even though 
31ce0 69 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  it is a copy of 
31cf0 69 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20  initialized .   
31d00 20 2a 2a 20 70 61 67 65 20 70 46 72 6f 6d 2e 0a   ** page pFrom..
31d10 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 6f 2d 3e      */.    pTo->
31d20 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20  isInit = 0;.    
31d30 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
31d40 67 65 28 70 54 6f 29 3b 0a 20 20 20 20 69 66 28  ge(pTo);.    if(
31d50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31d60 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72  {.      *pRC = r
31d70 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  c;.      return;
31d80 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
31d90 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
31da0 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
31db0 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20  ase, update the 
31dc0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
31dd0 69 65 73 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61  ies.    ** for a
31de0 6e 79 20 62 2d 74 72 65 65 20 6f 72 20 6f 76 65  ny b-tree or ove
31df0 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74  rflow pages that
31e00 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74 61 69 6e   pTo now contain
31e10 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20 74  s the pointers t
31e20 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  o..    */.    if
31e30 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
31e40 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 73  {.      *pRC = s
31e50 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70  etChildPtrmaps(p
31e60 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  To);.    }.  }.}
31e70 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
31e80 74 69 6e 65 20 72 65 64 69 73 74 72 69 62 75 74  tine redistribut
31e90 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  es cells on the 
31ea0 69 50 61 72 65 6e 74 49 64 78 27 74 68 20 63 68  iParentIdx'th ch
31eb0 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 0a 2a  ild of pParent.*
31ec0 2a 20 28 68 65 72 65 61 66 74 65 72 20 22 74 68  * (hereafter "th
31ed0 65 20 70 61 67 65 22 29 20 61 6e 64 20 75 70 20  e page") and up 
31ee0 74 6f 20 32 20 73 69 62 6c 69 6e 67 73 20 73 6f  to 2 siblings so
31ef0 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20   that all pages 
31f00 68 61 76 65 20 61 62 6f 75 74 20 74 68 65 0a 2a  have about the.*
31f10 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66  * same amount of
31f20 20 66 72 65 65 20 73 70 61 63 65 2e 20 55 73 75   free space. Usu
31f30 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65 20 73 69  ally a single si
31f40 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68 65 72 20  bling on either 
31f50 73 69 64 65 20 6f 66 20 74 68 65 0a 2a 2a 20 70  side of the.** p
31f60 61 67 65 20 61 72 65 20 75 73 65 64 20 69 6e 20  age are used in 
31f70 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74  the balancing, t
31f80 68 6f 75 67 68 20 62 6f 74 68 20 73 69 62 6c 69  hough both sibli
31f90 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20 66  ngs might come f
31fa0 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64 65 20  rom one.** side 
31fb0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 74  if the page is t
31fc0 68 65 20 66 69 72 73 74 20 6f 72 20 6c 61 73 74  he first or last
31fd0 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70 61   child of its pa
31fe0 72 65 6e 74 2e 20 49 66 20 74 68 65 20 70 61 67  rent. If the pag
31ff0 65 20 0a 2a 2a 20 68 61 73 20 66 65 77 65 72 20  e .** has fewer 
32000 74 68 61 6e 20 32 20 73 69 62 6c 69 6e 67 73 20  than 2 siblings 
32010 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63 68  (something which
32020 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
32030 20 69 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   if the page.** 
32040 69 73 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f  is a root page o
32050 72 20 61 20 63 68 69 6c 64 20 6f 66 20 61 20 72  r a child of a r
32060 6f 6f 74 20 70 61 67 65 29 20 74 68 65 6e 20 61  oot page) then a
32070 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73 69 62  ll available sib
32080 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74 69 63 69  lings.** partici
32090 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61  pate in the bala
320a0 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ncing..**.** The
320b0 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69   number of sibli
320c0 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  ngs of the page 
320d0 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61 73  might be increas
320e0 65 64 20 6f 72 20 64 65 63 72 65 61 73 65 64 20  ed or decreased 
320f0 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20 74 77  by .** one or tw
32100 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74  o in an effort t
32110 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61  o keep pages nea
32120 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74  rly full but not
32130 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a 2a 2a 0a   over full. .**.
32140 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 68 65  ** Note that whe
32150 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
32160 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f  s called, some o
32170 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 74  f the cells on t
32180 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69 67 68 74  he page.** might
32190 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65   not actually be
321a0 20 73 74 6f 72 65 64 20 69 6e 20 4d 65 6d 50 61   stored in MemPa
321b0 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54 68 69 73  ge.aData[]. This
321c0 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69   can happen.** i
321d0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 76  f the page is ov
321e0 65 72 66 75 6c 6c 2e 20 54 68 69 73 20 72 6f 75  erfull. This rou
321f0 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61  tine ensures tha
32200 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61 6c 6c 6f  t all cells allo
32210 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  cated.** to the 
32220 70 61 67 65 20 61 6e 64 20 69 74 73 20 73 69 62  page and its sib
32230 6c 69 6e 67 73 20 66 69 74 20 69 6e 74 6f 20 4d  lings fit into M
32240 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 20 62  emPage.aData[] b
32250 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
32260 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f  .**.** In the co
32270 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e  urse of balancin
32280 67 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 69  g the page and i
32290 74 73 20 73 69 62 6c 69 6e 67 73 2c 20 63 65 6c  ts siblings, cel
322a0 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 73  ls may be.** ins
322b0 65 72 74 65 64 20 69 6e 74 6f 20 6f 72 20 72 65  erted into or re
322c0 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
322d0 61 72 65 6e 74 20 70 61 67 65 20 28 70 50 61 72  arent page (pPar
322e0 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73 6f 0a 2a  ent). Doing so.*
322f0 2a 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20  * may cause the 
32300 70 61 72 65 6e 74 20 70 61 67 65 20 74 6f 20 62  parent page to b
32310 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f  ecome overfull o
32320 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 49 66 20  r underfull. If 
32330 74 68 69 73 0a 2a 2a 20 68 61 70 70 65 6e 73 2c  this.** happens,
32340 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   it is the respo
32350 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
32360 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e 76 6f 6b   caller to invok
32370 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a  e the correct.**
32380 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69   balancing routi
32390 6e 65 20 74 6f 20 66 69 78 20 74 68 69 73 20 70  ne to fix this p
323a0 72 6f 62 6c 65 6d 20 28 73 65 65 20 74 68 65 20  roblem (see the 
323b0 62 61 6c 61 6e 63 65 28 29 20 72 6f 75 74 69 6e  balance() routin
323c0 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e). .**.** If th
323d0 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73  is routine fails
323e0 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c   for any reason,
323f0 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65 20   it might leave 
32400 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
32410 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20 73  in a corrupted s
32420 74 61 74 65 2e 20 53 6f 20 69 66 20 74 68 69 73  tate. So if this
32430 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c 20   routine fails, 
32440 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f  the database sho
32450 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64  uld.** be rolled
32460 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   back..**.** The
32470 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
32480 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
32490 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c 20 69 73  , aOvflSpace, is
324a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 0a   a pointer to a.
324b0 2a 2a 20 62 75 66 66 65 72 20 62 69 67 20 65 6e  ** buffer big en
324c0 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 6f 6e 65  ough to hold one
324d0 20 70 61 67 65 2e 20 49 66 20 77 68 69 6c 65 20   page. If while 
324e0 69 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c 73 20  inserting cells 
324f0 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 0a  into the parent.
32500 2a 2a 20 70 61 67 65 20 28 70 50 61 72 65 6e 74  ** page (pParent
32510 29 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  ) the parent pag
32520 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72 66 75  e becomes overfu
32530 6c 6c 2c 20 74 68 69 73 20 62 75 66 66 65 72 20  ll, this buffer 
32540 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74  is.** used to st
32550 6f 72 65 20 74 68 65 20 70 61 72 65 6e 74 27 73  ore the parent's
32560 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
32570 20 42 65 63 61 75 73 65 20 74 68 69 73 20 66 75   Because this fu
32580 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74 73 0a 2a  nction inserts.*
32590 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 66  * a maximum of f
325a0 6f 75 72 20 64 69 76 69 64 65 72 20 63 65 6c 6c  our divider cell
325b0 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  s into the paren
325c0 74 20 70 61 67 65 2c 20 61 6e 64 20 74 68 65 20  t page, and the 
325d0 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65 20  maximum.** size 
325e0 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f 72 65 64  of a cell stored
325f0 20 77 69 74 68 69 6e 20 61 6e 20 69 6e 74 65 72   within an inter
32600 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c 77 61  nal node is alwa
32610 79 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2f 34  ys less than 1/4
32620 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2d  .** of the page-
32630 73 69 7a 65 2c 20 74 68 65 20 61 4f 76 66 6c 53  size, the aOvflS
32640 70 61 63 65 5b 5d 20 62 75 66 66 65 72 20 69 73  pace[] buffer is
32650 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
32660 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67  e large.** enoug
32670 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72 66 6c  h for all overfl
32680 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  ow cells..**.** 
32690 49 66 20 61 4f 76 66 6c 53 70 61 63 65 20 69 73  If aOvflSpace is
326a0 20 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c 20 70   set to a null p
326b0 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e  ointer, this fun
326c0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a  ction returns .*
326d0 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a  * SQLITE_NOMEM..
326e0 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
326f0 4d 53 43 5f 56 45 52 29 20 26 26 20 5f 4d 53 43  MSC_VER) && _MSC
32700 5f 56 45 52 20 3e 3d 20 31 37 30 30 20 26 26 20  _VER >= 1700 && 
32710 64 65 66 69 6e 65 64 28 5f 4d 5f 41 52 4d 29 0a  defined(_M_ARM).
32720 23 70 72 61 67 6d 61 20 6f 70 74 69 6d 69 7a 65  #pragma optimize
32730 28 22 22 2c 20 6f 66 66 29 0a 23 65 6e 64 69 66  ("", off).#endif
32740 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
32750 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20 4d  nce_nonroot(.  M
32760 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
32770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32780 2a 20 50 61 72 65 6e 74 20 70 61 67 65 20 6f 66  * Parent page of
32790 20 73 69 62 6c 69 6e 67 73 20 62 65 69 6e 67 20   siblings being 
327a0 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e  balanced */.  in
327b0 74 20 69 50 61 72 65 6e 74 49 64 78 2c 20 20 20  t iParentIdx,   
327c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
327d0 20 49 6e 64 65 78 20 6f 66 20 22 74 68 65 20 70   Index of "the p
327e0 61 67 65 22 20 69 6e 20 70 50 61 72 65 6e 74 20  age" in pParent 
327f0 2a 2f 0a 20 20 75 38 20 2a 61 4f 76 66 6c 53 70  */.  u8 *aOvflSp
32800 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ace,            
32810 20 20 20 20 20 2f 2a 20 70 61 67 65 2d 73 69 7a       /* page-siz
32820 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
32830 20 66 6f 72 20 70 61 72 65 6e 74 20 6f 76 66 6c   for parent ovfl
32840 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 6f 74   */.  int isRoot
32850 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32860 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
32870 20 70 50 61 72 65 6e 74 20 69 73 20 61 20 72 6f   pParent is a ro
32880 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ot-page */.  int
32890 20 62 42 75 6c 6b 20 20 20 20 20 20 20 20 20 20   bBulk          
328a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
328b0 54 72 75 65 20 69 66 20 74 68 69 73 20 63 61 6c  True if this cal
328c0 6c 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 62  l is part of a b
328d0 75 6c 6b 20 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20  ulk load */.){. 
328e0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
328f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32900 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62   The whole datab
32910 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ase */.  int nCe
32920 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
32930 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
32940 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  of cells in apCe
32950 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ll[] */.  int nM
32960 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20  axCells = 0;    
32970 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
32980 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65  ted size of apCe
32990 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f  ll, szCell, aFro
329a0 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77  m. */.  int nNew
329b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
329c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
329d0 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77  f pages in apNew
329e0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64  [] */.  int nOld
329f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32a00 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
32a10 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64  f pages in apOld
32a20 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  [] */.  int i, j
32a30 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  , k;            
32a40 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
32a50 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  nters */.  int n
32a60 78 44 69 76 3b 20 20 20 20 20 20 20 20 20 20 20  xDiv;           
32a70 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
32a80 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20  divider slot in 
32a90 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d  pParent->aCell[]
32aa0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
32ab0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
32ac0 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
32ad0 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6c   code */.  u16 l
32ae0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20  eafCorrection;  
32af0 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20          /* 4 if 
32b00 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e  pPage is a leaf.
32b10 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20    0 if not */.  
32b20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20  int leafData;   
32b30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32b40 54 72 75 65 20 69 66 20 70 50 61 67 65 20 69 73  True if pPage is
32b50 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41   a leaf of a LEA
32b60 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20  FDATA tree */.  
32b70 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b  int usableSpace;
32b80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32b90 42 79 74 65 73 20 69 6e 20 70 50 61 67 65 20 62  Bytes in pPage b
32ba0 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72  eyond the header
32bb0 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c   */.  int pageFl
32bc0 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
32bd0 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70     /* Value of p
32be0 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a  Page->aData[0] *
32bf0 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c  /.  int subtotal
32c00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32c10 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20   /* Subtotal of 
32c20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f  bytes in cells o
32c30 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20  n one page */.  
32c40 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20 30 3b  int iSpace1 = 0;
32c50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32c60 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74  First unused byt
32c70 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d 20 2a  e of aSpace1[] *
32c80 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c 53 70 61  /.  int iOvflSpa
32c90 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ce = 0;         
32ca0 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64   /* First unused
32cb0 20 62 79 74 65 20 6f 66 20 61 4f 76 66 6c 53 70   byte of aOvflSp
32cc0 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73  ace[] */.  int s
32cd0 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20 20 20  zScratch;       
32ce0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
32cf0 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72  of scratch memor
32d00 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20  y requested */. 
32d10 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b   MemPage *apOld[
32d20 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  NB];          /*
32d30 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
32d40 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f   two siblings */
32d50 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f  .  MemPage *apCo
32d60 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  py[NB];         
32d70 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69 65  /* Private copie
32d80 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67  s of apOld[] pag
32d90 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  es */.  MemPage 
32da0 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  *apNew[NB+2];   
32db0 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e       /* pPage an
32dc0 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69  d up to NB sibli
32dd0 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63  ngs after balanc
32de0 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 70 52 69  ing */.  u8 *pRi
32df0 67 68 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ght;            
32e00 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f        /* Locatio
32e10 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f 66 20 72  n in parent of r
32e20 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 70 6f 69  ight-sibling poi
32e30 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 61 70  nter */.  u8 *ap
32e40 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20 20 20 20  Div[NB-1];      
32e50 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64 65         /* Divide
32e60 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  r cells in pPare
32e70 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e  nt */.  int cntN
32e80 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
32e90 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
32ea0 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c   aCell[] of cell
32eb0 20 61 66 74 65 72 20 69 2d 74 68 20 70 61 67 65   after i-th page
32ec0 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b   */.  int szNew[
32ed0 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
32ee0 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73     /* Combined s
32ef0 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61  ize of cells pla
32f00 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20  ce on i-th page 
32f10 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
32f20 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
32f30 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62    /* All cells b
32f40 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f  egin balanced */
32f50 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20  .  u16 *szCell; 
32f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f70 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66  /* Local size of
32f80 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
32f90 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  Cell[] */.  u8 *
32fa0 61 53 70 61 63 65 31 3b 20 20 20 20 20 20 20 20  aSpace1;        
32fb0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
32fc0 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f 66 20  e for copies of 
32fd0 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 2a  dividers cells *
32fe0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
32ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33000 20 2f 2a 20 54 65 6d 70 20 76 61 72 20 74 6f 20   /* Temp var to 
33010 73 74 6f 72 65 20 61 20 70 61 67 65 20 6e 75 6d  store a page num
33020 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20 70 42 74  ber in */..  pBt
33030 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3b   = pParent->pBt;
33040 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
33050 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
33060 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
33070 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
33080 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
33090 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
330a0 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20 54 52 41   );..#if 0.  TRA
330b0 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65  CE(("BALANCE: be
330c0 67 69 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c  gin page %d chil
330d0 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67  d of %d\n", pPag
330e0 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74  e->pgno, pParent
330f0 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e 64 69 66  ->pgno));.#endif
33100 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
33110 6f 69 6e 74 20 70 50 61 72 65 6e 74 20 6d 61 79  oint pParent may
33120 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e   have at most on
33130 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e  e overflow cell.
33140 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 69   And if.  ** thi
33150 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  s overflow cell 
33160 69 73 20 70 72 65 73 65 6e 74 2c 20 69 74 20 6d  is present, it m
33170 75 73 74 20 62 65 20 74 68 65 20 63 65 6c 6c 20  ust be the cell 
33180 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e 64 65 78  with .  ** index
33190 20 69 50 61 72 65 6e 74 49 64 78 2e 20 54 68 69   iParentIdx. Thi
331a0 73 20 73 63 65 6e 61 72 69 6f 20 63 6f 6d 65 73  s scenario comes
331b0 20 61 62 6f 75 74 20 77 68 65 6e 20 74 68 69 73   about when this
331c0 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69   function.  ** i
331d0 73 20 63 61 6c 6c 65 64 20 28 69 6e 64 69 72 65  s called (indire
331e0 63 74 6c 79 29 20 66 72 6f 6d 20 73 71 6c 69 74  ctly) from sqlit
331f0 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 2e  e3BtreeDelete().
33200 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
33210 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
33220 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74  ow==0 || pParent
33230 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29  ->nOverflow==1 )
33240 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
33250 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  ent->nOverflow==
33260 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 61 69  0 || pParent->ai
33270 4f 76 66 6c 5b 30 5d 3d 3d 69 50 61 72 65 6e 74  Ovfl[0]==iParent
33280 49 64 78 20 29 3b 0a 0a 20 20 69 66 28 20 21 61  Idx );..  if( !a
33290 4f 76 66 6c 53 70 61 63 65 20 29 7b 0a 20 20 20  OvflSpace ){.   
332a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
332b0 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OMEM;.  }..  /* 
332c0 46 69 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67  Find the sibling
332d0 20 70 61 67 65 73 20 74 6f 20 62 61 6c 61 6e 63   pages to balanc
332e0 65 2e 20 41 6c 73 6f 20 6c 6f 63 61 74 65 20 74  e. Also locate t
332f0 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  he cells in pPar
33300 65 6e 74 20 0a 20 20 2a 2a 20 74 68 61 74 20 64  ent .  ** that d
33310 69 76 69 64 65 20 74 68 65 20 73 69 62 6c 69 6e  ivide the siblin
33320 67 73 2e 20 41 6e 20 61 74 74 65 6d 70 74 20 69  gs. An attempt i
33330 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e  s made to find N
33340 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 0a 20  N siblings on . 
33350 20 2a 2a 20 65 69 74 68 65 72 20 73 69 64 65 20   ** either side 
33360 6f 66 20 70 50 61 67 65 2e 20 4d 6f 72 65 20 73  of pPage. More s
33370 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65  iblings are take
33380 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c  n from one side,
33390 20 68 6f 77 65 76 65 72 2c 20 0a 20 20 2a 2a 20   however, .  ** 
333a0 69 66 20 74 68 65 72 65 20 61 72 65 20 66 65 77  if there are few
333b0 65 72 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69  er than NN sibli
333c0 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72  ngs on the other
333d0 20 73 69 64 65 2e 20 49 66 20 70 50 61 72 65 6e   side. If pParen
333e0 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72  t.  ** has NB or
333f0 20 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20   fewer children 
33400 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65  then all childre
33410 6e 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65  n of pParent are
33420 20 74 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a 20   taken.  .  **. 
33430 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c   ** This loop al
33440 73 6f 20 64 72 6f 70 73 20 74 68 65 20 64 69 76  so drops the div
33450 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20  ider cells from 
33460 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
33470 20 54 68 69 73 0a 20 20 2a 2a 20 77 61 79 2c 20   This.  ** way, 
33480 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  the remainder of
33490 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f   the function do
334a0 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 64  es not have to d
334b0 65 61 6c 20 77 69 74 68 20 61 6e 79 0a 20 20 2a  eal with any.  *
334c0 2a 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  * overflow cells
334d0 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70   in the parent p
334e0 61 67 65 2c 20 73 69 6e 63 65 20 69 66 20 61 6e  age, since if an
334f0 79 20 65 78 69 73 74 65 64 20 74 68 65 79 20 77  y existed they w
33500 69 6c 6c 0a 20 20 2a 2a 20 68 61 76 65 20 61 6c  ill.  ** have al
33510 72 65 61 64 79 20 62 65 65 6e 20 72 65 6d 6f 76  ready been remov
33520 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 20 3d 20 70  ed..  */.  i = p
33530 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
33540 77 20 2b 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65  w + pParent->nCe
33550 6c 6c 3b 0a 20 20 69 66 28 20 69 3c 32 20 29 7b  ll;.  if( i<2 ){
33560 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a  .    nxDiv = 0;.
33570 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
33580 65 72 74 28 20 62 42 75 6c 6b 3d 3d 30 20 7c 7c  ert( bBulk==0 ||
33590 20 62 42 75 6c 6b 3d 3d 31 20 29 3b 0a 20 20 20   bBulk==1 );.   
335a0 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d   if( iParentIdx=
335b0 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
335c0 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e 78 44        .      nxD
335d0 69 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  iv = 0;.    }els
335e0 65 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78  e if( iParentIdx
335f0 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e 78 44  ==i ){.      nxD
33600 69 76 20 3d 20 69 2d 32 2b 62 42 75 6c 6b 3b 0a  iv = i-2+bBulk;.
33610 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33620 20 61 73 73 65 72 74 28 20 62 42 75 6c 6b 3d 3d   assert( bBulk==
33630 30 20 29 3b 0a 20 20 20 20 20 20 6e 78 44 69 76  0 );.      nxDiv
33640 20 3d 20 69 50 61 72 65 6e 74 49 64 78 2d 31 3b   = iParentIdx-1;
33650 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 32  .    }.    i = 2
33660 2d 62 42 75 6c 6b 3b 0a 20 20 7d 0a 20 20 6e 4f  -bBulk;.  }.  nO
33670 6c 64 20 3d 20 69 2b 31 3b 0a 20 20 69 66 28 20  ld = i+1;.  if( 
33680 28 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74  (i+nxDiv-pParent
33690 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3d 3d 70 50  ->nOverflow)==pP
336a0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
336b0 20 20 20 20 70 52 69 67 68 74 20 3d 20 26 70 50      pRight = &pP
336c0 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
336d0 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
336e0 38 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  8];.  }else{.   
336f0 20 70 52 69 67 68 74 20 3d 20 66 69 6e 64 43 65   pRight = findCe
33700 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78  ll(pParent, i+nx
33710 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  Div-pParent->nOv
33720 65 72 66 6c 6f 77 29 3b 0a 20 20 7d 0a 20 20 70  erflow);.  }.  p
33730 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70  gno = get4byte(p
33740 52 69 67 68 74 29 3b 0a 20 20 77 68 69 6c 65 28  Right);.  while(
33750 20 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 67   1 ){.    rc = g
33760 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
33770 74 2c 20 70 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b  t, pgno, &apOld[
33780 69 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  i], 0);.    if( 
33790 72 63 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  rc ){.      mems
337a0 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b  et(apOld, 0, (i+
337b0 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  1)*sizeof(MemPag
337c0 65 2a 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  e*));.      goto
337d0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
337e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78  ;.    }.    nMax
337f0 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64  Cells += 1+apOld
33800 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64  [i]->nCell+apOld
33810 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  [i]->nOverflow;.
33820 20 20 20 20 69 66 28 20 28 69 2d 2d 29 3d 3d 30      if( (i--)==0
33830 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 69   ) break;..    i
33840 66 28 20 69 2b 6e 78 44 69 76 3d 3d 70 50 61 72  f( i+nxDiv==pPar
33850 65 6e 74 2d 3e 61 69 4f 76 66 6c 5b 30 5d 20 26  ent->aiOvfl[0] &
33860 26 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  & pParent->nOver
33870 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 61 70  flow ){.      ap
33880 44 69 76 5b 69 5d 20 3d 20 70 50 61 72 65 6e 74  Div[i] = pParent
33890 2d 3e 61 70 4f 76 66 6c 5b 30 5d 3b 0a 20 20 20  ->apOvfl[0];.   
338a0 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
338b0 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20  te(apDiv[i]);.  
338c0 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63      szNew[i] = c
338d0 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65  ellSizePtr(pPare
338e0 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20  nt, apDiv[i]);. 
338f0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 6e 4f       pParent->nO
33900 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
33910 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 70   }else{.      ap
33920 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c  Div[i] = findCel
33930 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44  l(pParent, i+nxD
33940 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  iv-pParent->nOve
33950 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20 70 67  rflow);.      pg
33960 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61 70  no = get4byte(ap
33970 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73  Div[i]);.      s
33980 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69  zNew[i] = cellSi
33990 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61  zePtr(pParent, a
339a0 70 44 69 76 5b 69 5d 29 3b 0a 0a 20 20 20 20 20  pDiv[i]);..     
339b0 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 63 65 6c   /* Drop the cel
339c0 6c 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e  l from the paren
339d0 74 20 70 61 67 65 2e 20 61 70 44 69 76 5b 69 5d  t page. apDiv[i]
339e0 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f   still points to
339f0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 65  .      ** the ce
33a00 6c 6c 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  ll within the pa
33a10 72 65 6e 74 2c 20 65 76 65 6e 20 74 68 6f 75 67  rent, even thoug
33a20 68 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 72  h it has been dr
33a30 6f 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20  opped..      ** 
33a40 54 68 69 73 20 69 73 20 73 61 66 65 20 62 65 63  This is safe bec
33a50 61 75 73 65 20 64 72 6f 70 70 69 6e 67 20 61 20  ause dropping a 
33a60 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72 77 72  cell only overwr
33a70 69 74 65 73 20 74 68 65 20 66 69 72 73 74 0a 20  ites the first. 
33a80 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74       ** four byt
33a90 65 73 20 6f 66 20 69 74 2c 20 61 6e 64 20 74 68  es of it, and th
33aa0 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
33ab0 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20 66 69   not need the fi
33ac0 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75  rst.      ** fou
33ad0 72 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 64  r bytes of the d
33ae0 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 53 6f 20  ivider cell. So 
33af0 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 73  the pointer is s
33b00 61 66 65 20 74 6f 20 75 73 65 0a 20 20 20 20 20  afe to use.     
33b10 20 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e 20 20 0a   ** later on.  .
33b20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
33b30 2a 20 42 75 74 20 6e 6f 74 20 69 66 20 77 65 20  * But not if we 
33b40 61 72 65 20 69 6e 20 73 65 63 75 72 65 2d 64 65  are in secure-de
33b50 6c 65 74 65 20 6d 6f 64 65 2e 20 49 6e 20 73 65  lete mode. In se
33b60 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65  cure-delete mode
33b70 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  ,.      ** the d
33b80 72 6f 70 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e  ropCell() routin
33b90 65 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65  e will overwrite
33ba0 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c   the entire cell
33bb0 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 0a 20 20   with zeroes..  
33bc0 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
33bd0 61 73 65 2c 20 74 65 6d 70 6f 72 61 72 69 6c 79  ase, temporarily
33be0 20 63 6f 70 79 20 74 68 65 20 63 65 6c 6c 20 69   copy the cell i
33bf0 6e 74 6f 20 74 68 65 20 61 4f 76 66 6c 53 70 61  nto the aOvflSpa
33c00 63 65 5b 5d 0a 20 20 20 20 20 20 2a 2a 20 62 75  ce[].      ** bu
33c10 66 66 65 72 2e 20 49 74 20 77 69 6c 6c 20 62 65  ffer. It will be
33c20 20 63 6f 70 69 65 64 20 6f 75 74 20 61 67 61 69   copied out agai
33c30 6e 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65  n as soon as the
33c40 20 61 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72   aSpace[] buffer
33c50 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 6c  .      ** is all
33c60 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20  ocated.  */.    
33c70 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
33c80 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
33c90 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 20  _DELETE ){.     
33ca0 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20     int iOff;..  
33cb0 20 20 20 20 20 20 69 4f 66 66 20 3d 20 53 51 4c        iOff = SQL
33cc0 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 61  ITE_PTR_TO_INT(a
33cd0 70 44 69 76 5b 69 5d 29 20 2d 20 53 51 4c 49 54  pDiv[i]) - SQLIT
33ce0 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 50 61  E_PTR_TO_INT(pPa
33cf0 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20  rent->aData);.  
33d00 20 20 20 20 20 20 69 66 28 20 28 69 4f 66 66 2b        if( (iOff+
33d10 73 7a 4e 65 77 5b 69 5d 29 3e 28 69 6e 74 29 70  szNew[i])>(int)p
33d20 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
33d30 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
33d40 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
33d50 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
33d60 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c  memset(apOld, 0,
33d70 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65   (i+1)*sizeof(Me
33d80 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20  mPage*));.      
33d90 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
33da0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
33db0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
33dc0 20 20 20 6d 65 6d 63 70 79 28 26 61 4f 76 66 6c     memcpy(&aOvfl
33dd0 53 70 61 63 65 5b 69 4f 66 66 5d 2c 20 61 70 44  Space[iOff], apD
33de0 69 76 5b 69 5d 2c 20 73 7a 4e 65 77 5b 69 5d 29  iv[i], szNew[i])
33df0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70 44 69  ;.          apDi
33e00 76 5b 69 5d 20 3d 20 26 61 4f 76 66 6c 53 70 61  v[i] = &aOvflSpa
33e10 63 65 5b 61 70 44 69 76 5b 69 5d 2d 70 50 61 72  ce[apDiv[i]-pPar
33e20 65 6e 74 2d 3e 61 44 61 74 61 5d 3b 0a 20 20 20  ent->aData];.   
33e30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
33e40 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50       dropCell(pP
33e50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70  arent, i+nxDiv-p
33e60 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
33e70 77 2c 20 73 7a 4e 65 77 5b 69 5d 2c 20 26 72 63  w, szNew[i], &rc
33e80 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
33e90 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c  /* Make nMaxCell
33ea0 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20  s a multiple of 
33eb0 34 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72  4 in order to pr
33ec0 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20  eserve 8-byte.  
33ed0 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a  ** alignment */.
33ee0 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e    nMaxCells = (n
33ef0 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33  MaxCells + 3)&~3
33f00 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c  ;..  /*.  ** All
33f10 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
33f20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
33f30 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20 70 42 74  s.  */.  k = pBt
33f40 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 52 4f 55  ->pageSize + ROU
33f50 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61  ND8(sizeof(MemPa
33f60 67 65 29 29 3b 0a 20 20 73 7a 53 63 72 61 74 63  ge));.  szScratc
33f70 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61 78 43  h =.       nMaxC
33f80 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29  ells*sizeof(u8*)
33f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33fa0 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c         /* apCell
33fb0 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43   */.     + nMaxC
33fc0 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36 29  ells*sizeof(u16)
33fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33fe0 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c         /* szCell
33ff0 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e   */.     + pBt->
34000 70 61 67 65 53 69 7a 65 20 20 20 20 20 20 20 20  pageSize        
34010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34020 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61 63 65         /* aSpace
34030 31 20 2a 2f 0a 20 20 20 20 20 2b 20 6b 2a 6e 4f  1 */.     + k*nO
34040 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
34050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34060 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
34070 63 6f 70 69 65 73 20 28 61 70 43 6f 70 79 29 20  copies (apCopy) 
34080 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71  */.  apCell = sq
34090 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c  lite3ScratchMall
340a0 6f 63 28 20 73 7a 53 63 72 61 74 63 68 20 29 3b  oc( szScratch );
340b0 20 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d   .  if( apCell==
340c0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
340d0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
340e0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
340f0 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65  anup;.  }.  szCe
34100 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43 65  ll = (u16*)&apCe
34110 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20  ll[nMaxCells];. 
34120 20 61 53 70 61 63 65 31 20 3d 20 28 75 38 2a 29   aSpace1 = (u8*)
34130 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c  &szCell[nMaxCell
34140 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49  s];.  assert( EI
34150 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
34160 4e 54 28 61 53 70 61 63 65 31 29 20 29 3b 0a 0a  NT(aSpace1) );..
34170 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70    /*.  ** Load p
34180 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63  ointers to all c
34190 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20  ells on sibling 
341a0 70 61 67 65 73 20 61 6e 64 20 74 68 65 20 64 69  pages and the di
341b0 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  vider cells.  **
341c0 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20   into the local 
341d0 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20  apCell[] array. 
341e0 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20   Make copies of 
341f0 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
34200 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63  s.  ** into spac
34210 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
34220 61 53 70 61 63 65 31 5b 5d 20 61 6e 64 20 72 65  aSpace1[] and re
34230 6d 6f 76 65 20 74 68 65 20 64 69 76 69 64 65 72  move the divider
34240 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d   cells.  ** from
34250 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20   pParent..  **. 
34260 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69   ** If the sibli
34270 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66 20  ngs are on leaf 
34280 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65 20  pages, then the 
34290 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f  child pointers o
342a0 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69 64  f the.  ** divid
342b0 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74 72  er cells are str
342c0 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63  ipped from the c
342d0 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65 79  ells before they
342e0 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a   are copied.  **
342f0 20 69 6e 74 6f 20 61 53 70 61 63 65 31 5b 5d 2e   into aSpace1[].
34300 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 61    In this way, a
34310 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
34320 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75 74  ll[] are without
34330 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e  .  ** child poin
34340 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69 6e  ters.  If siblin
34350 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65  gs are not leave
34360 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c  s, then all cell
34370 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b   in.  ** apCell[
34380 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64 20  ] include child 
34390 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68 65  pointers.  Eithe
343a0 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73  r way, all cells
343b0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a   in apCell[].  *
343c0 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a  * are alike..  *
343d0 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65  *.  ** leafCorre
343e0 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50 61  ction:  4 if pPa
343f0 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30  ge is a leaf.  0
34400 20 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74   if pPage is not
34410 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20   a leaf..  **   
34420 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20 31      leafData:  1
34430 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73 20   if pPage holds 
34440 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50 61  key+data and pPa
34450 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20  rent holds only 
34460 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6c 65 61  keys..  */.  lea
34470 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20 61 70  fCorrection = ap
34480 4f 6c 64 5b 30 5d 2d 3e 6c 65 61 66 2a 34 3b 0a  Old[0]->leaf*4;.
34490 20 20 6c 65 61 66 44 61 74 61 20 3d 20 61 70 4f    leafData = apO
344a0 6c 64 5b 30 5d 2d 3e 68 61 73 44 61 74 61 3b 0a  ld[0]->hasData;.
344b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
344c0 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  d; i++){.    int
344d0 20 6c 69 6d 69 74 3b 0a 20 20 20 20 0a 20 20 20   limit;.    .   
344e0 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67   /* Before doing
344f0 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20   anything else, 
34500 74 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  take a copy of t
34510 68 65 20 69 27 74 68 20 6f 72 69 67 69 6e 61 6c  he i'th original
34520 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20   sibling.    ** 
34530 54 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73  The rest of this
34540 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75   function will u
34550 73 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  se data from the
34560 20 63 6f 70 69 65 73 20 72 61 74 68 65 72 0a 20   copies rather. 
34570 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f     ** that the o
34580 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 73 69  riginal pages si
34590 6e 63 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  nce the original
345a0 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20 69   pages will be i
345b0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f  n the.    ** pro
345c0 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 6f 76  cess of being ov
345d0 65 72 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20  erwritten.  */. 
345e0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64     MemPage *pOld
345f0 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28   = apCopy[i] = (
34600 4d 65 6d 50 61 67 65 2a 29 26 61 53 70 61 63 65  MemPage*)&aSpace
34610 31 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  1[pBt->pageSize 
34620 2b 20 6b 2a 69 5d 3b 0a 20 20 20 20 6d 65 6d 63  + k*i];.    memc
34630 70 79 28 70 4f 6c 64 2c 20 61 70 4f 6c 64 5b 69  py(pOld, apOld[i
34640 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  ], sizeof(MemPag
34650 65 29 29 3b 0a 20 20 20 20 70 4f 6c 64 2d 3e 61  e));.    pOld->a
34660 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 70  Data = (void*)&p
34670 4f 6c 64 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63  Old[1];.    memc
34680 70 79 28 70 4f 6c 64 2d 3e 61 44 61 74 61 2c 20  py(pOld->aData, 
34690 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c  apOld[i]->aData,
346a0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b   pBt->pageSize);
346b0 0a 0a 20 20 20 20 6c 69 6d 69 74 20 3d 20 70 4f  ..    limit = pO
346c0 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e  ld->nCell+pOld->
346d0 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69  nOverflow;.    i
346e0 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c  f( pOld->nOverfl
346f0 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20 20 66 6f  ow>0 ){.      fo
34700 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20  r(j=0; j<limit; 
34710 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  j++){.        as
34720 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78  sert( nCell<nMax
34730 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 20  Cells );.       
34740 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   apCell[nCell] =
34750 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c   findOverflowCel
34760 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20  l(pOld, j);.    
34770 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
34780 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  ] = cellSizePtr(
34790 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65  pOld, apCell[nCe
347a0 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e 43  ll]);.        nC
347b0 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ell++;.      }. 
347c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
347d0 75 38 20 2a 61 44 61 74 61 20 3d 20 70 4f 6c 64  u8 *aData = pOld
347e0 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 75  ->aData;.      u
347f0 31 36 20 6d 61 73 6b 50 61 67 65 20 3d 20 70 4f  16 maskPage = pO
34800 6c 64 2d 3e 6d 61 73 6b 50 61 67 65 3b 0a 20 20  ld->maskPage;.  
34810 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73      u16 cellOffs
34820 65 74 20 3d 20 70 4f 6c 64 2d 3e 63 65 6c 6c 4f  et = pOld->cellO
34830 66 66 73 65 74 3b 0a 20 20 20 20 20 20 66 6f 72  ffset;.      for
34840 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a  (j=0; j<limit; j
34850 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
34860 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43  ert( nCell<nMaxC
34870 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20  ells );.        
34880 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  apCell[nCell] = 
34890 66 69 6e 64 43 65 6c 6c 76 32 28 61 44 61 74 61  findCellv2(aData
348a0 2c 20 6d 61 73 6b 50 61 67 65 2c 20 63 65 6c 6c  , maskPage, cell
348b0 4f 66 66 73 65 74 2c 20 6a 29 3b 0a 20 20 20 20  Offset, j);.    
348c0 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
348d0 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  ] = cellSizePtr(
348e0 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65  pOld, apCell[nCe
348f0 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e 43  ll]);.        nC
34900 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ell++;.      }. 
34910 20 20 20 7d 20 20 20 20 20 20 20 0a 20 20 20 20     }       .    
34920 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 26 26 20  if( i<nOld-1 && 
34930 21 6c 65 61 66 44 61 74 61 29 7b 0a 20 20 20 20  !leafData){.    
34940 20 20 75 31 36 20 73 7a 20 3d 20 28 75 31 36 29    u16 sz = (u16)
34950 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20  szNew[i];.      
34960 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20  u8 *pTemp;.     
34970 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e   assert( nCell<n
34980 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
34990 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
349a0 3d 20 73 7a 3b 0a 20 20 20 20 20 20 70 54 65 6d  = sz;.      pTem
349b0 70 20 3d 20 26 61 53 70 61 63 65 31 5b 69 53 70  p = &aSpace1[iSp
349c0 61 63 65 31 5d 3b 0a 20 20 20 20 20 20 69 53 70  ace1];.      iSp
349d0 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20  ace1 += sz;.    
349e0 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42    assert( sz<=pB
349f0 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33 20 29  t->maxLocal+23 )
34a00 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
34a10 69 53 70 61 63 65 31 20 3c 3d 20 28 69 6e 74 29  iSpace1 <= (int)
34a20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
34a30 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54  .      memcpy(pT
34a40 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73  emp, apDiv[i], s
34a50 7a 29 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c  z);.      apCell
34a60 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b  [nCell] = pTemp+
34a70 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
34a80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
34a90 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20  afCorrection==0 
34aa0 7c 7c 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  || leafCorrectio
34ab0 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 73 7a  n==4 );.      sz
34ac0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a  Cell[nCell] = sz
34ad0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 20 6c 65  Cell[nCell] - le
34ae0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
34af0 20 20 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c      if( !pOld->l
34b00 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 61  eaf ){.        a
34b10 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65  ssert( leafCorre
34b20 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  ction==0 );.    
34b30 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64      assert( pOld
34b40 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 30 20 29  ->hdrOffset==0 )
34b50 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;.        /* The
34b60 20 72 69 67 68 74 20 70 6f 69 6e 74 65 72 20 6f   right pointer o
34b70 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  f the child page
34b80 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74 68   pOld becomes th
34b90 65 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20 2a  e left.        *
34ba0 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  * pointer of the
34bb0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f   divider cell */
34bc0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
34bd0 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26  apCell[nCell], &
34be0 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  pOld->aData[8], 
34bf0 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  4);.      }else{
34c00 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
34c10 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
34c20 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =4 );.        if
34c30 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c  ( szCell[nCell]<
34c40 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  4 ){.          /
34c50 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61  * Do not allow a
34c60 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72  ny cells smaller
34c70 20 74 68 61 6e 20 34 20 62 79 74 65 73 2e 20 2a   than 4 bytes. *
34c80 2f 0a 20 20 20 20 20 20 20 20 20 20 73 7a 43 65  /.          szCe
34c90 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20  ll[nCell] = 4;. 
34ca0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
34cb0 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a  .      nCell++;.
34cc0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a      }.  }..  /*.
34cd0 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20    ** Figure out 
34ce0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
34cf0 67 65 73 20 6e 65 65 64 65 64 20 74 6f 20 68 6f  ges needed to ho
34d00 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c  ld all nCell cel
34d10 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74  ls..  ** Store t
34d20 68 69 73 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b  his number in "k
34d30 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65  ".  Also compute
34d40 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20 69   szNew[] which i
34d50 73 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a  s the total.  **
34d60 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
34d70 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 70  ls on the i-th p
34d80 61 67 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d  age and cntNew[]
34d90 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
34da0 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65  dex.  ** in apCe
34db0 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c  ll[] of the cell
34dc0 20 74 68 61 74 20 64 69 76 69 64 65 73 20 70 61   that divides pa
34dd0 67 65 20 69 20 66 72 6f 6d 20 70 61 67 65 20 69  ge i from page i
34de0 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65  +1.  .  ** cntNe
34df0 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75 61  w[k] should equa
34e00 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20  l nCell..  **.  
34e10 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70 75 74  ** Values comput
34e20 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b  ed by this block
34e30 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
34e40 20 20 20 20 20 20 6b 3a 20 54 68 65 20 74 6f 74        k: The tot
34e50 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62  al number of sib
34e60 6c 69 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a 20  ling pages.  ** 
34e70 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61     szNew[i]: Spa
34e80 63 65 64 20 75 73 65 64 20 6f 6e 20 74 68 65 20  ced used on the 
34e90 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67  i-th sibling pag
34ea0 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77  e..  **   cntNew
34eb0 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61 70  [i]: Index in ap
34ec0 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c  Cell[] and szCel
34ed0 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66 69 72 73  l[] for the firs
34ee0 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20  t cell to.  **  
34ef0 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
34f00 72 69 67 68 74 20 6f 66 20 74 68 65 20 69 2d 74  right of the i-t
34f10 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a  h sibling page..
34f20 20 20 2a 2a 20 75 73 61 62 6c 65 53 70 61 63 65    ** usableSpace
34f30 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  : Number of byte
34f40 73 20 6f 66 20 73 70 61 63 65 20 61 76 61 69 6c  s of space avail
34f50 61 62 6c 65 20 6f 6e 20 65 61 63 68 20 73 69 62  able on each sib
34f60 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f  ling..  ** .  */
34f70 0a 20 20 75 73 61 62 6c 65 53 70 61 63 65 20 3d  .  usableSpace =
34f80 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
34f90 20 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f 72 72   - 12 + leafCorr
34fa0 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75  ection;.  for(su
34fb0 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c  btotal=k=i=0; i<
34fc0 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
34fd0 20 61 73 73 65 72 74 28 20 69 3c 6e 4d 61 78 43   assert( i<nMaxC
34fe0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75 62 74  ells );.    subt
34ff0 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69  otal += szCell[i
35000 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 73  ] + 2;.    if( s
35010 75 62 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65  ubtotal > usable
35020 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73  Space ){.      s
35030 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74  zNew[k] = subtot
35040 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a  al - szCell[i];.
35050 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20        cntNew[k] 
35060 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  = i;.      if( l
35070 65 61 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20  eafData ){ i--; 
35080 7d 0a 20 20 20 20 20 20 73 75 62 74 6f 74 61 6c  }.      subtotal
35090 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b   = 0;.      k++;
350a0 0a 20 20 20 20 20 20 69 66 28 20 6b 3e 4e 42 2b  .      if( k>NB+
350b0 31 20 29 7b 20 72 63 20 3d 20 53 51 4c 49 54 45  1 ){ rc = SQLITE
350c0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 67  _CORRUPT_BKPT; g
350d0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
350e0 6e 75 70 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 7d  nup; }.    }.  }
350f0 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75  .  szNew[k] = su
35100 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77  btotal;.  cntNew
35110 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b  [k] = nCell;.  k
35120 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ++;..  /*.  ** T
35130 68 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75  he packing compu
35140 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69  ted by the previ
35150 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61  ous block is bia
35160 73 65 64 20 74 6f 77 61 72 64 20 74 68 65 20 73  sed toward the s
35170 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20  iblings.  ** on 
35180 74 68 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20  the left side.  
35190 54 68 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67  The left sibling
351a0 73 20 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61  s are always nea
351b0 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20  rly full, while 
351c0 74 68 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d  the.  ** right-m
351d0 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68  ost sibling migh
351e0 74 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74  t be nearly empt
351f0 79 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f  y.  This block o
35200 66 20 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a  f code attempts.
35210 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74    ** to adjust t
35220 68 65 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69  he packing of si
35230 62 6c 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20  blings to get a 
35240 62 65 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a  better balance..
35250 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61    **.  ** This a
35260 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72  djustment is mor
35270 65 20 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69  e than an optimi
35280 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63  zation.  The pac
35290 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74  king above might
352a0 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20  .  ** be so out 
352b0 6f 66 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f  of balance as to
352c0 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f   be illegal.  Fo
352d0 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72  r example, the r
352e0 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73  ight-most.  ** s
352f0 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20  ibling might be 
35300 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
35310 2e 20 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65  .  This adjustme
35320 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e  nt is not option
35330 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  al..  */.  for(i
35340 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  =k-1; i>0; i--){
35350 0a 20 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74  .    int szRight
35360 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a   = szNew[i];  /*
35370 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67   Size of sibling
35380 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f   on the right */
35390 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20  .    int szLeft 
353a0 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a  = szNew[i-1]; /*
353b0 20 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67   Size of sibling
353c0 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a   on the left */.
353d0 20 20 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20      int r;      
353e0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
353f0 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63   of right-most c
35400 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c  ell in left sibl
35410 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64  ing */.    int d
35420 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
35430 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
35440 20 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66   cell to the lef
35450 74 20 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69  t of right sibli
35460 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63  ng */..    r = c
35470 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a  ntNew[i-1] - 1;.
35480 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20      d = r + 1 - 
35490 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73  leafData;.    as
354a0 73 65 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c  sert( d<nMaxCell
354b0 73 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  s );.    assert(
354c0 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   r<nMaxCells );.
354d0 20 20 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67      while( szRig
354e0 68 74 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c  ht==0 .       ||
354f0 20 28 21 62 42 75 6c 6b 20 26 26 20 73 7a 52 69   (!bBulk && szRi
35500 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c  ght+szCell[d]+2<
35510 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b  =szLeft-(szCell[
35520 72 5d 2b 32 29 29 20 0a 20 20 20 20 29 7b 0a 20  r]+2)) .    ){. 
35530 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20       szRight += 
35540 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20  szCell[d] + 2;. 
35550 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73       szLeft -= s
35560 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20  zCell[r] + 2;.  
35570 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d      cntNew[i-1]-
35580 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74  -;.      r = cnt
35590 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20  New[i-1] - 1;.  
355a0 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20      d = r + 1 - 
355b0 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a  leafData;.    }.
355c0 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73      szNew[i] = s
355d0 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65  zRight;.    szNe
355e0 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b  w[i-1] = szLeft;
355f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65  .  }..  /* Eithe
35600 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f  r we found one o
35610 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e  r more cells (cn
35620 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70  tnew[0])>0) or p
35630 50 61 67 65 20 69 73 0a 20 20 2a 2a 20 61 20 76  Page is.  ** a v
35640 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
35650 2e 20 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f  .  A virtual roo
35660 74 20 70 61 67 65 20 69 73 20 77 68 65 6e 20 74  t page is when t
35670 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a  he real root.  *
35680 2a 20 70 61 67 65 20 69 73 20 70 61 67 65 20 31  * page is page 1
35690 20 61 6e 64 20 77 65 20 61 72 65 20 74 68 65 20   and we are the 
356a0 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68  only child of th
356b0 61 74 20 70 61 67 65 2e 0a 20 20 2a 2a 0a 20 20  at page..  **.  
356c0 2a 2a 20 55 50 44 41 54 45 3a 20 20 54 68 65 20  ** UPDATE:  The 
356d0 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20 69  assert() below i
356e0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
356f0 79 20 74 72 75 65 20 69 66 20 74 68 65 20 64 61  y true if the da
35700 74 61 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65  tabase.  ** file
35710 20 69 73 20 63 6f 72 72 75 70 74 2e 20 20 54 68   is corrupt.  Th
35720 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c  e corruption wil
35730 6c 20 62 65 20 64 65 74 65 63 74 65 64 20 61 6e  l be detected an
35740 64 20 72 65 70 6f 72 74 65 64 20 6c 61 74 65 72  d reported later
35750 0a 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 70 72  .  ** in this pr
35760 6f 63 65 64 75 72 65 20 73 6f 20 74 68 65 72 65  ocedure so there
35770 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 61   is no need to a
35780 63 74 20 75 70 6f 6e 20 69 74 20 6e 6f 77 2e 0a  ct upon it now..
35790 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73    */.#if 0.  ass
357a0 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30  ert( cntNew[0]>0
357b0 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67   || (pParent->pg
357c0 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74  no==1 && pParent
357d0 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 23  ->nCell==0) );.#
357e0 65 6e 64 69 66 0a 0a 20 20 54 52 41 43 45 28 28  endif..  TRACE((
357f0 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25  "BALANCE: old: %
35800 64 20 25 64 20 25 64 20 20 22 2c 0a 20 20 20 20  d %d %d  ",.    
35810 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c 20  apOld[0]->pgno, 
35820 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 61  .    nOld>=2 ? a
35830 70 4f 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20  pOld[1]->pgno : 
35840 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f  0,.    nOld>=3 ?
35850 20 61 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f 20   apOld[2]->pgno 
35860 3a 20 30 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 0a  : 0.  ));..  /*.
35870 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20    ** Allocate k 
35880 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65 75 73  new pages.  Reus
35890 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72  e old pages wher
358a0 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f  e possible..  */
358b0 0a 20 20 69 66 28 20 61 70 4f 6c 64 5b 30 5d 2d  .  if( apOld[0]-
358c0 3e 70 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20 20  >pgno<=1 ){.    
358d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
358e0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f  UPT_BKPT;.    go
358f0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
35900 75 70 3b 0a 20 20 7d 0a 20 20 70 61 67 65 46 6c  up;.  }.  pageFl
35910 61 67 73 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e  ags = apOld[0]->
35920 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28  aData[0];.  for(
35930 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=0; i<k; i++){.
35940 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
35950 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c  w;.    if( i<nOl
35960 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20  d ){.      pNew 
35970 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f  = apNew[i] = apO
35980 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f  ld[i];.      apO
35990 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ld[i] = 0;.     
359a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
359b0 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44  erWrite(pNew->pD
359c0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e  bPage);.      nN
359d0 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ew++;.      if( 
359e0 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
359f0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  e_cleanup;.    }
35a00 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
35a10 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20  rt( i>0 );.     
35a20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
35a30 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e  reePage(pBt, &pN
35a40 65 77 2c 20 26 70 67 6e 6f 2c 20 28 62 42 75 6c  ew, &pgno, (bBul
35a50 6b 20 3f 20 31 20 3a 20 70 67 6e 6f 29 2c 20 30  k ? 1 : pgno), 0
35a60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
35a70 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
35a80 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 70  leanup;.      ap
35a90 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20  New[i] = pNew;. 
35aa0 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a 20 20       nNew++;..  
35ab0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 70      /* Set the p
35ac0 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
35ad0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 69 62   for the new sib
35ae0 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20  ling page. */.  
35af0 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
35b00 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  CUUM ){.        
35b10 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
35b20 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41  New->pgno, PTRMA
35b30 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74  P_BTREE, pParent
35b40 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  ->pgno, &rc);.  
35b50 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
35b60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
35b70 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63       goto balanc
35b80 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
35b90 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
35ba0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65   }.  }..  /* Fre
35bb0 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20  e any old pages 
35bc0 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65  that were not re
35bd0 75 73 65 64 20 61 73 20 6e 65 77 20 70 61 67 65  used as new page
35be0 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  s..  */.  while(
35bf0 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 66   i<nOld ){.    f
35c00 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d  reePage(apOld[i]
35c10 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20  , &rc);.    if( 
35c20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
35c30 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72  e_cleanup;.    r
35c40 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64  eleasePage(apOld
35c50 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b  [i]);.    apOld[
35c60 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b  i] = 0;.    i++;
35c70 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
35c80 50 75 74 20 74 68 65 20 6e 65 77 20 70 61 67 65  Put the new page
35c90 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f  s in accending o
35ca0 72 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70  rder.  This help
35cb0 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65  s to.  ** keep e
35cc0 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 64 69  ntries in the di
35cd0 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  sk file in order
35ce0 20 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a   so that a scan.
35cf0 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c    ** of the tabl
35d00 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63  e is a linear sc
35d10 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 66  an through the f
35d20 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20  ile.  That.  ** 
35d30 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68  in turn helps th
35d40 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
35d50 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61  em to deliver pa
35d60 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68  ges.  ** from th
35d70 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69  e disk more rapi
35d80 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  dly..  **.  ** A
35d90 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69  n O(n^2) inserti
35da0 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68  on sort algorith
35db0 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74 20 73  m is used, but s
35dc0 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e  ince.  ** n is n
35dd0 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e  ever more than N
35de0 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74  B (a small const
35df0 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c  ant), that shoul
35e00 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20  d.  ** not be a 
35e10 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20  problem..  **.  
35e20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74  ** When NB==3, t
35e30 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61  his one optimiza
35e40 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64  tion makes the d
35e50 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f  atabase.  ** abo
35e60 75 74 20 32 35 25 20 66 61 73 74 65 72 20 66 6f  ut 25% faster fo
35e70 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f  r large insertio
35e80 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73  ns and deletions
35e90 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
35ea0 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20  ; i<k-1; i++){. 
35eb0 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 61 70     int minV = ap
35ec0 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20  New[i]->pgno;.  
35ed0 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a    int minI = i;.
35ee0 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a      for(j=i+1; j
35ef0 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; j++){.      
35f00 69 66 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67  if( apNew[j]->pg
35f10 6e 6f 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e  no<(unsigned)min
35f20 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e  V ){.        min
35f30 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d  I = j;.        m
35f40 69 6e 56 20 3d 20 61 70 4e 65 77 5b 6a 5d 2d 3e  inV = apNew[j]->
35f50 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pgno;.      }.  
35f60 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e 49    }.    if( minI
35f70 3e 69 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50  >i ){.      MemP
35f80 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20 70  age *pT;.      p
35f90 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20  T = apNew[i];.  
35fa0 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61      apNew[i] = a
35fb0 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20  pNew[minI];.    
35fc0 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20    apNew[minI] = 
35fd0 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  pT;.    }.  }.  
35fe0 54 52 41 43 45 28 28 22 6e 65 77 3a 20 25 64 28  TRACE(("new: %d(
35ff0 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
36000 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 5c  ) %d(%d) %d(%d)\
36010 6e 22 2c 0a 20 20 20 20 61 70 4e 65 77 5b 30 5d  n",.    apNew[0]
36020 2d 3e 70 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30 5d  ->pgno, szNew[0]
36030 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20  ,.    nNew>=2 ? 
36040 61 70 4e 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20 3a  apNew[1]->pgno :
36050 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a   0, nNew>=2 ? sz
36060 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20  New[1] : 0,.    
36070 6e 4e 65 77 3e 3d 33 20 3f 20 61 70 4e 65 77 5b  nNew>=3 ? apNew[
36080 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e  2]->pgno : 0, nN
36090 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d  ew>=3 ? szNew[2]
360a0 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d   : 0,.    nNew>=
360b0 34 20 3f 20 61 70 4e 65 77 5b 33 5d 2d 3e 70 67  4 ? apNew[3]->pg
360c0 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20  no : 0, nNew>=4 
360d0 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a  ? szNew[3] : 0,.
360e0 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 61 70      nNew>=5 ? ap
360f0 4e 65 77 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20 30  New[4]->pgno : 0
36100 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65  , nNew>=5 ? szNe
36110 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 61  w[4] : 0));..  a
36120 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
36130 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
36140 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
36150 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 70   );.  put4byte(p
36160 52 69 67 68 74 2c 20 61 70 4e 65 77 5b 6e 4e 65  Right, apNew[nNe
36170 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20  w-1]->pgno);..  
36180 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64  /*.  ** Evenly d
36190 69 73 74 72 69 62 75 74 65 20 74 68 65 20 64 61  istribute the da
361a0 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ta in apCell[] a
361b0 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20 70 61  cross the new pa
361c0 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74  ges..  ** Insert
361d0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69   divider cells i
361e0 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73 20 6e  nto pParent as n
361f0 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
36200 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d   j = 0;.  for(i=
36210 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b  0; i<nNew; i++){
36220 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65  .    /* Assemble
36230 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67   the new sibling
36240 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65   page. */.    Me
36250 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70  mPage *pNew = ap
36260 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65  New[i];.    asse
36270 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( j<nMaxCells 
36280 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28  );.    zeroPage(
36290 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29  pNew, pageFlags)
362a0 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61  ;.    assemblePa
362b0 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b  ge(pNew, cntNew[
362c0 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d  i]-j, &apCell[j]
362d0 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20  , &szCell[j]);. 
362e0 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
362f0 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65  >nCell>0 || (nNe
36300 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30  w==1 && cntNew[0
36310 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73  ]==0) );.    ass
36320 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72  ert( pNew->nOver
36330 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  flow==0 );..    
36340 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a  j = cntNew[i];..
36350 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69      /* If the si
36360 62 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d  bling page assem
36370 62 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e  bled above was n
36380 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ot the right-mos
36390 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a  t sibling,.    *
363a0 2a 20 69 6e 73 65 72 74 20 61 20 64 69 76 69 64  * insert a divid
363b0 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65  er cell into the
363c0 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20   parent page..  
363d0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
363e0 20 69 3c 6e 4e 65 77 2d 31 20 7c 7c 20 6a 3d 3d   i<nNew-1 || j==
363f0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28  nCell );.    if(
36400 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20   j<nCell ){.    
36410 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20    u8 *pCell;.   
36420 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20     u8 *pTemp;.  
36430 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20      int sz;..   
36440 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61     assert( j<nMa
36450 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
36460 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a  pCell = apCell[j
36470 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73 7a  ];.      sz = sz
36480 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f  Cell[j] + leafCo
36490 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20  rrection;.      
364a0 70 54 65 6d 70 20 3d 20 26 61 4f 76 66 6c 53 70  pTemp = &aOvflSp
364b0 61 63 65 5b 69 4f 76 66 6c 53 70 61 63 65 5d 3b  ace[iOvflSpace];
364c0 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77  .      if( !pNew
364d0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
364e0 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e    memcpy(&pNew->
364f0 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c  aData[8], pCell,
36500 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   4);.      }else
36510 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b   if( leafData ){
36520 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
36530 68 65 20 74 72 65 65 20 69 73 20 61 20 6c 65 61  he tree is a lea
36540 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61 6e 64  f-data tree, and
36550 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
36560 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20 20 20  e leaves, .     
36570 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
36580 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72 20 63   is no divider c
36590 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e  ell in apCell[].
365a0 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 64 69   Instead, the di
365b0 76 69 64 65 72 20 0a 20 20 20 20 20 20 20 20 2a  vider .        *
365c0 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  * cell consists 
365d0 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b  of the integer k
365e0 65 79 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  ey for the right
365f0 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20  -most cell of . 
36600 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 69         ** the si
36610 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73 65 6d  bling-page assem
36620 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e  bled above only.
36630 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
36640 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
36650 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a  o;.        j--;.
36660 20 20 20 20 20 20 20 20 62 74 72 65 65 50 61 72          btreePar
36670 73 65 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20  seCellPtr(pNew, 
36680 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f  apCell[j], &info
36690 29 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  );.        pCell
366a0 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 20 20   = pTemp;.      
366b0 20 20 73 7a 20 3d 20 34 20 2b 20 70 75 74 56 61    sz = 4 + putVa
366c0 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20  rint(&pCell[4], 
366d0 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 20 20 20 20  info.nKey);.    
366e0 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20      pTemp = 0;. 
366f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
36700 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a      pCell -= 4;.
36710 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 73 63 75          /* Obscu
36720 72 65 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d  re case for non-
36730 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 73 3a  leaf-data trees:
36740 20 49 66 20 74 68 65 20 63 65 6c 6c 20 61 74 20   If the cell at 
36750 70 43 65 6c 6c 20 77 61 73 0a 20 20 20 20 20 20  pCell was.      
36760 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20    ** previously 
36770 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61 66  stored on a leaf
36780 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73 20 72   node, and its r
36790 65 70 6f 72 74 65 64 20 73 69 7a 65 20 77 61 73  eported size was
367a0 20 34 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79   4.        ** by
367b0 74 65 73 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  tes, then it may
367c0 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 6d 61   actually be sma
367d0 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73 20 0a  ller than this .
367e0 20 20 20 20 20 20 20 20 2a 2a 20 28 73 65 65 20          ** (see 
367f0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
36800 72 28 29 2c 20 34 20 62 79 74 65 73 20 69 73 20  r(), 4 bytes is 
36810 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65  the minimum size
36820 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61   of.        ** a
36830 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69 74  ny cell). But it
36840 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
36850 20 70 61 73 73 20 74 68 65 20 63 6f 72 72 65 63   pass the correc
36860 74 20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20  t size to .     
36870 20 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c     ** insertCell
36880 28 29 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74  (), so reparse t
36890 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20  he cell now..   
368a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
368b0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  ** Note that thi
368c0 73 20 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70  s can never happ
368d0 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20  en in an SQLite 
368e0 64 61 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c  data file, as al
368f0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c  l.        ** cel
36900 6c 73 20 61 72 65 20 61 74 20 6c 65 61 73 74 20  ls are at least 
36910 34 20 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79  4 bytes. It only
36920 20 68 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72   happens in b-tr
36930 65 65 73 20 75 73 65 64 0a 20 20 20 20 20 20 20  ees used.       
36940 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20   ** to evaluate 
36950 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29  "IN (SELECT ...)
36960 22 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c  " and similar cl
36970 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  auses..        *
36980 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a  /.        if( sz
36990 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20  Cell[j]==4 ){.  
369a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 6c          assert(l
369b0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34  eafCorrection==4
369c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20  );.          sz 
369d0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
369e0 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20  arent, pCell);. 
369f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
36a00 0a 20 20 20 20 20 20 69 4f 76 66 6c 53 70 61 63  .      iOvflSpac
36a10 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61  e += sz;.      a
36a20 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e  ssert( sz<=pBt->
36a30 6d 61 78 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a 20  maxLocal+23 );. 
36a40 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4f 76       assert( iOv
36a50 66 6c 53 70 61 63 65 20 3c 3d 20 28 69 6e 74 29  flSpace <= (int)
36a60 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
36a70 0a 20 20 20 20 20 20 69 6e 73 65 72 74 43 65 6c  .      insertCel
36a80 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
36a90 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65  , pCell, sz, pTe
36aa0 6d 70 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20  mp, pNew->pgno, 
36ab0 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &rc);.      if( 
36ac0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
36ad0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
36ae0 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 73 73 65  anup;.      asse
36af0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
36b00 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
36b10 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
36b20 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  ..      j++;.   
36b30 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20     nxDiv++;.    
36b40 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
36b50 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  j==nCell );.  as
36b60 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a  sert( nOld>0 );.
36b70 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30    assert( nNew>0
36b80 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65 46   );.  if( (pageF
36b90 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46 29  lags & PTF_LEAF)
36ba0 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a  ==0 ){.    u8 *z
36bb0 43 68 69 6c 64 20 3d 20 26 61 70 43 6f 70 79 5b  Child = &apCopy[
36bc0 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38  nOld-1]->aData[8
36bd0 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61  ];.    memcpy(&a
36be0 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44  pNew[nNew-1]->aD
36bf0 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c 20  ata[8], zChild, 
36c00 34 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69  4);.  }..  if( i
36c10 73 52 6f 6f 74 20 26 26 20 70 50 61 72 65 6e 74  sRoot && pParent
36c20 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70 50  ->nCell==0 && pP
36c30 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
36c40 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65  <=apNew[0]->nFre
36c50 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  e ){.    /* The 
36c60 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
36c70 20 62 2d 74 72 65 65 20 6e 6f 77 20 63 6f 6e 74   b-tree now cont
36c80 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 54  ains no cells. T
36c90 68 65 20 6f 6e 6c 79 20 73 69 62 6c 69 6e 67 0a  he only sibling.
36ca0 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 74      ** page is t
36cb0 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f  he right-child o
36cc0 66 20 74 68 65 20 70 61 72 65 6e 74 2e 20 43 6f  f the parent. Co
36cd0 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  py the contents 
36ce0 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 68  of the.    ** ch
36cf0 69 6c 64 20 70 61 67 65 20 69 6e 74 6f 20 74 68  ild page into th
36d00 65 20 70 61 72 65 6e 74 2c 20 64 65 63 72 65 61  e parent, decrea
36d10 73 69 6e 67 20 74 68 65 20 6f 76 65 72 61 6c 6c  sing the overall
36d20 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 0a 20   height of the. 
36d30 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 73 74 72     ** b-tree str
36d40 75 63 74 75 72 65 20 62 79 20 6f 6e 65 2e 20 54  ucture by one. T
36d50 68 69 73 20 69 73 20 64 65 73 63 72 69 62 65 64  his is described
36d60 20 61 73 20 74 68 65 20 22 62 61 6c 61 6e 63 65   as the "balance
36d70 2d 73 68 61 6c 6c 6f 77 65 72 22 0a 20 20 20 20  -shallower".    
36d80 2a 2a 20 73 75 62 2d 61 6c 67 6f 72 69 74 68 6d  ** sub-algorithm
36d90 20 69 6e 20 73 6f 6d 65 20 64 6f 63 75 6d 65 6e   in some documen
36da0 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a 20  tation..    **. 
36db0 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
36dc0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
36dd0 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 61  database, the ca
36de0 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f 64 65 43 6f  ll to copyNodeCo
36df0 6e 74 65 6e 74 28 29 20 0a 20 20 20 20 2a 2a 20  ntent() .    ** 
36e00 73 65 74 73 20 61 6c 6c 20 70 6f 69 6e 74 65 72  sets all pointer
36e10 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63 6f 72  -map entries cor
36e20 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 64 61  responding to da
36e30 74 61 62 61 73 65 20 69 6d 61 67 65 20 70 61 67  tabase image pag
36e40 65 73 20 0a 20 20 20 20 2a 2a 20 66 6f 72 20 77  es .    ** for w
36e50 68 69 63 68 20 74 68 65 20 70 6f 69 6e 74 65 72  hich the pointer
36e60 20 69 73 20 73 74 6f 72 65 64 20 77 69 74 68 69   is stored withi
36e70 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 62 65  n the content be
36e80 69 6e 67 20 63 6f 70 69 65 64 2e 0a 20 20 20 20  ing copied..    
36e90 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 65  **.    ** The se
36ea0 63 6f 6e 64 20 61 73 73 65 72 74 20 62 65 6c 6f  cond assert belo
36eb0 77 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20  w verifies that 
36ec0 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 69  the child page i
36ed0 73 20 64 65 66 72 61 67 6d 65 6e 74 65 64 0a 20  s defragmented. 
36ee0 20 20 20 2a 2a 20 28 69 74 20 6d 75 73 74 20 62     ** (it must b
36ef0 65 2c 20 61 73 20 69 74 20 77 61 73 20 6a 75 73  e, as it was jus
36f00 74 20 72 65 63 6f 6e 73 74 72 75 63 74 65 64 20  t reconstructed 
36f10 75 73 69 6e 67 20 61 73 73 65 6d 62 6c 65 50 61  using assemblePa
36f20 67 65 28 29 29 2e 20 54 68 69 73 0a 20 20 20 20  ge()). This.    
36f30 2a 2a 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  ** is important 
36f40 69 66 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  if the parent pa
36f50 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  ge happens to be
36f60 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   page 1 of the d
36f70 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 69  atabase.    ** i
36f80 6d 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73  mage.  */.    as
36f90 73 65 72 74 28 20 6e 4e 65 77 3d 3d 31 20 29 3b  sert( nNew==1 );
36fa0 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70 4e  .    assert( apN
36fb0 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 3d 3d 20  ew[0]->nFree == 
36fc0 0a 20 20 20 20 20 20 20 20 28 67 65 74 32 62 79  .        (get2by
36fd0 74 65 28 26 61 70 4e 65 77 5b 30 5d 2d 3e 61 44  te(&apNew[0]->aD
36fe0 61 74 61 5b 35 5d 29 2d 61 70 4e 65 77 5b 30 5d  ata[5])-apNew[0]
36ff0 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2d 61 70 4e  ->cellOffset-apN
37000 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a 32 29 20  ew[0]->nCell*2) 
37010 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6f 70 79  .    );.    copy
37020 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 61 70 4e 65  NodeContent(apNe
37030 77 5b 30 5d 2c 20 70 50 61 72 65 6e 74 2c 20 26  w[0], pParent, &
37040 72 63 29 3b 0a 20 20 20 20 66 72 65 65 50 61 67  rc);.    freePag
37050 65 28 61 70 4e 65 77 5b 30 5d 2c 20 26 72 63 29  e(apNew[0], &rc)
37060 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53  ;.  }else if( IS
37070 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
37080 20 20 2f 2a 20 46 69 78 20 74 68 65 20 70 6f 69    /* Fix the poi
37090 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
370a0 20 66 6f 72 20 61 6c 6c 20 74 68 65 20 63 65 6c   for all the cel
370b0 6c 73 20 74 68 61 74 20 77 65 72 65 20 73 68 69  ls that were shi
370c0 66 74 65 64 20 61 72 6f 75 6e 64 2e 20 0a 20 20  fted around. .  
370d0 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73    ** There are s
370e0 65 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e 74  everal different
370f0 20 74 79 70 65 73 20 6f 66 20 70 6f 69 6e 74 65   types of pointe
37100 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 74 68  r-map entries th
37110 61 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 2a  at need to.    *
37120 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20  * be dealt with 
37130 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
37140 20 53 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 68   Some of these h
37150 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 6c 72  ave been set alr
37160 65 61 64 79 2c 20 62 75 74 0a 20 20 20 20 2a 2a  eady, but.    **
37170 20 6d 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e 20   many have not. 
37180 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  The following is
37190 20 61 20 73 75 6d 6d 61 72 79 3a 0a 20 20 20 20   a summary:.    
371a0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 31 29 20 54  **.    **   1) T
371b0 68 65 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63  he entries assoc
371c0 69 61 74 65 64 20 77 69 74 68 20 6e 65 77 20 73  iated with new s
371d0 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 68 61  ibling pages tha
371e0 74 20 77 65 72 65 20 6e 6f 74 0a 20 20 20 20 2a  t were not.    *
371f0 2a 20 20 20 20 20 20 73 69 62 6c 69 6e 67 73 20  *      siblings 
37200 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
37210 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 54  on was called. T
37220 68 65 73 65 20 68 61 76 65 20 61 6c 72 65 61 64  hese have alread
37230 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62 65  y.    **      be
37240 65 6e 20 73 65 74 2e 20 57 65 20 64 6f 6e 27 74  en set. We don't
37250 20 6e 65 65 64 20 74 6f 20 77 6f 72 72 79 20 61   need to worry a
37260 62 6f 75 74 20 6f 6c 64 20 73 69 62 6c 69 6e 67  bout old sibling
37270 73 20 74 68 61 74 20 77 65 72 65 0a 20 20 20 20  s that were.    
37280 2a 2a 20 20 20 20 20 20 6d 6f 76 65 64 20 74 6f  **      moved to
37290 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2d   the free-list -
372a0 20 74 68 65 20 66 72 65 65 50 61 67 65 28 29 20   the freePage() 
372b0 63 6f 64 65 20 68 61 73 20 74 61 6b 65 6e 20 63  code has taken c
372c0 61 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  are.    **      
372d0 6f 66 20 74 68 6f 73 65 2e 0a 20 20 20 20 2a 2a  of those..    **
372e0 0a 20 20 20 20 2a 2a 20 20 20 32 29 20 54 68 65  .    **   2) The
372f0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
37300 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ries associated 
37310 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20 6f  with the first o
37320 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 20  verflow.    **  
37330 20 20 20 20 70 61 67 65 20 69 6e 20 61 6e 79 20      page in any 
37340 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 73 20  overflow chains 
37350 75 73 65 64 20 62 79 20 6e 65 77 20 64 69 76 69  used by new divi
37360 64 65 72 20 63 65 6c 6c 73 2e 20 54 68 65 73 65  der cells. These
37370 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 68 61   .    **      ha
37380 76 65 20 61 6c 73 6f 20 61 6c 72 65 61 64 79 20  ve also already 
37390 62 65 65 6e 20 74 61 6b 65 6e 20 63 61 72 65 20  been taken care 
373a0 6f 66 20 62 79 20 74 68 65 20 69 6e 73 65 72 74  of by the insert
373b0 43 65 6c 6c 28 29 20 63 6f 64 65 2e 0a 20 20 20  Cell() code..   
373c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 33 29 20   **.    **   3) 
373d0 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  If the sibling p
373e0 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ages are not lea
373f0 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ves, then the ch
37400 69 6c 64 20 70 61 67 65 73 20 6f 66 0a 20 20 20  ild pages of.   
37410 20 2a 2a 20 20 20 20 20 20 63 65 6c 6c 73 20 73   **      cells s
37420 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 73 69 62  tored on the sib
37430 6c 69 6e 67 20 70 61 67 65 73 20 6d 61 79 20 6e  ling pages may n
37440 65 65 64 20 74 6f 20 62 65 20 75 70 64 61 74 65  eed to be update
37450 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
37460 20 20 20 34 29 20 49 66 20 74 68 65 20 73 69 62     4) If the sib
37470 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e  ling pages are n
37480 6f 74 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b  ot internal intk
37490 65 79 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20 61  ey nodes, then a
374a0 6e 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f  ny.    **      o
374b0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 75 73  verflow pages us
374c0 65 64 20 62 79 20 74 68 65 73 65 20 63 65 6c 6c  ed by these cell
374d0 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65  s may need to be
374e0 20 75 70 64 61 74 65 64 0a 20 20 20 20 2a 2a 20   updated.    ** 
374f0 20 20 20 20 20 28 69 6e 74 65 72 6e 61 6c 20 69       (internal i
37500 6e 74 6b 65 79 20 6e 6f 64 65 73 20 6e 65 76 65  ntkey nodes neve
37510 72 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65  r contain pointe
37520 72 73 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  rs to overflow p
37530 61 67 65 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ages)..    **.  
37540 20 20 2a 2a 20 20 20 35 29 20 49 66 20 74 68 65    **   5) If the
37550 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61   sibling pages a
37560 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74  re not leaves, t
37570 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  hen the pointer-
37580 6d 61 70 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  map.    **      
37590 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
375a0 72 69 67 68 74 2d 63 68 69 6c 64 20 70 61 67 65  right-child page
375b0 73 20 6f 66 20 65 61 63 68 20 73 69 62 6c 69 6e  s of each siblin
375c0 67 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a  g may need.    *
375d0 2a 20 20 20 20 20 20 74 6f 20 62 65 20 75 70 64  *      to be upd
375e0 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ated..    **.   
375f0 20 2a 2a 20 43 61 73 65 73 20 31 20 61 6e 64 20   ** Cases 1 and 
37600 32 20 61 72 65 20 64 65 61 6c 74 20 77 69 74 68  2 are dealt with
37610 20 61 62 6f 76 65 20 62 79 20 6f 74 68 65 72 20   above by other 
37620 63 6f 64 65 2e 20 54 68 65 20 6e 65 78 74 0a 20  code. The next. 
37630 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 64 65 61 6c     ** block deal
37640 73 20 77 69 74 68 20 63 61 73 65 73 20 33 20 61  s with cases 3 a
37650 6e 64 20 34 20 61 6e 64 20 74 68 65 20 6f 6e 65  nd 4 and the one
37660 20 61 66 74 65 72 20 74 68 61 74 2c 20 63 61 73   after that, cas
37670 65 20 35 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a  e 5. Since.    *
37680 2a 20 73 65 74 74 69 6e 67 20 61 20 70 6f 69 6e  * setting a poin
37690 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 69 73  ter map entry is
376a0 20 61 20 72 65 6c 61 74 69 76 65 6c 79 20 65 78   a relatively ex
376b0 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f  pensive operatio
376c0 6e 2c 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 63  n, this.    ** c
376d0 6f 64 65 20 6f 6e 6c 79 20 73 65 74 73 20 70 6f  ode only sets po
376e0 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
376f0 73 20 66 6f 72 20 63 68 69 6c 64 20 6f 72 20 6f  s for child or o
37700 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68  verflow pages th
37710 61 74 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 61  at have.    ** a
37720 63 74 75 61 6c 6c 79 20 6d 6f 76 65 64 20 62 65  ctually moved be
37730 74 77 65 65 6e 20 70 61 67 65 73 2e 20 20 2a 2f  tween pages.  */
37740 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
37750 65 77 20 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a 20  ew = apNew[0];. 
37760 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64     MemPage *pOld
37770 20 3d 20 61 70 43 6f 70 79 5b 30 5d 3b 0a 20 20   = apCopy[0];.  
37780 20 20 69 6e 74 20 6e 4f 76 65 72 66 6c 6f 77 20    int nOverflow 
37790 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  = pOld->nOverflo
377a0 77 3b 0a 20 20 20 20 69 6e 74 20 69 4e 65 78 74  w;.    int iNext
377b0 4f 6c 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c  Old = pOld->nCel
377c0 6c 20 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  l + nOverflow;. 
377d0 20 20 20 69 6e 74 20 69 4f 76 65 72 66 6c 6f 77     int iOverflow
377e0 20 3d 20 28 6e 4f 76 65 72 66 6c 6f 77 20 3f 20   = (nOverflow ? 
377f0 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c 5b 30 5d 20  pOld->aiOvfl[0] 
37800 3a 20 2d 31 29 3b 0a 20 20 20 20 6a 20 3d 20 30  : -1);.    j = 0
37810 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37830 20 43 75 72 72 65 6e 74 20 27 6f 6c 64 27 20 73   Current 'old' s
37840 69 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20  ibling page */. 
37850 20 20 20 6b 20 3d 20 30 3b 20 20 20 20 20 20 20     k = 0;       
37860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37870 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
37880 20 27 6e 65 77 27 20 73 69 62 6c 69 6e 67 20 70   'new' sibling p
37890 61 67 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  age */.    for(i
378a0 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
378b0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 44  ){.      int isD
378c0 69 76 69 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  ivider = 0;.    
378d0 20 20 77 68 69 6c 65 28 20 69 3d 3d 69 4e 65 78    while( i==iNex
378e0 74 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20  tOld ){.        
378f0 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20 74 68 65  /* Cell i is the
37900 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c   cell immediatel
37910 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
37920 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6f 6c 64  last cell on old
37930 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 62 6c  .        ** sibl
37940 69 6e 67 20 70 61 67 65 20 6a 2e 20 49 66 20 74  ing page j. If t
37950 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
37960 6e 6f 74 20 6c 65 61 66 20 70 61 67 65 73 20 6f  not leaf pages o
37970 66 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  f an.        ** 
37980 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c 20 74  intkey b-tree, t
37990 68 65 6e 20 63 65 6c 6c 20 69 20 77 61 73 20 61  hen cell i was a
379a0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 2a   divider cell. *
379b0 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
379c0 28 20 6a 2b 31 20 3c 20 41 72 72 61 79 53 69 7a  ( j+1 < ArraySiz
379d0 65 28 61 70 43 6f 70 79 29 20 29 3b 0a 20 20 20  e(apCopy) );.   
379e0 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 2b 31       assert( j+1
379f0 20 3c 20 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 20   < nOld );.     
37a00 20 20 20 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79     pOld = apCopy
37a10 5b 2b 2b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69  [++j];.        i
37a20 4e 65 78 74 4f 6c 64 20 3d 20 69 20 2b 20 21 6c  NextOld = i + !l
37a30 65 61 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e  eafData + pOld->
37a40 6e 43 65 6c 6c 20 2b 20 70 4f 6c 64 2d 3e 6e 4f  nCell + pOld->nO
37a50 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20  verflow;.       
37a60 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72   if( pOld->nOver
37a70 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
37a80 20 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 4f    nOverflow = pO
37a90 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ld->nOverflow;. 
37aa0 20 20 20 20 20 20 20 20 20 69 4f 76 65 72 66 6c           iOverfl
37ab0 6f 77 20 3d 20 69 20 2b 20 21 6c 65 61 66 44 61  ow = i + !leafDa
37ac0 74 61 20 2b 20 70 4f 6c 64 2d 3e 61 69 4f 76 66  ta + pOld->aiOvf
37ad0 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  l[0];.        }.
37ae0 20 20 20 20 20 20 20 20 69 73 44 69 76 69 64 65          isDivide
37af0 72 20 3d 20 21 6c 65 61 66 44 61 74 61 3b 20 20  r = !leafData;  
37b00 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
37b10 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77  assert(nOverflow
37b20 3e 30 20 7c 7c 20 69 4f 76 65 72 66 6c 6f 77 3c  >0 || iOverflow<
37b30 69 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  i );.      asser
37b40 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 32 20 7c 7c  t(nOverflow<2 ||
37b50 20 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c 5b 30 5d   pOld->aiOvfl[0]
37b60 3d 3d 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c 5b 31  ==pOld->aiOvfl[1
37b70 5d 2d 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ]-1);.      asse
37b80 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 33 20 7c  rt(nOverflow<3 |
37b90 7c 20 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c 5b 31  | pOld->aiOvfl[1
37ba0 5d 3d 3d 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c 5b  ]==pOld->aiOvfl[
37bb0 32 5d 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28  2]-1);.      if(
37bc0 20 69 3d 3d 69 4f 76 65 72 66 6c 6f 77 20 29 7b   i==iOverflow ){
37bd0 0a 20 20 20 20 20 20 20 20 69 73 44 69 76 69 64  .        isDivid
37be0 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  er = 1;.        
37bf0 69 66 28 20 28 2d 2d 6e 4f 76 65 72 66 6c 6f 77  if( (--nOverflow
37c00 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  )>0 ){.         
37c10 20 69 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20   iOverflow++;.  
37c20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
37c30 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 63 6e  .      if( i==cn
37c40 74 4e 65 77 5b 6b 5d 20 29 7b 0a 20 20 20 20 20  tNew[k] ){.     
37c50 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20     /* Cell i is 
37c60 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61  the cell immedia
37c70 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
37c80 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20  he last cell on 
37c90 6e 65 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  new.        ** s
37ca0 69 62 6c 69 6e 67 20 70 61 67 65 20 6b 2e 20 49  ibling page k. I
37cb0 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  f the siblings a
37cc0 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61 67 65  re not leaf page
37cd0 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 20 20  s of an.        
37ce0 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65  ** intkey b-tree
37cf0 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20 69 73  , then cell i is
37d00 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e   a divider cell.
37d10 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65    */.        pNe
37d20 77 20 3d 20 61 70 4e 65 77 5b 2b 2b 6b 5d 3b 0a  w = apNew[++k];.
37d30 20 20 20 20 20 20 20 20 69 66 28 20 21 6c 65 61          if( !lea
37d40 66 44 61 74 61 20 29 20 63 6f 6e 74 69 6e 75 65  fData ) continue
37d50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
37d60 61 73 73 65 72 74 28 20 6a 3c 6e 4f 6c 64 20 29  assert( j<nOld )
37d70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
37d80 6b 3c 6e 4e 65 77 20 29 3b 0a 0a 20 20 20 20 20  k<nNew );..     
37d90 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20   /* If the cell 
37da0 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 64  was originally d
37db0 69 76 69 64 65 72 20 63 65 6c 6c 20 28 61 6e 64  ivider cell (and
37dc0 20 69 73 20 6e 6f 74 20 6e 6f 77 29 20 6f 72 0a   is not now) or.
37dd0 20 20 20 20 20 20 2a 2a 20 61 6e 20 6f 76 65 72        ** an over
37de0 66 6c 6f 77 20 63 65 6c 6c 2c 20 6f 72 20 69 66  flow cell, or if
37df0 20 74 68 65 20 63 65 6c 6c 20 77 61 73 20 6c 6f   the cell was lo
37e00 63 61 74 65 64 20 6f 6e 20 61 20 64 69 66 66 65  cated on a diffe
37e10 72 65 6e 74 20 73 69 62 6c 69 6e 67 0a 20 20 20  rent sibling.   
37e20 20 20 20 2a 2a 20 70 61 67 65 20 62 65 66 6f 72     ** page befor
37e30 65 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c  e the balancing,
37e40 20 74 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65   then the pointe
37e50 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61 73  r map entries as
37e60 73 6f 63 69 61 74 65 64 0a 20 20 20 20 20 20 2a  sociated.      *
37e70 2a 20 77 69 74 68 20 61 6e 79 20 63 68 69 6c 64  * with any child
37e80 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   or overflow pag
37e90 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70  es need to be up
37ea0 64 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20  dated.  */.     
37eb0 20 69 66 28 20 69 73 44 69 76 69 64 65 72 20 7c   if( isDivider |
37ec0 7c 20 70 4f 6c 64 2d 3e 70 67 6e 6f 21 3d 70 4e  | pOld->pgno!=pN
37ed0 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  ew->pgno ){.    
37ee0 20 20 20 20 69 66 28 20 21 6c 65 61 66 43 6f 72      if( !leafCor
37ef0 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  rection ){.     
37f00 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
37f10 42 74 2c 20 67 65 74 34 62 79 74 65 28 61 70 43  Bt, get4byte(apC
37f20 65 6c 6c 5b 69 5d 29 2c 20 50 54 52 4d 41 50 5f  ell[i]), PTRMAP_
37f30 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e  BTREE, pNew->pgn
37f40 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  o, &rc);.       
37f50 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   }.        if( s
37f60 7a 43 65 6c 6c 5b 69 5d 3e 70 4e 65 77 2d 3e 6d  zCell[i]>pNew->m
37f70 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  inLocal ){.     
37f80 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76       ptrmapPutOv
37f90 66 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65  flPtr(pNew, apCe
37fa0 6c 6c 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20  ll[i], &rc);.   
37fb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
37fc0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 6c     }..    if( !l
37fd0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b  eafCorrection ){
37fe0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
37ff0 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20  i<nNew; i++){.  
38000 20 20 20 20 20 20 75 33 32 20 6b 65 79 20 3d 20        u32 key = 
38010 67 65 74 34 62 79 74 65 28 26 61 70 4e 65 77 5b  get4byte(&apNew[
38020 69 5d 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20  i]->aData[8]);. 
38030 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
38040 28 70 42 74 2c 20 6b 65 79 2c 20 50 54 52 4d 41  (pBt, key, PTRMA
38050 50 5f 42 54 52 45 45 2c 20 61 70 4e 65 77 5b 69  P_BTREE, apNew[i
38060 5d 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  ]->pgno, &rc);. 
38070 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69       }.    }..#i
38080 66 20 30 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  f 0.    /* The p
38090 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28  trmapCheckPages(
380a0 29 20 63 6f 6e 74 61 69 6e 73 20 61 73 73 65 72  ) contains asser
380b0 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
380c0 68 61 74 20 76 65 72 69 66 79 20 74 68 61 74 0a  hat verify that.
380d0 20 20 20 20 2a 2a 20 61 6c 6c 20 70 6f 69 6e 74      ** all point
380e0 65 72 20 6d 61 70 20 70 61 67 65 73 20 61 72 65  er map pages are
380f0 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20   set correctly. 
38100 54 68 69 73 20 69 73 20 68 65 6c 70 66 75 6c 20  This is helpful 
38110 77 68 69 6c 65 20 0a 20 20 20 20 2a 2a 20 64 65  while .    ** de
38120 62 75 67 67 69 6e 67 2e 20 54 68 69 73 20 69 73  bugging. This is
38130 20 75 73 75 61 6c 6c 79 20 64 69 73 61 62 6c 65   usually disable
38140 64 20 62 65 63 61 75 73 65 20 61 20 63 6f 72 72  d because a corr
38150 75 70 74 20 64 61 74 61 62 61 73 65 20 6d 61 79  upt database may
38160 0a 20 20 20 20 2a 2a 20 63 61 75 73 65 20 61 6e  .    ** cause an
38170 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
38180 65 6e 74 20 74 6f 20 66 61 69 6c 2e 20 20 2a 2f  ent to fail.  */
38190 0a 20 20 20 20 70 74 72 6d 61 70 43 68 65 63 6b  .    ptrmapCheck
381a0 50 61 67 65 73 28 61 70 4e 65 77 2c 20 6e 4e 65  Pages(apNew, nNe
381b0 77 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 43 68  w);.    ptrmapCh
381c0 65 63 6b 50 61 67 65 73 28 26 70 50 61 72 65 6e  eckPages(&pParen
381d0 74 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20  t, 1);.#endif.  
381e0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  }..  assert( pPa
381f0 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  rent->isInit );.
38200 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
38210 45 3a 20 66 69 6e 69 73 68 65 64 3a 20 6f 6c 64  E: finished: old
38220 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73  =%d new=%d cells
38230 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
38240 20 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43    nOld, nNew, nC
38250 65 6c 6c 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  ell));..  /*.  *
38260 2a 20 43 6c 65 61 6e 75 70 20 62 65 66 6f 72 65  * Cleanup before
38270 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f   returning..  */
38280 0a 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70  .balance_cleanup
38290 3a 0a 20 20 73 71 6c 69 74 65 33 53 63 72 61 74  :.  sqlite3Scrat
382a0 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a  chFree(apCell);.
382b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
382c0 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c  d; i++){.    rel
382d0 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  easePage(apOld[i
382e0 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  ]);.  }.  for(i=
382f0 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b  0; i<nNew; i++){
38300 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
38310 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a  (apNew[i]);.  }.
38320 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
38330 23 69 66 20 64 65 66 69 6e 65 64 28 5f 4d 53 43  #if defined(_MSC
38340 5f 56 45 52 29 20 26 26 20 5f 4d 53 43 5f 56 45  _VER) && _MSC_VE
38350 52 20 3e 3d 20 31 37 30 30 20 26 26 20 64 65 66  R >= 1700 && def
38360 69 6e 65 64 28 5f 4d 5f 41 52 4d 29 0a 23 70 72  ined(_M_ARM).#pr
38370 61 67 6d 61 20 6f 70 74 69 6d 69 7a 65 28 22 22  agma optimize(""
38380 2c 20 6f 6e 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f  , on).#endif.../
38390 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
383a0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
383b0 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  n the root page 
383c0 6f 66 20 61 20 62 2d 74 72 65 65 20 73 74 72 75  of a b-tree stru
383d0 63 74 75 72 65 20 69 73 0a 2a 2a 20 6f 76 65 72  cture is.** over
383e0 66 75 6c 6c 20 28 68 61 73 20 6f 6e 65 20 6f 72  full (has one or
383f0 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
38400 61 67 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  ages)..**.** A n
38410 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 69 73  ew child page is
38420 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
38430 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
38440 68 65 20 63 75 72 72 65 6e 74 20 72 6f 6f 74 0a  he current root.
38450 2a 2a 20 70 61 67 65 2c 20 69 6e 63 6c 75 64 69  ** page, includi
38460 6e